Kubernetes kubeadm 高可用集群部署方案详解
前言
在生产环境中部署 Kubernetes 集群时,高可用性(High Availability, HA)是一个基本要求。kubeadm 作为 Kubernetes 官方推荐的集群部署工具,提供了构建高可用集群的能力。本文将深入探讨使用 kubeadm 部署高可用 Kubernetes 集群时的关键考虑因素和实现方案。
高可用集群架构概述
高可用集群的核心目标是确保即使部分控制平面节点或工作节点发生故障,集群仍能保持正常运行。对于工作节点,只要数量足够,Kubernetes 本身就具备处理节点故障的能力。但对于控制平面节点和 etcd 实例,则需要特别设计冗余方案。
kubeadm 支持多控制平面和多 etcd 实例的集群部署。要实现真正的高可用,通常需要将 API Server 实例置于负载均衡器之后,并在使用 kubeadm init
初始化集群时通过 --control-plane-endpoint
参数指定负载均衡器的端点。
负载均衡方案选择
方案一:keepalived + haproxy 组合
这是经过长期验证的经典方案,由两个组件组成:
- keepalived:提供虚拟 IP(VIP)管理,通过健康检查确保 VIP 在节点间自动切换
- haproxy:提供简单的流式负载均衡,TLS 终止由后端的 API Server 处理
keepalived 配置详解
keepalived 需要两个配置文件:
- 主配置文件
/etc/keepalived/keepalived.conf
:
global_defs {
router_id LVS_DEVEL
}
vrrp_script check_apiserver {
script "/etc/keepalived/check_apiserver.sh"
interval 3
weight -2
fall 10
rise 2
}
vrrp_instance VI_1 {
state MASTER # 主节点设为MASTER,其他设为BACKUP
interface eth0 # 参与VIP协商的网络接口
virtual_router_id 51 # 同一集群所有节点相同,不同集群需唯一
priority 101 # 主节点优先级高于备份节点(如100)
authentication {
auth_type PASS
auth_pass 42 # 集群所有节点相同
}
virtual_ipaddress {
192.168.0.100 # 虚拟IP地址
}
track_script {
check_apiserver
}
}
- 健康检查脚本
/etc/keepalived/check_apiserver.sh
:
#!/bin/sh
errorExit() {
echo "*** $*" 1>&2
exit 1
}
curl -sfk --max-time 2 https://localhost:6443/healthz -o /dev/null || errorExit "Error GET https://localhost:6443/healthz"
haproxy 配置详解
haproxy 主配置文件 /etc/haproxy/haproxy.cfg
:
global
log stdout format raw local0
daemon
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 1
timeout http-request 10s
timeout queue 20s
timeout connect 5s
timeout client 35s
timeout server 35s
timeout http-keep-alive 10s
timeout check 10s
frontend apiserver
bind *:6443 # Kubernetes连接API Server的端口
mode tcp
option tcplog
default_backend apiserverbackend
backend apiserverbackend
option httpchk
http-check connect ssl
http-check send meth GET uri /healthz
http-check expect status 200
mode tcp
balance roundrobin
server master1 192.168.0.101:6443 check verify none
server master2 192.168.0.102:6443 check verify none
server master3 192.168.0.103:6443 check verify none
部署方式选择
-
操作系统服务方式:
- 适合负载均衡器运行在独立主机上的场景
- 使用系统包管理器安装软件
- 通过 systemd 管理服务
-
静态Pod方式:
- 适合负载均衡器运行在控制平面节点上的场景
- 将服务作为静态Pod部署
- 需要在
/etc/kubernetes/manifests
目录下创建Pod清单
静态Pod清单示例(keepalived):
apiVersion: v1
kind: Pod
metadata:
name: keepalived
namespace: kube-system
spec:
containers:
- image: osixia/keepalived:2.0.20
name: keepalived
securityContext:
capabilities:
add: ["NET_ADMIN", "NET_BROADCAST", "NET_RAW"]
volumeMounts:
- mountPath: /usr/local/etc/keepalived/keepalived.conf
name: config
- mountPath: /etc/keepalived/check_apiserver.sh
name: check
hostNetwork: true
volumes:
- hostPath:
path: /etc/keepalived/keepalived.conf
name: config
- hostPath:
path: /etc/keepalived/check_apiserver.sh
name: check
方案二:kube-vip 方案
kube-vip 是一个新兴方案,将VIP管理和负载均衡功能集成在一个服务中,支持两种模式:
- Layer2模式:使用ARP和leader选举
- Layer3模式:使用BGP对等
生成kube-vip清单
- 设置基本参数:
export VIP=192.168.0.40
export INTERFACE=eth0
export KVVERSION=v0.4.0 # 设置kube-vip版本
- ARP模式清单生成:
kube-vip manifest pod \
--interface $INTERFACE \
--vip $VIP \
--controlplane \
--arp \
--leaderElection > /etc/kubernetes/manifests/kube-vip.yaml
- BGP模式清单生成:
kube-vip manifest pod \
--interface lo \
--vip $VIP \
--controlplane \
--bgp \
--localAS 65000 \
--bgpRouterID 192.168.0.2 \
--bgppeers 192.168.0.10:65000::false,192.168.0.11:65000::false > /etc/kubernetes/manifests/kube-vip.yaml
集群初始化
完成负载均衡方案部署后,即可使用kubeadm初始化高可用集群。关键步骤如下:
- 在所有控制平面节点上准备负载均衡组件
- 使用
kubeadm init
命令初始化第一个控制平面节点,指定--control-plane-endpoint
参数 - 添加其他控制平面节点到集群
总结
构建高可用Kubernetes集群需要仔细规划控制平面和etcd的冗余方案。kubeadm提供了基础支持,但负载均衡器的选择和配置同样关键。本文介绍的两种方案各有特点:
- keepalived+haproxy:成熟稳定,适合传统环境
- kube-vip:一体化方案,部署简单,适合云原生环境
根据实际环境需求选择合适的方案,并确保负载均衡器本身也具有高可用性,才能真正实现生产级的高可用Kubernetes集群。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考