使用kubeadm在私有数据中心安装Kubernetes(k8s)集群时,如何设置集群的高可用性?
xiaozhu99:在私有数据中心使用kubeadm部署高可用Kubernetes集群时,我通常采用以下架构方案及实践经验:
架构设计
控制平面:部署3个master节点,通过HAProxy+Keepalived实现API Server负载均衡,虚拟IP作为统一接入点
etcd集群:采用独立部署模式(非堆叠式),避免与控制平面耦合,提高稳定性
网络方案:选择Calico/BGP模式实现跨机柜Pod通信,需预先规划Underlay网络路由
关键配置步骤
预配置负载均衡器(6443/2379/2380端口),确保TCP健康检查机制正常
使用kubeadm-config.yaml配置高可用参数:
controlPlaneEndpoint: "apiserver-vip:6443"
etcd:
external:
endpoints: ["https://etcd1:2379", ...]
caFile: ...
首个master节点初始化时添加--upload-certs参数实现证书共享
通过kubeadm join --control-plane扩展其他master节点
实践挑战与解决方案
证书管理:
遇到过证书有效期仅1年的问题,现通过定期执行kubeadm alpha certs renew提前更新
私有镜像同步:
自建harbor仓库缓存k8s.gcr.io镜像,通过ansible脚本批量预载到节点
网络隔离问题:
物理交换机ACL曾阻断apiserver VIP漂移,需与网络团队协同配置VRRP白名单
存储高可用:
对接Ceph集群时,需调整kubelet的MaxOpenFiles限制(sysctl调优)
验证方案
模拟master节点宕机:
systemctl stop kube-apiserver && watch kubectl get nodes
测试etcd集群健康状态:
ETCDCTL_API=3 etcdctl --endpoints=... endpoint status
验证服务连续性:
持续访问ClusterIP服务期间重启控制平面组件
运维建议
部署Prometheus监控集群组件健康状态,特别关注etcd写入延迟指标
使用Velero定期备份集群状态,特别注意PersistentVolume的存储位置
预留至少20%的计算资源缓冲,避免控制平面组件因资源不足被驱逐
322
2025-04-05 21:29:00