温馨提示×

如何在CentOS上实现Kubernetes高可用性

小樊
46
2025-11-16 04:17:02
栏目: 智能运维

在 CentOS 上实现 Kubernetes 高可用

一 架构与前置准备

  • 架构建议
    • 控制面采用3 台 Master节点,部署 kube-apiserver、kube-controller-manager、kube-scheduler;数据面跨节点分布,避免单点。
    • etcd 3 节点集群与控制面同机房跨节点部署,保证强一致性与可恢复性。
    • 入口使用外部或本地高可用负载均衡(如 HAProxy/KeepalivedNginx/Keepalived),对外暴露 VIP/DNS,对内为 kube-apiserver 提供统一接入与健康检查。
  • 节点与网络
    • 建议每节点至少2 核 CPU、2 GB 内存、20 GB 磁盘;节点间互通,并可访问外网拉取镜像。
    • 规划固定 VIP(如 192.168.3.254/24)与负载均衡端口(如 16443/TCP 转发至各 Master 的 6443)。
  • 系统初始化(所有节点)
    • 关闭 Swap:swapoff -a && sed -ri 's/.*swap.*/#&/' /etc/fstab
    • 主机名与 hosts:如 hostnamectl set-hostname k8s-master1,并在 /etc/hosts 添加各节点映射
    • 防火墙与 SELinux:生产建议精细放行端口;实验环境可临时 systemctl stop firewalld && systemctl disable firewalldsetenforce 0
    • 内核与网络:开启桥接流量转发 net.bridge.bridge-nf-call-iptables=1,并配置 NTP 时间同步

二 部署高可用控制面与 etcd

  • 安装容器运行时与工具(所有节点)
    • yum install -y docker kubelet kubeadm kubectl && systemctl enable --now docker kubelet
  • 外部/本地负载均衡(两台 Master 上)
    • 安装:yum install -y haproxy keepalived
    • HAProxy 示例(/etc/haproxy/haproxy.cfg):
      frontend k8s
        bind *:16443
        mode tcp
        default_backend k8s
      backend k8s
        mode tcp
        balance roundrobin
        server k8s-master1 192.168.52.11:6443 check
        server k8s-master2 192.168.52.12:6443 check
        server k8s-master3 192.168.52.13:6443 check
      
    • Keepalived 示例(/etc/keepalived/keepalived.conf,使用脚本健康检查 /etc/keepalived/check.sh):
      vrrp_script check_server {
        script "/etc/keepalived/check.sh"
        interval 3
        weight -10
        fall 2
        rise 1
      }
      vrrp_instance VI_1 {
        state BACKUP
        interface ens224
        mcast_src_ip 192.168.52.11
        virtual_router_id 51
        priority 100
        advert_int 2
        authentication { auth_type PASS; auth_pass 1234 }
        virtual_ipaddress { 192.168.3.254/24 }
        track_script { check_server }
      }
      
    • 启动:systemctl enable --now haproxy keepalived
  • 使用 kubeadm 初始化第一个控制面并加入其余控制面
    • 初始化(在首个 Master 执行,注意将 LOAD_BALANCER_DNS:PORT 指向 VIP:16443):
      kubeadm init \
        --control-plane-endpoint "LOAD_BALANCER_DNS:16443" \
        --upload-certs \
        --pod-network-cidr=10.244.0.0/16
      mkdir -p $HOME/.kube
      cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
      chown $(id -u):$(id -g) $HOME/.kube/config
      
    • 加入其余控制面(在另外两台 Master 执行,命令由 kubeadm init 输出提供,包含 --control-plane--certificate-key):
      kubeadm join LOAD_BALANCER_DNS:16443 \
        --token <TOKEN> \
        --discovery-token-ca-cert-hash sha256:<HASH> \
        --control-plane --certificate-key <CERT_KEY>
      
  • 安装 CNI 网络插件(任一 Master 执行)
    • Calico:kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
    • 或 Flannel:kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
  • 验证
    • kubectl get nodeskubectl get pods -Akubectl get endpoints kubernetes(应指向 VIP:16443

三 加入工作节点与入口高可用

  • 加入 Worker 节点
    • 在每台 Worker 执行 kubeadm join 命令(由 kubeadm init 输出提供),或复用控制面加入命令但不带 --control-plane 参数。
  • 业务入口高可用
    • 外部访问建议通过 Service: LoadBalancerIngress Controller(如 Nginx Ingress)暴露;在云上优先使用云厂商 LB 的多可用区能力;自建环境可在 Node 上运行 Nginx/HAProxy 作为 Ingress/NodePort 的前端负载均衡。

四 验证与运维要点

  • 高可用验证
    • 在多个 Master 上观察 kube-apiserver 进程与 VIP 漂移是否正常;临时停止某台 Master 的 kubelet 或 haproxy,确认 kubectl 与业务访问不受影响。
    • 查看组件与端点:kubectl get componentstatuses(或 kubectl get cs)、kubectl get endpoints kuberneteskubectl get nodes -o wide
  • 备份与恢复
    • 定期备份 etcd(快照与恢复流程),并备份 kubeadm 配置与证书;制定灾难恢复演练计划。
  • 监控与告警
    • 部署 Prometheus + Grafana + Alertmanager 监控集群与应用指标,配置可用性与容量告警;结合日志方案(如 Loki/ELK)完善可观测性。

五 常见问题与优化

  • 健康检查脚本建议
    • /etc/keepalived/check.sh 示例(探测本地 6443 的健康):
      #!/usr/bin/env bash
      curl -k --max-time 2 https://127.0.0.1:6443/healthz >/dev/null 2>&1
      exit $?
      
    • 给脚本可执行权限:chmod +x /etc/keepalived/check.sh
  • 安全与合规
    • 生产环境不建议直接关闭防火墙,按需放行 6443、10250、2379-2380、10251、10252、30000-32767 等端口;SELinux 建议 Enforcing 并配置策略。
  • 节点本地 API 代理(可选)
    • 在每个 Node 部署本地 Nginx 反向代理到各 Master 的 6443,并将 kubelet 指向 https://127.0.0.1:8443,可进一步降低 kubelet 直连 Master 的单点风险。

0