在云原生技术栈中,Kubernetes高可用(HA)集群的部署一直是企业级应用落地的关键门槛。1.32版本对控制平面的稳定性进行了多项增强,特别是etcd的lease机制优化和kube-apiserver的流量控制改进,使得集群在节点故障时的恢复时间缩短了约40%。我最近在生产环境完成了三套跨AZ部署的1.32集群搭建,实测单个控制平面节点宕机时,服务切换可在2秒内完成。
高可用集群的核心在于消除单点故障。传统部署方式常采用"堆叠式"(Stacked)拓扑,即etcd与控制平面组件混部在同一节点组。这种方式虽然节省资源,但存在级联故障风险。更推荐的是"分离式"(External)部署,将etcd集群独立部署在专用节点上,通过至少3个节点组成仲裁组。根据CAP理论,这种设计在分区容忍性(P)和一致性(C)之间取得了更好平衡。
控制平面节点建议配置:
工作节点需要根据负载类型调整:
重要提示:所有节点必须禁用swap,否则kubelet会启动失败。通过
sudo swapoff -a临时关闭,并在/etc/fstab中注释swap行永久生效。
在/etc/sysctl.d/kubernetes.conf中添加:
bash复制net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
fs.file-max = 655360
vm.swappiness = 0
vm.overcommit_memory = 1
kernel.panic = 10
kernel.panic_on_oops = 1
加载配置后需重启服务:
bash复制sysctl --system
使用cfssl工具链生成CA证书:
bash复制cat > ca-config.json <<EOF
{
"signing": {
"default": {
"expiry": "8760h"
},
"profiles": {
"kubernetes": {
"usages": ["signing", "key encipherment", "server auth", "client auth"],
"expiry": "8760h"
}
}
}
}
EOF
生成etcd集群的peer证书时,需要特别注意SAN(Subject Alternative Name)字段必须包含:
创建最小权限的ServiceAccount:
yaml复制apiVersion: v1
kind: ServiceAccount
metadata:
name: cluster-admin-sa
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: cluster-admin-binding
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: cluster-admin-sa
namespace: kube-system
网络插件建议采用Calico的IP-in-IP模式,配置BGP对等体实现跨机柜通信:
bash复制calicoctl patch node node1 --patch '{"spec": {"bgp": {"ipv4Address": "10.0.0.1/24"}}}'
采用负载均衡器暴露API服务时,需要注意:
/livez?verbosekube-apiserver启动参数关键配置:
bash复制--etcd-servers=https://etcd0:2379,https://etcd1:2379,https://etcd2:2379 \
--service-cluster-ip-range=10.96.0.0/16 \
--enable-admission-plugins=NodeRestriction,PodSecurity \
--audit-log-path=/var/log/kubernetes/audit.log \
--audit-log-maxage=30
通过--leader-elect=true参数启用选举,观察日志确认主节点:
bash复制kubectl logs -n kube-system kube-controller-manager-node1 | grep "leader election"
建议将--node-monitor-period调整为5s(默认10s),加快节点不可用检测速度。
1.32版本改进了证书轮换机制,在/var/lib/kubelet/config.yaml中配置:
yaml复制rotateCertificates: true
serverTLSBootstrap: true
通过以下命令检查证书状态:
bash复制openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -noout -text | grep Not
新节点加入集群后必须验证:
使用kube-monkey模拟节点故障:
bash复制kubectl apply -f - <<EOF
apiVersion: chaosmonkey.org/v1
kind: Monkey
metadata:
name: node-failure-test
spec:
selector:
matchLabels:
env: production
mode: percent
maxTerminations: 30%
period: 5m
EOF
通过kubemark工具模拟大规模集群:
bash复制./hack/kubemark.sh --num-nodes=1000 --provider=aws
重点关注以下指标:
Prometheus需要抓取的核心指标:
Grafana仪表盘应包含:
紧急级别告警示例:
yaml复制- alert: HighAPILatency
expr: histogram_quantile(0.99, sum(rate(apiserver_request_duration_seconds_bucket[5m])) by (le, verb)) > 2
for: 5m
labels:
severity: critical
annotations:
summary: "API latency high (instance {{ $labels.instance }})"
1.32版本支持滚动升级控制平面:
bash复制kubeadm upgrade plan
kubeadm upgrade apply v1.32.0 --etcd-upgrade=false
关键注意事项:
回滚时需要特别注意:
我在实际升级过程中发现,当集群中存在StatefulSet时,需要先手动扩缩容触发控制器重建Pod,否则可能遇到PV挂载问题。建议在维护窗口期进行此操作,并通过kubectl get pods -w实时监控重建状态。