Kubernetes高可用集群部署教程

核心组件速览

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-apiserverapiserver 把指令记在 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.ioregistry.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

命令执行成功后,会输出两段重要的命令,请务必保存好:

  1. 加入其他控制平面节点(Master)的命令 (包含 --control-plane 参数)。
  2. 加入工作节点(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
相关推荐
iuu_star2 小时前
Dify网址打不开-解决方案
docker
小羽网安2 小时前
Linux 服务器如何进行安全加固?
linux·服务器·安全
念风2 小时前
[Linux学习笔记]Uboot-DM的分析过程
linux
想唱rap3 小时前
计算机网络基础
linux·计算机网络·mysql·ubuntu·bash
风向决定发型丶3 小时前
K8S PDB介绍
云原生·容器·kubernetes
fetasty3 小时前
chroot的Linux服务配置-当云服务器真正用起来
android·linux·服务器
翱翔-蓝天3 小时前
WSL + Docker + GPU 安装 video-subtitle-remover 完整文档
运维·docker·容器
江湖有缘3 小时前
PanCheck 容器化部署:自建网盘链接检测服务全流程
docker
BullSmall3 小时前
linux 系统下模拟网络丢失和ping延迟,可以怎么来模拟
linux·网络·php