Kubernetes高可用集群部署一直是企业级容器编排平台建设的核心课题。随着Kubernetes 1.32版本的发布,集群部署方案又有了新的优化空间。这个系列教程的第六部分,将重点解决生产环境中控制平面组件的高可用配置问题。
在实际生产环境中,单Master节点的Kubernetes集群存在明显的单点故障风险。当API Server、Controller Manager或Scheduler等核心组件出现故障时,整个集群将面临服务中断的风险。本教程将详细演示如何通过多Master节点部署,结合负载均衡和etcd集群配置,构建真正具备容错能力的Kubernetes控制平面。
对于生产级Kubernetes高可用集群,建议至少准备3台符合以下规格的服务器作为Master节点:
同时需要准备:
注意:所有节点需要确保时间同步(建议部署NTP服务),且主机名、MAC地址和product_uuid在集群内唯一。
推荐使用以下操作系统之一:
需要完成的通用预配置:
bash复制# 关闭swap
sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
# 关闭SELinux(仅RHEL/CentOS)
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
# 加载内核模块
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
# 配置sysctl参数
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
sudo sysctl --system
Kubernetes 1.32支持两种高可用控制平面部署模式:
Stacked etcd拓扑(推荐):
外部etcd集群:
本教程采用Stacked etcd拓扑,这是目前社区推荐的主流方案。
高可用集群需要为API Server配置负载均衡,建议方案:
这里以HAProxy为例展示配置:
bash复制frontend k8s-api
bind *:6443
mode tcp
option tcplog
default_backend k8s-api-backend
backend k8s-api-backend
mode tcp
option tcp-check
balance roundrobin
server master1 192.168.1.101:6443 check
server master2 192.168.1.102:6443 check
server master3 192.168.1.103:6443 check
重要:负载均衡器本身也需要高可用,可以通过VRRP协议(如keepalived)实现主备切换。
Kubernetes 1.32推荐使用containerd作为容器运行时:
bash复制# 安装containerd
sudo apt-get update && sudo apt-get install -y containerd
# 配置containerd
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
# 修改cgroup驱动为systemd
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
# 重启服务
sudo systemctl restart containerd
sudo systemctl enable containerd
在所有节点上执行:
bash复制sudo apt-get update && sudo apt-get install -y apt-transport-https ca-certificates curl
sudo curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.32/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
sudo echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.32/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
在第一个Master节点上执行:
bash复制sudo kubeadm init \
--control-plane-endpoint "LOAD_BALANCER_DNS:LOAD_BALANCER_PORT" \
--upload-certs \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12 \
--kubernetes-version v1.32.0
关键参数说明:
--control-plane-endpoint: 负载均衡器的地址和端口--upload-certs: 自动上传证书供其他Master节点使用--pod-network-cidr: 需要与后续安装的CNI插件匹配初始化成功后,按照提示配置kubectl:
bash复制mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
使用第一个Master节点初始化时输出的命令加入其他Master节点:
bash复制sudo kubeadm join LOAD_BALANCER_DNS:LOAD_BALANCER_PORT \
--token <token> \
--discovery-token-ca-cert-hash sha256:<hash> \
--control-plane \
--certificate-key <key>
在所有Master节点配置完成后,执行:
bash复制kubectl get nodes
kubectl get pods -n kube-system
应该看到所有Master节点状态为Ready,并且核心组件(apiserver、controller-manager、scheduler)有多个副本运行在不同的节点上。
高可用集群需要可靠的CNI插件,这里以Calico为例:
bash复制kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml
部署完成后验证:
bash复制kubectl get pods -n kube-system -l k8s-app=calico-node
修改etcd的Pod manifest(通常在/etc/kubernetes/manifests/etcd.yaml):
yaml复制spec:
containers:
- command:
- etcd
- --heartbeat-interval=100
- --election-timeout=500
- --quota-backend-bytes=8589934592 # 8GB
- --max-request-bytes=15728640
- --snapshot-count=10000
修改kube-apiserver.yaml:
yaml复制spec:
containers:
- command:
- kube-apiserver
- --default-not-ready-toleration-seconds=30
- --default-unreachable-toleration-seconds=30
- --max-mutating-requests-inflight=600
- --max-requests-inflight=1200
bash复制sudo systemctl stop kubelet
bash复制kubectl get nodes
kubectl get pods -n kube-system -o wide
bash复制sudo iptables -A INPUT -p tcp --dport 6443 -j DROP
证书管理:
kubeadm certs check-expiration检查证书有效期kubeadm certs renew all备份策略:
bash复制ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
snapshot save snapshot.db
升级策略:
kubeadm upgrade plan和kubeadm upgrade apply命令现象:执行kubeadm join时报错"Unable to connect to the server"
排查步骤:
bash复制telnet LOAD_BALANCER_IP 6443
bash复制kubeadm token list
bash复制sudo iptables -L -n
检查命令:
bash复制ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
endpoint health
常见修复方法:
查看日志:
bash复制journalctl -u kubelet -f
kubectl logs -n kube-system kube-apiserver-master1
典型问题: