核心组件速览
1. 高可用(负责网络入口)
- Keepalived:负责管理虚拟 IP(VIP),一旦主节点挂了,它立刻把 VIP 漂移到备用节点,保证入口地址永远在线。
- HAProxy :监听 VIP 的请求,把流量均匀地分发给后端的多个
kube-apiserver,避免单点过载。
2. 控制平面(Master 节点核心)
- kube-apiserver :集群的唯一入口,所有指令(增删改查)都必须经过它,它负责验证权限并处理请求。
- etcd :集群的记忆中枢,保存了集群所有的配置和状态数据。如果它丢了,集群就"失忆"了。
- kube-controller-manager :负责维持现状,比如你要求跑 3 个副本,它发现只有 2 个在跑,就会立刻拉起第 3 个。
- kube-scheduler :负责分配任务,决定新创建的 Pod 应该去哪个节点上运行(比如看哪个节点资源空闲)。
3. 节点与操作
- containerd :真正的容器运行时,负责去下载镜像、启动容器、管理容器生命周期。
- kubectl :你(管理员)用来跟集群对话的命令行工具 ,通过它向
kube-apiserver发送指令。
一句话总结它们的关系: kubectl 发出指令,通过 Keepalived+HAProxy 的通道,发给 kube-apiserver ;apiserver 把指令记在 etcd 上,并指挥 Scheduler 选个地儿,Controller 盯着执行,最后由节点上的 containerd 把容器跑起来。
一、集群规划与环境准备
| IP地址 | 主机名 | 角色 | 核心组件 |
|---|---|---|---|
| 192.168.174.111 | k8s-master-01 |
主节点(控制平面) | kube-apiserver, kube-controller-manager, kube-scheduler, etcd, containerd, kubectl,HAProxy,Keepalived |
| 192.168.174.112 | k8s-master-02 |
主节点(控制平面) | kube-apiserver, kube-controller-manager, kube-scheduler, etcd, containerd, kubectl,HAProxy,Keepalived |
| 192.168.174.113 | k8s-master-03 |
主节点(控制平面) | kube-apiserver, kube-controller-manager, kube-scheduler, etcd, containerd, kubectl,HAProxy,Keepalived |
| 192.168.174.114 | k8s-worker-01 |
从节点(工作节点) | kubelet, kube-proxy, containerd, Calico |
| 192.168.174.115 | k8s-worker-02 |
从节点(工作节点) | kubelet, kube-proxy, containerd, Calico |
| 192.168.174.200 | k8s-vip | 虚拟IP | 使用的Keepalived不需要额外机器,部署在master上 |
1.2 基础环境初始化(所有节点执行)
1. 配置主机名与 Hosts 解析(所有节点执行)
# 在所有节点的 /etc/hosts 文件中追加以下内容
cat >> /etc/hosts <<EOF
192.168.174.111 k8s-master-01
192.168.174.112 k8s-master-02
192.168.174.113 k8s-master-03
192.168.174.114 k8s-worker-01
192.168.174.115 k8s-worker-02
192.168.174.200 k8s-vip
EOF
2. 关闭防火墙、SELinux 和 Swap(所有节点执行)
K8s 对网络要求严格,建议关闭防火墙(生产环境可配置规则),且必须关闭 Swap 分区,否则 Kubelet 无法启动。
# 关闭防火墙
systemctl stop firewalld && systemctl disable firewalld
# 关闭 SELinux
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
# 关闭 Swap (临时+永久)
swapoff -a
sed -i 's/.*swap.*/#&/' /etc/fstab
3. 配置内核参数与网桥过滤(所有节点执行)
这是为了让容器网络能够正确通过 iptables 进行转发。
# 加载 br_netfilter 模块
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
modprobe br_netfilter
# 配置内核参数
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
4. 时间同步(所有节点执行)
集群节点时间不一致会导致证书验证失败。
yum install -y chrony
systemctl start chronyd && systemctl enable chronyd
chronyc sources -v
二、安装容器运行时与 K8s 组件(所有节点)
国内无法直接访问 k8s.gcr.io 或 registry.k8s.io,我们将使用阿里云的镜像源。
2.1 安装 Containerd
推荐使用 containerd 作为容器运行时(需配合 cri-dockerd 或原生支持,这里演示标准的 containerd 配置)。
# 安装依赖
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# 添加阿里云的 Docker CE 源
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安装 containerd
sudo yum install -y containerd.io
# 生成默认配置文件
sudo mkdir -p /etc/containerd
sudo containerd config default | sudo tee /etc/containerd/config.toml
# 修改配置,使用国内镜像源并启用 SystemdCgroups
# 1. 修改 pause 镜像地址
sudo sed -i 's|registry.k8s.io/pause|registry.aliyuncs.com/google_containers/pause|g' /etc/containerd/config.toml
# 2. 启用 SystemdCgroups
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
# 重启并设置开机自启
sudo systemctl restart containerd
sudo systemctl enable containerd
2.2 安装 Kubeadm, Kubelet, Kubectl
配置阿里云的 Kubernetes YUM 源。
# 添加阿里云的 Kubernetes 源
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[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
# 安装指定版本的 k8s 组件 (以 v1.28.2 为例)
yum install -y kubelet-1.28.2 kubeadm-1.28.2 kubectl-1.28.2
# 设置 kubelet 开机自启 (此时先不启动)
systemctl enable kubelet
三、配置高可用负载均衡 (Keepalived + HAProxy)
为了实现高可用,我们需要在 3 台 Master 节点上部署 HAProxy 作为负载均衡器,Keepalived 用于管理 VIP(虚拟 IP)。
3.1 安装软件(仅在 3 台 Master 上执行)
yum install -y keepalived haproxy
3.2 配置 HAProxy
# 在三台 Master 节点上,备份并编辑配置文件
cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak
tee /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
stats socket /var/lib/haproxy/stats
defaults
mode tcp
log global
option tcplog
option dontlognull
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
# 前端:监听 VIP 的 6444 端口
frontend kubernetes-apiserver
mode tcp
bind *:16443
default_backend kubernetes-apiserver
# 后端:负载均衡到三个 Master 节点的 6443 端口
backend kubernetes-apiserver
mode tcp
balance roundrobin
option tcp-check
server test-111 192.168.174.111:6443 check fall 3 rise 2
server test-112 192.168.174.112:6443 check fall 3 rise 2
server test-113 192.168.174.113:6443 check fall 3 rise 2
EOF
3.3 配置 Keepalived
Keepalived 用于管理虚拟IP (VIP),实现高可用。我们需要在三台 Master 上创建不同的配置文件。
-
在
k8s-master-01(备用节点)上执行:sudo tee /etc/keepalived/keepalived.conf <<EOF
global_defs {
router_id LVS_DEVEL
}vrrp_script chk_haproxy {
script "killall -0 haproxy"
interval 2
weight -20
}vrrp_instance VI_1 {
state MASTER
interface ens33 # 根据实际网卡名称修改
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.174.200
}
track_script {
chk_haproxy
}
}
EOF -
在
k8s-master-02(备用节点)上执行:注意:priority 值要低于 MASTER 节点
sudo tee /etc/keepalived/keepalived.conf <<EOF
global_defs {
router_id LVS_DEVEL
}vrrp_script chk_haproxy {
script "killall -0 haproxy"
interval 2
weight -20
}vrrp_instance VI_1 {
state BACKUP
interface ens33 # 根据实际网卡名称修改
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.174.200
}
track_script {
chk_haproxy
}
}
EOF
在 k8s-master-03(备用节点)上执行:
# 注意:priority 值要低于 MASTER 节点
sudo tee /etc/keepalived/keepalived.conf <<EOF
global_defs {
router_id LVS_DEVEL
}
vrrp_script chk_haproxy {
script "killall -0 haproxy"
interval 2
weight -20
}
vrrp_instance VI_1 {
state BACKUP
interface ens33 # 根据实际网卡名称修改
virtual_router_id 51
priority 80
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.174.200
}
track_script {
chk_haproxy
}
}
EOF
3.4 启动服务
在 3 台 Master 上启动服务:
systemctl start haproxy && systemctl enable haproxy
systemctl start keepalived && systemctl enable keepalived

四、初始化集群
4.1 初始化 k8s-master-01
在 k8s-master-01 上执行。注意 --control-plane-endpoint 指向 VIP 地址。
kubeadm init \
--control-plane-endpoint "192.168.174.200:6443" \
--upload-certs \
--image-repository registry.aliyuncs.com/google_containers \
--pod-network-cidr=10.244.0.0/16
命令执行成功后,会输出两段重要的命令,请务必保存好:
- 加入其他控制平面节点(Master)的命令 (包含
--control-plane参数)。 - 加入工作节点(Worker)的命令。
配置 kubectl 初始化完成在主节点需要执行的命令,另外两台Master加入集群后也会提示需要执行这些命令:


五、安装网络插件 (CNI)
集群目前没有网络,Pod 无法通信。这里使用 Calico
5.1 在 k8s-master-01 上执行
wget https://ghproxy.net/https://raw.githubusercontent.com/projectcalico/calico/v3.27.4/manifests/calico.yaml
由于网络问题直接应用 calico.yaml 可能会失败,所以我采用手动下载镜像然后打包导入到 k8s 集群当中,然后在应用 calico.yaml 文件。
5.2 使用docker下载镜像
docker pull calico/node:v3.27.4
docker pull calico/cni:v3.27.4
docker pull calico/kube-controllers:v3.27.4
docker pull calico/pod2daemon-flexvol:v3.27.4
docker pull calico/typha:v3.27.4
docker pull calico/csi:v3.27.4
docker pull calico/node-driver-registrar:v3.27.4
5.3 打包镜像
docker save -o calico-all-v3.27.4.tar \
calico/node:v3.27.4 \
calico/cni:v3.27.4 \
calico/kube-controllers:v3.27.4 \
calico/pod2daemon-flexvol:v3.27.4 \
calico/typha:v3.27.4 \
calico/csi:v3.27.4 \
calico/node-driver-registrar:v3.27.4
5.4 五台机器都需要导入镜像(calico-all-v3.27.4.tar)
ctr -n k8s.io images import calico-all-v3.27.4.tar
验证是否导入成功
ctr -n k8s.io images list | grep calico

5.5 将 Calico 网络插件的配置文件(calico.yaml)应用到 Kubernetes 集群
kubectl apply -f calico.yaml
查看系统组件运行状态
kubectl get pods -n kube-system

六、验证集群状态
在 Master 节点上查看:
kubectl get nodes
