一、先明确:K8s 高可用集群核心架构(3/5节点,推荐3节点)
高可用的核心是控制平面(Master)多副本 + etcd 集群高可用(etcd 是 K8s 核心数据库,需至少3节点),避免单点故障。
| 节点角色 | 数量 | 硬件/系统要求(最低) | 核心组件 |
|---|---|---|---|
| 控制平面(Master) | 3台 | 2核4G/统信UOS/CentOS 7+ | kube-apiserver、kube-controller-manager、kube-scheduler、etcd |
| 工作节点(Node) | 2+台 | 4核8G/统信UOS/CentOS 7+ | kubelet、kube-proxy、containerd |
| 负载均衡器(LB) | 1台 | 1核2G/任意Linux | nginx/haproxy(转发apiserver请求) |
注:新手可先用 3节点混合部署(每台既做Master又做Node),减少机器数量,生产环境建议分离部署。
二、环境准备(所有节点执行)
1. 系统基础配置(关闭防火墙/SELinux/swap)
# 1. 关闭防火墙
systemctl stop firewalld && systemctl disable firewalld
# 2. 关闭SELinux(统信UOS/CentOS通用)
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config
# 3. 关闭swap(K8s要求必须关闭)
swapoff -a
sed -i '/swap/s/^/#/' /etc/fstab
# 4. 配置内核参数(开启IPVS/网桥转发)
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
sysctl --system
# 5. 配置主机名和hosts(示例:3台Master节点,IP和主机名对应)
# 以Master1为例,其他节点修改hostname即可
hostnamectl set-hostname k8s-master01
cat >> /etc/hosts << EOF
192.168.1.10 k8s-master01
192.168.1.11 k8s-master02
192.168.1.12 k8s-master03
192.168.1.9 k8s-lb # 负载均衡器IP
EOF
# 6. 时间同步(高可用核心,所有节点时间必须一致)
yum install -y chrony
systemctl start chronyd && systemctl enable chronyd
chronyc sync2. 安装容器运行时(containerd,替代docker)
# 1. 安装依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
# 2. 添加阿里云镜像源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 3. 安装containerd
yum install -y containerd.io
# 4. 配置containerd(生成默认配置并修改)
containerd config default > /etc/containerd/config.toml
# 修改sandbox镜像为国内源(关键,避免拉取失败)
sed -i 's#k8s.gcr.io/pause#registry.aliyuncs.com/google_containers/pause#g' /etc/containerd/config.toml
# 启用SystemdCgroup(K8s要求)
sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml
# 5. 重启并开机自启
systemctl restart containerd && systemctl enable containerd3. 安装kubeadm/kubelet/kubectl(K8s核心工具)
# 1. 添加阿里云K8s源
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
# 2. 安装指定版本(推荐1.28.x,稳定版)
yum install -y kubelet-1.28.3 kubeadm-1.28.3 kubectl-1.28.3
# 3. 开机自启kubelet(暂不启动,初始化后自动启动)
systemctl enable kubelet三、搭建负载均衡器(LB节点)
用于转发所有对 apiserver 的请求到3个Master节点,避免单Master入口故障。这里用 haproxy 为例:
# 1. 安装haproxy
yum install -y haproxy
# 2. 修改配置文件 /etc/haproxy/haproxy.cfg
cat > /etc/haproxy/haproxy.cfg << EOF
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
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 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
# 核心配置:转发8443端口(apiserver端口)到3个Master节点
frontend k8s-apiserver
bind *:8443
mode tcp
option tcplog
default_backend k8s-apiserver-backend
backend k8s-apiserver-backend
mode tcp
option tcp-check
balance roundrobin
server k8s-master01 192.168.1.10:6443 check inter 2000 fall 2 rise 2
server k8s-master02 192.168.1.11:6443 check inter 2000 fall 2 rise 2
server k8s-master03 192.168.1.12:6443 check inter 2000 fall 2 rise 2
EOF
# 3. 启动并开机自启
systemctl start haproxy && systemctl enable haproxy
# 验证端口监听
ss -tnlp | grep 8443四、初始化第一个Master节点(k8s-master01)
# 1. 初始化集群(指定LB地址、pod网段、service网段)
kubeadm init \
--control-plane-endpoint "k8s-lb:8443" \ # LB的地址和端口
--image-repository registry.aliyuncs.com/google_containers \ # 国内镜像源
--kubernetes-version v1.28.3 \
--pod-network-cidr=10.244.0.0/16 \ # flannel网络网段
--service-cidr=10.96.0.0/12 \
--upload-certs # 生成证书,用于其他Master节点加入
# 2. 配置kubectl(普通用户权限,可选)
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
# 3. 安装网络插件(flannel,必须安装,否则Pod不通)
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/v0.22.0/Documentation/kube-flannel.yml
# 国内源替代(避免访问失败)
kubectl apply -f https://mirror.ghproxy.com/https://raw.githubusercontent.com/flannel-io/flannel/v0.22.0/Documentation/kube-flannel.yml
# 4. 记录加入命令(关键!其他Master/Node节点需要)
# 初始化成功后会输出:
# 1) 加入Master节点的命令(含--control-plane和证书)
# 2) 加入Node节点的命令
# 示例:
# kubeadm join k8s-lb:8443 --token xxx --discovery-token-ca-cert-hash sha256:xxx --control-plane --certificate-key xxx
# kubeadm join k8s-lb:8443 --token xxx --discovery-token-ca-cert-hash sha256:xxx五、加入其他Master节点(k8s-master02/03)
在master02和master03上执行第一步初始化成功后输出的Master加入命令:
# 示例命令(替换为你自己的token和certificate-key)
kubeadm join k8s-lb:8443 \
--token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef \
--control-plane \
--certificate-key 1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef六、加入Node节点(工作节点)
在所有Node节点上执行初始化成功后输出的Node加入命令:
# 示例命令
kubeadm join k8s-lb:8443 \
--token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef七、验证高可用集群
在任意Master节点执行以下命令,确认集群状态:
# 1. 查看节点状态(所有节点应为Ready)
kubectl get nodes
# 输出示例:
# NAME STATUS ROLES AGE VERSION
# k8s-master01 Ready control-plane 10m v1.28.3
# k8s-master02 Ready control-plane 5m v1.28.3
# k8s-master03 Ready control-plane 3m v1.28.3
# k8s-node01 Ready <none> 1m v1.28.3
# 2. 查看控制平面组件(所有pod应为Running)
kubectl get pods -n kube-system
# 重点看:kube-apiserver、kube-controller-manager、kube-scheduler 各3个副本,etcd 3个副本
# 3. 验证高可用:停止一个Master的apiserver,集群仍可用
systemctl stop kubelet containerd -n k8s-master01
# 再次执行kubectl get nodes,集群仍能正常响应,说明高可用生效八、运维关键注意事项
- 证书有效期:K8s证书默认1年,需定期更新(
kubeadm certs renew all); - etcd备份:高可用核心是etcd,需定时备份(
etcdctl snapshot save); - LB高可用:生产环境LB也需做双机热备(keepalived),避免LB单点故障;
- 统信UOS适配:若用统信UOS,需替换yum源为统信官方源,containerd配置一致;
- 网络插件:除了flannel,也可选用calico(更适合大规模集群)。
总结
- K8s高可用集群核心是3节点控制平面+etcd集群+LB负载均衡,避免单点故障;
- 搭建流程:环境准备 → LB部署 → 第一个Master初始化 → 其他Master/Node加入 → 验证;
- 运维重点关注证书更新、etcd备份、LB高可用,确保集群长期稳定运行。