k8s高可用(Keepalived + HAProxy)集群部署
一、架构图

1.1、核心组件工作原理
| 组件 | 作用 | 关键机制 |
|---|---|---|
| Keepalived | 管理VIP漂移,监控节点健康 | VRRP协议(虚拟路由冗余协议) |
| HAProxy | 提供API Server的负载均衡和健康检查 | TCP模式转发+HTTP层健康检查 |
| VIP | 对外提供唯一入口地址 | ARP广播宣告IP所有权 |
-
3个LB节点:相比传统2节点方案,避免"脑裂"同时提升吞吐量
-
VIP漂移优先级:建议设置优先级差(如100/95/90),确保快速收敛
二、高可用部署
官方参考:kubeadm/docs/ha-considerations.md at main · kubernetes/kubeadm
本例测试,直接将LB组件(Keepalived + HAProxy)安装在k8s上的master节点上了
节点规划
| 节点名称 | IP | 规格 | 部署组件 |
|---|---|---|---|
| k8s-master1 | 192.168.1.181 | 2C4G | Keepalived + HAProxy + ETCD + kube-apiserver等控制平面组件 |
| k8s-master2 | 192.168.1.182 | 2C4G | Keepalived + HAProxy + ETCD + kube-apiserver等控制平面组件 |
| k8s-master3 | 192.168.1.183 | 2C4G | Keepalived + HAProxy + ETCD + kube-apiserver等控制平面组件 |
| k8s-node1 | 192.168.1.184 | 按需 | kubelet + 工作负载 |
2.1 阶段1:基础环境准备(所有节点)
参考:【K8S】k8s安装 步骤中的 环境准备
写入hosts文件
cat >> /etc/hosts << EOF 192.168.1.181 k8s-master1 192.168.1.182 k8s-master2 192.168.1.183 k8s-master3 192.168.1.184 k8s-node1 EOF
2.2 阶段2:安装容器运行时(containerd)(所有节点)
参考:【K8S】k8s安装 步骤中的 安装容器运行时(containerd)
2.3 阶段3:安装kubeadm/kubelet/kubectl
参考:【K8S】k8s安装 步骤中的 安装 Kubernetes 组件
2.4 阶段4:安装 Keepalived + VIP 配置(所有Master节点)
本例中 VIP(虚拟IP)是:192.168.1.180
1. 安装Keepalived
yum install -y keepalived
2. 配置Keepalived(以k8s-master1为主节点)
# k8s-master1(priority 100) cat > /etc/keepalived/keepalived.conf <<EOF ! Configuration File for keepalived 全局定义部分 - 适用于所有实例的配置 global_defs { router_id LVS_DEVEL # 定义当前节点的路由ID,用于标识节点,在集群中应唯一 } ! VRRP健康检查脚本定义 用于检查HAProxy服务是否正常运行 vrrp_script chk_haproxy { script "killall -0 haproxy" # 检查haproxy进程是否存在的命令,killall -0只是检查不实际杀死进程 interval 2 # 检查间隔时间,单位为秒,每2秒执行一次检查 weight 50 # 权重值,如果检查失败优先级将减少该值,如果检查失败,优先级将减少50(可能导致主备切换) } ! 定义虚拟路由器实例 vrrp_instance VI_1 { state MASTER # 初始状态为MASTER(在备份节点上应改为BACKUP) interface ens33 # 使用eth0网卡进行VRRP通信,使用ifconfig确认名称 virtual_router_id 51 # 虚拟路由ID,集群中所有节点必须相同,范围1-255 priority 80 # 初始优先级(备份节点设为90和80) advert_int 1 # 广告间隔时间(秒) # 认证配置 authentication { auth_type PASS # 认证类型为密码认证 auth_pass MySecretPass # 认证密码,集群中所有节点必须相同 } # 虚拟IP地址配置(VIP) virtual_ipaddress { 192.168.1.180/24 # 定义的虚拟IP地址和子网掩码 }# 跟踪脚本配置
track_script { chk_haproxy # 关联之前定义的haproxy检查脚本 } # 可选的高级配置(示例中被注释掉) # notify_master "/path/to/script.sh master" # notify_backup "/path/to/script.sh backup" # notify_fault "/path/to/script.sh fault" # 这些脚本会在状态改变时执行 } EOF # k8s-master2(priority 90)和k8s-master3(priority 80)需修改: # state BACKUP # priority 90/80
注意:网卡名称可以使用ipconfig查看
3. 启动服务
systemctl enable --now keepalived
验证
# 检查VIP是否绑定到正确的节点 ip addr show ens33 # 查看实时日志 journalctl -u keepalived -f


2.5 阶段5:安装 HAProxy配置(所有Master节点)
1. 安装HAProxy
yum install -y haproxy
2. 配置HAProxy
cat > /etc/haproxy/haproxy.cfg <<EOF # HAProxy 负载均衡配置 for Kubernetes API Server # ================================================ # 全局配置 (影响整个HAProxy进程) global log /dev/log local0 # 定义日志输出到/dev/log,使用local0设备 maxconn 20000 # 每个进程的最大连接数 nbproc 4 # 启动4个工作进程(建议与CPU核心数匹配) # 默认参数配置 (所有frontend/backend继承这些设置) defaults mode tcp # 默认使用TCP模式(第4层负载均衡) timeout connect 5s # 连接后端服务器的超时时间 timeout client 50s # 客户端不活动超时时间 timeout server 50s # 服务器端不活动超时时间 # 前端配置 - Kubernetes API服务入口 frontend k8s-api bind *:6443 # 监听所有IP的6443端口(K8s API默认端口) default_backend k8s-masters # 默认转发到名为k8s-masters的后端组 # 后端配置 - Kubernetes Master节点集群 backend k8s-masters balance roundrobin # 使用轮询负载均衡算法 option tcp-check # 启用TCP健康检查 # Master节点服务器配置 # 格式:server <名称> <IP:端口> [参数] server k8s-master1 192.168.1.181:16443 check inter 3s fall 3 rise 2 # check - 启用健康检查 # inter 3s - 每3秒检查一次,默认2s # fall 3 - 连续3次失败标记为不可用,默认3 # rise 2 - 连续2次成功恢复为可用,默认2 server k8s-master2 192.168.1.182:16443 check inter 3s fall 3 rise 2 server k8s-master3 192.168.1.183:16443 check inter 3s fall 3 rise 2 # HAProxy统计页面配置 listen stats bind *:8404 # 监控页面监听端口 mode http # 使用HTTP模式 stats enable # 启用统计页面 stats uri /admin?stats # 统计页面访问路径 stats auth admin:SecurePass123 # 登录认证(用户名:密码) # 访问方式:http://<HAProxy-IP>:8404/admin?stats EOF
验证:
查看监听端口:netstat -lntup|grep haproxy

在k8s-master1上关闭haproxy服务,查看虚拟ip是否转移k8s-master2
在k8s-master1上开启haproxy服务,查看虚拟ip是否回到k8s-master1
# 关闭 haproxy 服务 systemctl stop haproxy ip addr show ens33 # 开启 haproxy 服务 systemctl start haproxy ip addr show ens33

2.6 阶段6:初始化第一个Master节点(k8s-master1)
1. 创建kubeadm配置文件
由于HAProxy与K8S的apiServer部署在同一个节点,对外想暴露默认端口6443,所有由HAProxy监听对外保留端口6443
apiServer监听端口16443,由HAProxy将6443端口流量反向代理到apiServer的16443端口
cat > kubeadm-config.yaml <<'EOF' apiVersion: kubeadm.k8s.io/v1beta3 kind: ClusterConfiguration kubernetesVersion: 1.28.0 controlPlaneEndpoint: "192.168.1.180:6443" # VIP + HAProxy端口 apiServer: extraArgs: secure-port: "16443" # 指定API Server监听端口 imageRepository: registry.aliyuncs.com/google_containers # 添加镜像仓库 networking: podSubnet: "10.244.0.0/16" etcd: local: dataDir: /var/lib/etcd EOF
2. 初始化第一个Master节点
kubeadm init --config=kubeadm-config.yaml --upload-certs --ignore-preflight-errors=Port-6443

3. 配置kubectl
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
4. 安装网络插件
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
2.7 阶段7:加入其他Master节点(k8s-master2、k8s-master3)
1. 加入其他Master节点
由于本例修改了端口,命令中需要增加参数 --ignore-preflight-errors=Port-6443 ,用来忽略端口错误
# 使用初始化时输出的命令(包含--control-plane) kubeadm join 192.168.1.180:6443 \ --token <token> \ --discovery-token-ca-cert-hash sha256:<hash> \ --control-plane \ --certificate-key <cert-key>
kubeadm join 192.168.1.180:6443 --token g9jkd7.2fe2yz08kmf0idib \ --discovery-token-ca-cert-hash sha256:46509bfe894f14bfd414a9308451d91d18edbf1e68fabd3b05053664f7c64003 \ --control-plane --certificate-key c608c8d508553a7ec593b92357413c4b6267357c240ffbc1a483e9fc358b32a5 \ --ignore-preflight-errors=Port-6443
2. 配置kubectl
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
2.8 阶段8:加入Worker节点(k8s-node1)
1. 加入Worker节点
由于本例修改了端口,命令中需要增加参数 --ignore-preflight-errors=Port-6443 ,用来忽略端口错误
# 使用初始化时输出的命令 kubeadm join 192.168.1.180:6443 \ --token <token> \ --discovery-token-ca-cert-hash sha256:<hash>
kubeadm join 192.168.1.180:6443 --token g9jkd7.2fe2yz08kmf0idib \ --discovery-token-ca-cert-hash sha256:46509bfe894f14bfd414a9308451d91d18edbf1e68fabd3b05053664f7c64003 \ --ignore-preflight-errors=Port-6443
二、测试高可kubernetes集群
在Kubernetes集群中创建一个pod,验证是否正常运行:
在主节点执行命令
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get pod,svc

浏览器访问地址:http://NodeIP:Port =》 http://192.168.1.181-193:31505


浙公网安备 33010602011771号