构建基于 HAProxy 和 Pacemaker 的 Kubernetes 高可用集群
在生产环境中,Kubernetes 控制平面的高可用性至关重要。本文将介绍如何通过 HAProxy 和 Pacemaker 构建负载均衡层,并部署一个多 Master 节点的 Kubernetes 高可用集群。
1. 实验环境准备
本次部署共使用 6 台主机,环境分配如下:
| 主机名 | IP 地址 | 角色组件 |
|---|---|---|
| registry-node | 192.168.67.10 | Harbor 镜像仓库 |
| k8s-master1 | 192.168.67.11 | Control-plane |
| k8s-master2 | 192.168.67.12 | Control-plane |
| k8s-master3 | 192.168.67.13 | Control-plane |
| lb-node1 | 192.168.67.14 | HAProxy, Pacemaker (VIP: 192.168.67.200) |
| lb-node2 | 192.168.67.15 | HAProxy, Pacemaker |
| k8s-worker1 | 192.168.67.16 | Worker node |
2. 配置 HAProxy 负载均衡
在 lb-node1 和 lb-node2 上安装并配置 HAProxy,用于分发 6443 端口的 API Server 请求。
# 安装 HAProxy
yum install -y haproxy
# 编辑配置文件 /etc/haproxy/haproxy.cfg
# 关键配置如下:
listen k8s-api-server
bind *:6443
mode tcp
option tcplog
balance roundrobin
server master1 192.168.67.11:6443 check
server master2 192.168.67.12:6443 check
server master3 192.168.67.13:6443 check
配置完成后,启动并检查服务状态,但不要设置开机自启,后续将由 Pacemaker 接管。
systemctl start haproxy
systemctl stop haproxy
3. 部署 Pacemaker 高可用集群
使用 Pacemaker 管理 VIP(虚拟 IP)和 HAProxy 服务,确保负载均衡层的高可用。
# 在两个负载均衡节点安装组件
yum install -y pacemaker pcs psmisc policycoreutils-python
# 启动集群管理服务
systemctl enable --now pcsd.service
# 设置集群节点认证密码
echo "cluster_pwd" | passwd --stdin hacluster
# 节点认证与集群初始化
pcs cluster auth lb-node1 lb-node2 -u hacluster -p cluster_pwd
pcs cluster setup --name k8s-lb-cluster lb-node1 lb-node2
pcs cluster start --all
pcs cluster enable --all
# 禁用 STONITH 机制(实验环境通常不具备硬件隔离设备)
pcs property set stonith-enabled=false
# 创建 VIP 资源和 HAProxy 资源组
pcs resource create k8s-vip ocf:heartbeat:IPaddr2 ip=192.168.67.200 op monitor interval=30s
pcs resource create k8s-haproxy systemd:haproxy op monitor interval=60s
pcs resource group add k8s-ha-group k8s-vip k8s-haproxy
4. 初始化 Kubernetes 控制平面
在所有 Master 节点上清理旧环境并加载必要的内核模块。
# 清理环境
kubeadm reset --cri-socket unix:///var/run/cri-dockerd.sock
rm -rf /etc/cni/net.d
modprobe overlay
modprobe br_netfilter
# 生成并修改初始化配置
kubeadm config print init-defaults > kubeadm-config.yaml
修改 kubeadm-config.yaml 中的 controlPlaneEndpoint 为 VIP 地址 192.168.67.200:6443。
# 初始化首个控制节点
kubeadm init --config kubeadm-config.yaml --upload-certs
# 部署网络插件(如 Calico)
kubectl apply -f calico.yaml
初始化成功后,使用生成的 kubeadm join 命令将另外两个 Master 节点加入集群,注意添加 --control-plane 标志。
5. 扩容 Worker 节点
在 k8s-worker1 节点上完成基础配置,并加入集群。
# 基础配置:关闭 Swap、安装 Containerd 及 Kube 组件
swapoff -a
yum install -y containerd.io kubeadm kubelet kubectl
systemctl enable --now containerd kubelet
# 加入集群
kubeadm join 192.168.67.200:6443 --token [TOKEN] \
--discovery-token-ca-cert-hash sha256:[HASH]
最后,在 Master 节点执行 kubectl get nodes 确认所有节点均已处于 Ready 状态。