kubeadm + haproxy + keepalived 三节点高可用控制平面
操作环境:master01(.11)/master02(.12)/master03(.13),VIP 192.168.1.100;三台 master 均装 haproxy + keepalived。
对接原理:keepalived 通过 VRRP 在 master 间漂移 VIP;haproxy 监听 VIP:6444,TCP 转发到三个本机 kube-apiserver:6443;kubeadm 的 controlPlaneEndpoint 指向 VIP:6444,所有 kubelet 与组件经此接入,任一 master 宕机不影响集群入口。
详细步骤:
bash
1# 1. 三台 master 安装组件
2dnf install -y haproxy keepalived
3
4# 2. haproxy 配置(三台相同)/etc/haproxy/haproxy.cfg 追加:
5cat >> /etc/haproxy/haproxy.cfg <<'EOF'
6frontend k8s_frontend
7 bind *:6444
8 mode tcp
9 default_backend k8s_backend
10backend k8s_backend
11 mode tcp
12 balance roundrobin
13 server master01 192.168.1.11:6443 check inter 3s fall 3 rise 2
14 server master02 192.168.1.12:6443 check inter 3s fall 3 rise 2
15 server master03 192.168.1.13:6443 check inter 3s fall 3 rise 2
16EOF
17
18# 3. keepalived 配置 /etc/keepalived/keepalived.conf(master01 为例,
19# master02 priority 90、master03 priority 80,state 均为 BACKUP)
20cat > /etc/keepalived/keepalived.conf <<'EOF'
21vrrp_instance VI_K8S {
22 state BACKUP
23 interface eth0
24 virtual_router_id 51
25 priority 100
26 advert_int 1
27 virtual_ipaddress {
28 192.168.1.100/24
29 }
30}
31EOF
32
33systemctl enable --now haproxy keepalived
34ip addr show eth0 | grep 192.168.1.100 # VIP 应漂在 master01
yaml
1# 4. kubeadm-config.yaml(关键差异:controlPlaneEndpoint)
2apiVersion: kubeadm.k8s.io/v1beta3
3kind: ClusterConfiguration
4kubernetesVersion: v1.28.15
5imageRepository: registry.aliyuncs.com/google_containers
6controlPlaneEndpoint: "192.168.1.100:6444"
7networking:
8 podSubnet: 10.244.0.0/16
9 serviceSubnet: 10.96.0.0/12
bash
1# 5. master01 初始化并导出证书密钥
2kubeadm init --config=kubeadm-config.yaml --upload-certs
3# 记录 join 命令与 --certificate-key 输出
4
5# 6. master02/03 以控制平面身份加入
6kubeadm join 192.168.1.100:6444 --token xxx \
7 --discovery-token-ca-cert-hash sha256:xxx \
8 --control-plane --certificate-key xxx
9
10# 7. 部署 CNI(如 Calico/Flannel)后 worker 按普通方式 join
验证流程:
bash
1kubectl get nodes # 三 master + worker 全 Ready
2kubectl -n kube-system get pods -o wide # 三套 apiserver/etcd 分布在三节点
3# VIP 漂移演练:停掉 master01 的 keepalived,VIP 应在秒级切到 master02,
4# kubectl 仍可用(因经 VIP 访问)
排错 :VIP 不漂移 → 检查 virtual_router_id 是否冲突、防火墙是否放行 VRRP(协议号 112);join 控制平面失败 → 确认 6444 经 haproxy 可达:curl -k https://192.168.1.100:6444/version。