本文档风哥主要介绍Linux系统大规模Kubernetes集群部署与核心组件配置,包括Kubernetes基础概念、K8s集群架构、核心组件介绍、K8s集群安装、核心组件配置、网络配置以及实战案例等内容,风哥教程参考Kubernetes官方文档、Linux官方文档Containers and virtual machines等内容,适合系统管理员在生产环境中使用。
Part01-基础概念与理论知识
1.1 Kubernetes基础概念
Kubernetes(简称K8s)是一个开源的容器编排平台,用于自动化容器的部署、扩展和管理。Kubernetes提供了服务发现、负载均衡、自动扩缩容、存储编排等功能,学习交流加群风哥QQ113257174使容器应用可以在集群中高效运行。
- Pod:容器的最小部署单位,可以包含一个或多个容器
- Service:定义了Pod的访问方式,提供负载均衡
- Deployment:管理Pod的副本数,实现滚动更新
- StatefulSet:管理有状态应用,保证Pod的唯一性和顺序性
- ConfigMap:存储配置信息
- Secret:存储敏感信息
- PersistentVolume:持久化存储
- Namespace:隔离不同的资源
1.2 K8s集群架构
Kubernetes集群由控制平面和计算节点组成:
– 控制平面(Control Plane):负责集群管理和决策
– 计算节点(Worker Node):负责运行容器应用
– etcd:分布式键值存储,存储集群状态
– API Server:集群的API入口
– Scheduler:负责Pod的调度
– Controller Manager:管理集群控制器
– Kubelet:运行在每个节点上,管理容器
– Kube-proxy:网络代理,负责服务发现和负载均衡
# 集群类型
– 单节点集群:用于开发和测试
– 多节点集群:用于生产环境
– 高可用集群:多控制平面节点,提高可靠性
1.3 核心组件介绍
Kubernetes的核心组件:
- etcd:分布式键值存储,存储集群状态和配置信息
- API Server:集群的API入口,处理所有的API请求
- Scheduler:负责Pod的调度,根据资源需求和约束条件选择节点
- Controller Manager:管理集群控制器,如Deployment、StatefulSet等
- Kubelet:运行在每个节点上,管理容器的生命周期
- Kube-proxy:网络代理,负责服务发现和负载均衡
- Container Runtime:容器运行时,如Docker、containerd等
Part02-生产环境规划与建议
2.1 集群架构设计
生产环境Kubernetes集群架构设计要点:
– 控制平面节点:3-5个,确保高可用性
– 计算节点:根据应用需求确定,支持水平扩展
– 节点分布:跨可用区部署,提高可靠性
# 网络架构
– 服务网络:用于Pod间通信
– Pod网络:用于Pod内部通信
– 外部网络:用于服务暴露
# 存储架构
– 本地存储:适合无状态应用
– 共享存储:适合有状态应用,如NFS、Ceph
– 存储类:使用StorageClass动态分配存储
2.2 硬件要求
生产环境硬件要求:
– 控制平面节点:至少4核CPU,8GB内存,100GB存储
– 计算节点:至少2核CPU,4GB内存,50GB存储
– 存储:SSD存储,提高I/O性能
– 网络:万兆网卡,确保网络带宽
# 控制平面节点要求
– 更高的CPU和内存配置:处理集群管理任务
– 冗余电源和网络:提高可靠性
– 跨可用区部署:确保高可用性
# 计算节点要求
– 根据应用需求配置:不同应用对资源要求不同
– 可扩展性:支持水平扩展
– 监控:实时监控节点状态
2.3 网络设计
生产环境网络设计要点:
– 管理网络:用于集群管理通信
– 业务网络:用于Pod间通信
– 外部网络:用于服务暴露
# 网络配置
– 静态IP:所有节点使用静态IP
– 网络隔离:使用VLAN隔离不同网络
– 网络冗余:多网卡绑定
– 网络监控:监控网络状态
# 网络插件
– Calico:基于BGP的网络插件,性能好,功能丰富
– Flannel:简单易用,适合初学者
– Cilium:基于eBPF的网络插件,性能优异
– Weave Net:简单易用,支持多集群网络
Part03-生产环境项目实施方案
3.1 K8s集群安装
3.1.1 使用kubeadm安装K8s
$ sudo dnf install -y yum-utils device-mapper-persistent-data lvm2
# 添加Docker仓库
$ sudo yum-config-manager –add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 安装Docker
$ sudo dnf install -y docker-ce docker-ce-cli containerd.io
# 启动Docker服务
$ sudo systemctl start docker
$ sudo systemctl enable docker
# 添加Kubernetes仓库 # 在计算节点上执行加入命令 # 在控制平面节点上查看节点状态 # 备份etcd数据 # 查看etcd集群状态 # 查看API Server日志 # 配置API Server参数 # 查看Scheduler日志 # 配置Scheduler参数 # 查看Controller Manager日志 # 配置Controller Manager参数 # 查看Calico pods状态 # 查看网络状态 # 1. 配置负载均衡器 frontend kubernetes backend kubernetes-master-nodes # 2. 初始化第一个控制平面节点 # 3. 加入其他控制平面节点 # 4. 加入计算节点 # 5. 安装网络插件 # 6. 查看集群状态 # 1. 初始化控制平面节点 # 2. 配置kubectl # 3. 安装网络插件 # 4. 加入计算节点 # 5. 查看集群状态 # 6. 部署应用 # 7. 查看应用状态 $ kubectl get services # 1. 配置基础设施 # 2. 初始化控制平面节点 # 3. 加入其他控制平面节点 # 4. 加入计算节点 # 5. 安装网络插件 # 6. 安装存储插件 # 7. 安装监控插件 # 8. 安装日志插件 # 9. 查看集群状态 from PG视频:www.itpux.com Kubernetes集群最佳实践: ## 1. 节点不可用 ## 2. Pod调度失败 ## 3. 网络问题 ## 4. 存储问题 ## 5. 性能问题 风哥针对 Kubernetes集群性能调优建议: 风哥提示: 风哥提示: 本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
$ cat <3.1.2 添加计算节点
$ kubeadm token create –print-join-command
kubeadm join 192.168.1.101:6443 –token abcdef.0123456789abcdef –discovery-token-ca-cert-hash sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
$ sudo kubeadm join 192.168.1.101:6443 –token abcdef.0123456789abcdef –discovery-token-ca-cert-hash sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
master1 Ready control-plane 15m v1.27.0
worker1 Ready
worker2 Ready 3.2 核心组件配置
3.2.1 配置etcd
$ kubectl get pods -n kube-system | grep etcd
etcd-master1 1/1 Running 0 10m
$ ETCDCTL_API=3 etcdctl –endpoints=https://192.168.1.101:2379 –cacert=/etc/kubernetes/pki/etcd/ca.crt –cert=/etc/kubernetes/pki/etcd/server.crt –key=/etc/kubernetes/pki/etcd/server.key snapshot save /tmp/etcd-backup.db
$ ETCDCTL_API=3 etcdctl –endpoints=https://192.168.1.101:2379 –cacert=/etc/kubernetes/pki/etcd/ca.crt –cert=/etc/kubernetes/pki/etcd/server.crt –key=/etc/kubernetes/pki/etcd/server.key cluster-health
3.2.2 配置API Server
$ kubectl get pods -n kube-system | grep kube-apiserver
kube-apiserver-master1 1/1 Running 0 10m
$ kubectl logs kube-apiserver-master1 -n kube-system
$ sudo vim /etc/kubernetes/manifests/kube-apiserver.yaml
# 添加或修改参数
3.2.3 配置Scheduler
$ kubectl get pods -n kube-system | grep kube-scheduler
kube-scheduler-master1 1/1 Running 0 10m
$ kubectl logs kube-scheduler-master1 -n kube-system
$ sudo vim /etc/kubernetes/manifests/kube-scheduler.yaml
# 添加或修改参数
3.2.4 配置Controller Manager
$ kubectl get pods -n kube-system | grep kube-controller-manager
kube-controller-manager-master1 1/1 Running 0 10m
$ kubectl logs kube-controller-manager-master1 -n kube-system
$ sudo vim /etc/kubernetes/manifests/kube-controller-manager.yaml
# 添加或修改参数
3.3 网络配置
3.3.1 配置Calico网络
$ kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
$ kubectl get pods -n calico-system
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-7d75c484b5-8x8x8 1/1 Running 0 5m
calico-node-2q4x2 1/1 Running 0 5m
calico-node-5b678 1/1 Running 0 5m
calico-node-7c89d 1/1 Running 0 5m
$ kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
master1 Ready control-plane 20m v1.27.0 192.168.1.101
worker1 Ready
worker2 Ready Part04-生产案例与实战讲解
4.1 高可用K8s集群案例
4.1.1 高可用K8s集群部署
# 环境:3个控制平面节点,3个计算节点
# 目标:部署高可用K8s集群
$ sudo dnf install -y haproxy
$ sudo vim /etc/haproxy/haproxy.cfg
bind *:6443
mode tcp
option tcplog
default_backend kubernetes-master-nodes
mode tcp
option tcplog
option tcp-check
balance roundrobin
server master1 192.168.1.101:6443 check fall 3 rise 2
server master2 192.168.1.102:6443 check fall 3 rise 2
server master3 192.168.1.103:6443 check fall 3 rise 2
$ sudo kubeadm init –control-plane-endpoint “192.168.1.100:6443” –pod-network-cidr=10.244.0.0/16
$ kubeadm join 192.168.1.100:6443 –token abcdef.0123456789abcdef –discovery-token-ca-cert-hash sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef –control-plane
$ kubeadm join 192.168.1.100:6443 –token abcdef.0123456789abcdef –discovery-token-ca-cert-hash sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
$ kubectl apply -f https://docs.projectcalico.org/manifests/calico.更多视频教程www.fgedu.net.cnyaml
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
master1 Ready control-plane 20m v1.27.0
master2 Ready control-plane 15m v1.27.0
master3 Ready control-plane 10m v1.27.0
worker1 Ready
worker2 Ready
worker3 Ready 4.2 多节点K8s集群案例
4.2.1 多节点K8s集群部署
# 环境:1个控制平面节点,5个计算节点
# 目标:部署多节点K8s集群
$ sud更多学习教程公众号风哥教程itpux_como kubeadm init –pod-network-cidr=10.244.0.0/16
$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
$ kubeadm join 192.168.1.101:6443 –token abcdef.0123456789abcdef –discovery-token-ca-cert-hash sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
master1 Ready control-plane 20m v1.27.0
worker1 Ready
worker2 Ready
worker3 Ready
worker4 Ready
worker5 Ready
$ kubectl create deployment nginx –image=nginx –replicas=5
$ kubectl expose deployment nginx –port=80 –type=NodePort
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-6799fc88d8-2q4x2 1/1 Running 0 5m
nginx-6799fc88d8-5b678 1/1 Running 0 5m
nginx-6799fc88d8-7c89d 1/1 Running 0 5m
nginx-6799fc88d8-9d765 1/1 Running 0 5m
nginx-6799fc88d8-bc543 1/1 Running 0 5m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1
nginx NodePort 10.100.123.45 4.3 生产级K8s集群案例
4.3.1 生产级K8s集群部署
# 环境:3个控制平面节点,10个计算节点
# 目标:部署生产级K8s集群
– 配置负载均衡器:使用HAProxy或Nginx
– 配置存储:使用Ceph或NFS
– 配置网络:使用Calico网络插件
$ sudo kubeadm init –control-plane-endpoint “loadbalancer:6443” –pod-network-cidr=10.244.0.0/16
$ kubeadm join loadbalancer:6443 –token abcdef.0123456789abcdef –discovery-token-ca-cert-hash sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef –control-plane
$ kubeadm join loadbalancer:6443 –token abcdef.0123456789abcdef –discovery-token-ca-cert-hash sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
$ kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
$ kubectl apply -f https://raw.githubusercontent.com/rook/rook/master/deploy/examples/ceph.yaml
$ helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
$ helm install prometheus prometheus-community/kube-prometheus-stack
$ helm repo add elastic https://helm.elastic.co
$ helm install elasticsearch elastic/elasticsearch
$ helm install kibana elastic/kibana
$ helm install filebeat elastic/filebeat
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
master1 Ready control-plane 30m v1.27.0
master2 Ready control-plane 25m v1.27.0
master3 Ready control-plane 20m v1.27.0
worker1 Ready
worker2 Ready
worker3 Ready
worker4 Ready
worker5 Ready
worker6 Ready
worker7 Ready
worker8 Ready
worker9 Ready
worker10 Ready Part05-风哥经验总结与分享
5.1 K8s集群最佳实践
5.2 常见问题与解决方案
– 原因:网络问题、资源不足、kubelet故障
– 解决方案:检查网络连接、增加节点资源、重启kubelet服务
– 原因:资源不足、节点亲和性约束、污点和容忍度
– 解决方案:增加节点资源、调整调度策略、修改亲和性约束
– 原因:网络插件配置错误、防火墙阻止、网络策略限制
– 解决方案:检查网络插件配置、关闭防火墙或开放端口、调整网络策略
– 原因:存储类配置错误、存储空间不足、存储插件故障
– 解决方案:检查存储类配置、增加存储空间、重启存储插件
– 原因:资源限制不当、Pod数量过多、网络带宽不足
– 解决方案:调整资源限制、优化Pod数量、增加网络带宽
5.3 性能调优建议
