在 CentOS 上实现 Kubernetes 高可用
一 架构与前置准备
swapoff -a && sed -ri 's/.*swap.*/#&/' /etc/fstabhostnamectl set-hostname k8s-master1,并在 /etc/hosts 添加各节点映射systemctl stop firewalld && systemctl disable firewalld 与 setenforce 0net.bridge.bridge-nf-call-iptables=1,并配置 NTP 时间同步二 部署高可用控制面与 etcd
yum install -y docker kubelet kubeadm kubectl && systemctl enable --now docker kubeletyum install -y haproxy keepalivedfrontend 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
/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 keepalivedkubeadm 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
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>
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yamlkubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.ymlkubectl get nodes、kubectl get pods -A、kubectl get endpoints kubernetes(应指向 VIP:16443)三 加入工作节点与入口高可用
kubeadm join 命令(由 kubeadm init 输出提供),或复用控制面加入命令但不带 --control-plane 参数。四 验证与运维要点
kube-apiserver 进程与 VIP 漂移是否正常;临时停止某台 Master 的 kubelet 或 haproxy,确认 kubectl 与业务访问不受影响。kubectl get componentstatuses(或 kubectl get cs)、kubectl get endpoints kubernetes、kubectl get nodes -o wide。kubeadm 配置与证书;制定灾难恢复演练计划。五 常见问题与优化
/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.shhttps://127.0.0.1:8443,可进一步降低 kubelet 直连 Master 的单点风险。