使用kubeadm在私有数据中心安装Kubernetes(k8s)集群时,如何设置集群的高可用性?

问题浏览数Icon
30
问题创建时间Icon
2025-04-05 21:29:00
作者头像
mistmoon77
  1. 负载均衡器配置

    • 部署TCP负载均衡器(如HAProxy/Keepalived或硬件LB),将6443端口(kube-apiserver)流量分发到所有控制平面节点。
    • 确保负载均衡器IP作为集群统一的访问端点(--control-plane-endpoint)。
  2. 初始化首个控制平面节点

    kubeadm init \
    --control-plane-endpoint="负载均衡器IP:端口" \
    --upload-certs \
    --pod-network-cidr=<CNI网段>

    记录生成的join命令(含证书密钥)。

  3. 部署共享证书

    • /etc/kubernetes/pki目录下的CA证书复制到其他控制节点相同路径
    • 使用kubeadm init phase certs all重新生成节点专属证书
  4. 加入其他控制平面节点

    kubeadm join 负载均衡器IP:端口 \
    --token <token> \
    --discovery-token-ca-cert-hash <hash> \
    --control-plane \
    --certificate-key <密钥>
  5. 配置etcd高可用(堆叠式拓扑)

    • 每个控制节点自动运行etcd成员
    • 验证etcd集群状态:etcdctl member list
  6. 工作节点加入
    使用标准join命令,指向负载均衡器端点。

  7. 验证高可用性

    • 故意关闭主控制节点,确认kubectl命令仍可执行
    • 检查组件状态:kubectl get componentstatuses

注意: 生产环境建议至少3个控制平面节点,且etcd与控制平面节点共置。

更多回答

作者头像
hufeng77

在私有数据中心使用kubeadm部署Kubernetes高可用集群,需从控制平面、etcd集群及负载均衡三个层面实现冗余。以下是关键步骤:

  1. 控制平面冗余:至少部署3个Master节点,通过kubeadm init时指定--control-plane-endpoint指向负载均衡器(如HAProxy+Keepalived),使用--upload-certs自动分发证书。
  2. etcd集群高可用:选择堆叠式(Stacked)或独立etcd集群模式。堆叠式需每个Master节点部署etcd,独立模式需单独部署3节点etcd集群并配置TLS通信。
  3. 负载均衡配置:API Server前端需部署负载均衡器(建议至少双节点+VIP),确保TCP/6443端口负载到所有Master节点。
  4. 节点联入策略:工作节点通过负载均衡器连接到API Server,避免单点依赖。

实践经验:

  • 网络需保证低延迟(etcd要求<200ms),优先使用BGP或VRRP协议实现负载均衡器高可用
  • 使用kubeadm config upload生成全局配置,确保各节点参数一致性
  • 部署后通过kubectl get nodes -o wide及etcdctl endpoint status验证拓扑
  • 私有环境需预配镜像仓库并配置kubeadm的imageRepository参数
  • 建议结合Rook+Ceph实现持久化存储的高可用
作者头像
starpath88

在私有数据中心使用kubeadm部署高可用Kubernetes集群时,需重点关注控制平面的冗余设计,具体实施步骤如下:

  1. 控制平面高可用架构

    • 采用至少3个控制节点(Control Plane),建议选择堆叠式etcd拓扑(Stacked etcd)或独立etcd集群方案。前者每个控制节点同时运行kube-apiserver和etcd,后者需单独部署etcd集群。
  2. 负载均衡配置

    • 在控制节点前部署负载均衡器(如HAProxy/Nginx),暴露kube-apiserver的6443端口。需确保LB自身高可用(VIP+Keepalived或硬件负载均衡)。
  3. 证书与配置同步

    • 使用kubeadm init初始化首个控制节点时,通过--control-plane-endpoint参数指定LB的VIP地址。
    • 使用kubeadm join加入其他控制节点时需携带--control-plane标志,并确保同步/etc/kubernetes/pki目录下的CA证书。
  4. 关键组件优化

    • 部署CoreDNS副本数为3,配置反亲和策略
    • 采用高可用网络插件(如Calico的BGP模式或Cilium)
    • 配置kube-controller-manager和kube-scheduler的Leader Election机制
  5. 验证与运维

    • 使用kubectl get nodes -o wide确认节点状态
    • 通过模拟节点故障测试故障转移
    • 定期备份etcd数据(etcdctl snapshot save)

注:若使用私有镜像仓库,需预先将k8s.gcr.io镜像同步至内网,并在kubeadm配置中指定local registry路径。

作者头像
xiaozhu99

在私有数据中心使用kubeadm部署高可用Kubernetes集群时,我通常采用以下架构方案及实践经验:

  1. 架构设计

    • 控制平面:部署3个master节点,通过HAProxy+Keepalived实现API Server负载均衡,虚拟IP作为统一接入点
    • etcd集群:采用独立部署模式(非堆叠式),避免与控制平面耦合,提高稳定性
    • 网络方案:选择Calico/BGP模式实现跨机柜Pod通信,需预先规划Underlay网络路由
  2. 关键配置步骤

    • 预配置负载均衡器(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节点
  3. 实践挑战与解决方案

    • 证书管理:
    • 遇到过证书有效期仅1年的问题,现通过定期执行kubeadm alpha certs renew提前更新
    • 私有镜像同步:
    • 自建harbor仓库缓存k8s.gcr.io镜像,通过ansible脚本批量预载到节点
    • 网络隔离问题:
    • 物理交换机ACL曾阻断apiserver VIP漂移,需与网络团队协同配置VRRP白名单
    • 存储高可用:
    • 对接Ceph集群时,需调整kubelet的MaxOpenFiles限制(sysctl调优)
  4. 验证方案

    • 模拟master节点宕机: systemctl stop kube-apiserver && watch kubectl get nodes
    • 测试etcd集群健康状态: ETCDCTL_API=3 etcdctl --endpoints=... endpoint status
    • 验证服务连续性: 持续访问ClusterIP服务期间重启控制平面组件
  5. 运维建议

    • 部署Prometheus监控集群组件健康状态,特别关注etcd写入延迟指标
    • 使用Velero定期备份集群状态,特别注意PersistentVolume的存储位置
    • 预留至少20%的计算资源缓冲,避免控制平面组件因资源不足被驱逐