1. Kubernetes 1.32高可用集群架构设计
1.1 高可用核心组件解析
Kubernetes高可用集群的核心在于控制平面的冗余设计。在1.32版本中,etcd集群、kube-apiserver、kube-controller-manager和kube-scheduler都需要实现多节点部署。我建议采用奇数节点部署etcd集群(通常3或5节点),这是因为etcd使用Raft共识算法,奇数节点可以避免脑裂问题。
控制平面组件部署方式有两种典型模式:
- 堆叠式(Stacked):每个节点同时运行etcd和控制平面组件
- 外部etcd:etcd集群独立于控制平面部署
对于生产环境,我推荐使用外部etcd模式。这种架构虽然硬件成本略高,但具有更好的隔离性和可维护性。以下是三种典型节点配置的对比:
| 节点类型 | 推荐数量 | 关键组件 | 资源要求 |
|---|---|---|---|
| 控制平面节点 | 3 | kube-apiserver等控制平面组件 | 4核CPU/16GB内存 |
| etcd节点 | 3 | etcd集群 | 4核CPU/16GB内存 |
| Worker节点 | ≥2 | kubelet/kube-proxy | 根据工作负载调整 |
1.2 网络拓扑规划要点
网络设计是高可用集群的基础。需要特别注意:
- 节点间通信:所有节点间需要双向互通
- Pod网络:选择成熟的CNI插件(Calico/Flannel等)
- Service网络:不要与物理网络重叠
- 节点IP:建议使用静态IP或可靠的DHCP保留
重要提示:生产环境务必避免使用192.168.0.0/16这类常见内网段,建议使用10.0.0.0/8中的特定子网。
2. 前置环境准备
2.1 系统要求与优化
我推荐使用Ubuntu 22.04 LTS或CentOS Stream 9作为主机系统。以下是必须完成的系统配置:
# 禁用交换分区(所有节点) sudo swapoff -a sudo sed -i '/ swap / s/^/#/' /etc/fstab # 设置正确的时区(亚洲上海) sudo timedatectl set-timezone Asia/Shanghai # 加载内核模块 cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf overlay br_netfilter EOF # 配置内核参数 cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 EOF sudo sysctl --system2.2 容器运行时安装
Kubernetes 1.32已移除对Docker的直接支持,建议使用containerd:
# 安装containerd sudo apt-get update && sudo apt-get install -y containerd # 生成默认配置 sudo mkdir -p /etc/containerd containerd config default | sudo tee /etc/containerd/config.toml # 修改配置使用systemd cgroup驱动 sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml # 重启服务 sudo systemctl restart containerd sudo systemctl enable containerd3. 集群部署实战
3.1 使用kubeadm初始化集群
在主控制节点执行初始化:
sudo kubeadm init \ --control-plane-endpoint "LOAD_BALANCER_DNS:6443" \ --upload-certs \ --pod-network-cidr=10.244.0.0/16 \ --service-cidr=10.96.0.0/12 \ --image-repository registry.aliyuncs.com/google_containers关键参数说明:
--control-plane-endpoint:负载均衡器地址(高可用关键)--upload-certs:自动分发证书--image-repository:使用国内镜像源加速
初始化完成后,按照提示配置kubectl:
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config3.2 加入其他控制平面节点
使用kubeadm生成的join命令加入其他控制节点:
kubeadm join LOAD_BALANCER_DNS:6443 \ --token <token> \ --discovery-token-ca-cert-hash sha256:<hash> \ --control-plane \ --certificate-key <key>3.3 网络插件安装
推荐使用Calico网络插件:
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml验证网络插件状态:
kubectl get pods -n kube-system -l k8s-app=calico-node4. 高可用验证与调优
4.1 集群健康检查
使用以下命令验证集群状态:
# 查看节点状态 kubectl get nodes -o wide # 检查核心组件状态 kubectl get pods -n kube-system # 详细集群信息 kubectl cluster-info dump4.2 负载均衡配置
建议使用HAProxy或Nginx作为API Server的负载均衡器。以下是HAProxy配置示例:
frontend k8s-api bind *:6443 mode tcp option tcplog default_backend k8s-api backend k8s-api mode tcp option tcp-check balance roundrobin server k8s-master-1 192.168.1.101:6443 check server k8s-master-2 192.168.1.102:6443 check server k8s-master-3 192.168.1.103:6443 check4.3 关键参数调优
在/etc/kubernetes/manifests下的组件配置中添加以下参数:
# kube-apiserver优化 - --max-requests-inflight=1500 - --max-mutating-requests-inflight=500 - --event-ttl=1h # kube-controller-manager优化 - --node-monitor-period=2s - --node-monitor-grace-period=16s - --pod-eviction-timeout=30s5. 生产环境注意事项
5.1 证书管理
Kubernetes集群使用大量证书,需要定期维护:
- 检查证书过期时间:
kubeadm certs check-expiration- 更新证书(在控制节点执行):
kubeadm certs renew all5.2 备份与恢复
必须定期备份etcd数据:
# 创建快照 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 /data/etcd-snapshot-$(date +%Y%m%d).db恢复etcd快照:
kubeadm reset ETCDCTL_API=3 etcdctl snapshot restore /data/etcd-snapshot.db \ --data-dir /var/lib/etcd5.3 监控方案
推荐部署Prometheus-Operator监控套件:
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts helm install kube-prometheus prometheus-community/kube-prometheus-stack \ --namespace monitoring \ --create-namespace6. 常见问题排查
6.1 节点NotReady问题
排查步骤:
- 检查kubelet状态:
systemctl status kubelet - 查看kubelet日志:
journalctl -u kubelet -f - 验证网络插件:
kubectl get pods -n kube-system - 检查节点资源:
free -h和df -h
6.2 Pod一直处于Pending状态
可能原因及解决方案:
- 资源不足:
kubectl describe node查看资源分配 - 没有合适节点:检查节点标签和Pod的nodeSelector
- PV问题:检查StorageClass和PVC状态
6.3 网络连通性问题
诊断方法:
# 检查Calico组件 kubectl get pods -n kube-system -l k8s-app=calico-node # 测试Pod间通信 kubectl run -it --rm --image=alpine test -- sh ping <其他PodIP> # 检查网络策略 kubectl get networkpolicy -A7. 版本升级策略
7.1 升级前准备
- 备份所有关键数据(etcd、应用数据)
- 阅读官方Release Notes
- 在测试环境验证升级流程
7.2 分阶段升级步骤
- 先升级kubeadm:
sudo apt-get update && sudo apt-get install -y kubeadm=1.32.x-00- 升级控制平面:
sudo kubeadm upgrade apply v1.32.x- 升级kubelet和kubectl:
sudo apt-get update && sudo apt-get install -y kubelet=1.32.x-00 kubectl=1.32.x-00 sudo systemctl daemon-reload sudo systemctl restart kubelet- 最后升级worker节点:
sudo kubeadm upgrade node