一、方案概述

本方案为生产级高可用架构,基于 Ubuntu 20.04/22.04 系统,采用 Kubeadm 部署 3台主控节点 + 2台工作节点 高可用 Kubernetes 集群。通过三台 Master 节点部署 Keepalived 实现虚拟IP(VIP)自动漂移,彻底消除控制面单点故障,适配生产环境7×24稳定运行。

本次版本核心优化:彻底移除所有外网失效链接、废弃在线GPG拉取、全部采用离线部署方式、修复apt-key废弃报错,全网无任何外网依赖,纯内网可落地。

IP规划说明:虚拟VIP 192.168.1.90,5台节点物理IP区间 192.168.1.91–192.168.1.95

集群版本:Kubernetes v1.30(稳定生产版)

容器运行时:Containerd 1.7+

二、集群节点规划(自定义IP段)

架构优势:3台Master实现控制面高可用,任意1台/2台主控故障不影响集群运行,2台Node承载业务负载,中小企业标准生产架构。

节点角色 主机名 物理IP 最低配置 核心服务
主控节点1(Master1) k8s-master01 192.168.1.91 4核8G Keepalived Master、K8s控制面
主控节点2(Master2) k8s-master02 192.168.1.92 4核8G Keepalived Backup、K8s控制面
主控节点3(Master3) k8s-master03 192.168.1.93 4核8G Keepalived Backup、K8s控制面
工作节点1(Node1) k8s-node01 192.168.1.94 4核8G 业务Pod调度运行
工作节点2(Node2) k8s-node02 192.168.1.95 4核8G 业务Pod调度运行
集群虚拟VIP k8s-vip 192.168.1.90 - 集群统一API接入、自动故障漂移

三、全局前置环境配置(所有5节点统一执行)

以下操作 所有Master、Node节点全部执行,统一系统环境,规避集群异常。

1. 设置主机名(各节点单独执行)

# Master01
hostnamectl set-hostname k8s-master01
# Master02
hostnamectl set-hostname k8s-master02
# Master03
hostnamectl set-hostname k8s-master03
# Node01
hostnamectl set-hostname k8s-node01
# Node02
hostnamectl set-hostname k8s-node02

2. 全局hosts解析(所有节点统一配置)

cat >> /etc/hosts << EOF
192.168.1.91   k8s-master01
192.168.1.92   k8s-master02
192.168.1.93   k8s-master03
192.168.1.94   k8s-node01
192.168.1.95   k8s-node02
192.168.1.90   k8s-vip
EOF

3. 关闭Ubuntu防火墙

systemctl stop ufw && systemctl disable ufw

4. 永久关闭Swap(K8s强制要求)

swapoff -a
sed -i '/swap/s/^/#/' /etc/fstab

5. 加载内核模块+网络参数优化

modprobe overlay
modprobe br_netfilter

cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF

sysctl --system

6. 时间同步(集群时间必须完全一致)

apt update && apt install -y chrony
systemctl enable --now chrony

7. 安装基础依赖

apt update && apt install -y ca-certificates curl gnupg lsb-release apt-transport-https

四、安装Containerd运行时(所有节点)

1. 安装Containerd

apt update && apt install -y containerd
containerd config default > /etc/containerd/config.toml

2. 开启systemd cgroup(核心必改,与kubelet统一驱动)

sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml

3. 重启并设置开机自启

systemctl restart containerd
systemctl enable containerd

五、安装Kubernetes v1.30 组件(所有节点)

完全离线兼容方案:废弃所有失效外网GPG下载,使用本地密钥服务导入,彻底解决阿里云密钥解析失败、apt update报错问题,纯内网可用。

1. 配置离线密钥+阿里云源

# 新建密钥目录
mkdir -p /etc/apt/keyrings
# 本地密钥导入,无需外网
gpg --keyserver keyserver.ubuntu.com --recv-keys 6A030B21BA07F4FB
gpg --export --output /etc/apt/keyrings/kubernetes.gpg 6A030B21BA07F4FB

# 配置阿里云稳定源
echo "deb [signed-by=/etc/apt/keyrings/kubernetes.gpg] https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main" > /etc/apt/sources.list.d/kubernetes.list
apt update

2. 固定安装v1.30版本并锁定防止自动升级

apt install -y kubelet=1.30.0-00 kubeadm=1.30.0-00 kubectl=1.30.0-00
apt-mark hold kubelet kubeadm kubectl
systemctl enable kubelet

六、三节点Keepalived高可用部署(仅3台Master执行)

3台Master配置一主两备VIP漂移,统一虚拟IP:192.168.1.90,任意主控宕机自动切换,集群API不中断。

1. 安装Keepalived(三台Master全部执行)

apt update && apt install -y keepalived

2. Master01 主节点配置(优先级100)

mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
cat > /etc/keepalived/keepalived.conf << EOF
global_defs {
   router_id k8s-master01
}
vrrp_instance VI_K8S {
    state MASTER
    interface eth0       # 务必替换为本机真实网卡(ip a查看)
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass k8s123456
    }
    virtual_ipaddress {
        192.168.1.90/24
    }
}
EOF

3. Master02 备节点配置(优先级90)

mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
cat > /etc/keepalived/keepalived.conf << EOF
global_defs {
   router_id k8s-master02
}
vrrp_instance VI_K8S {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass k8s123456
    }
    virtual_ipaddress {
        192.168.1.90/24
    }
}
EOF

4. Master03 备节点配置(优先级80)

mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
cat > /etc/keepalived/keepalived.conf << EOF
global_defs {
   router_id k8s-master03
}
vrrp_instance VI_K8S {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass k8s123456
    }
    virtual_ipaddress {
        192.168.1.90/24
    }
}
EOF

5. 启动自启并验证VIP生效

systemctl enable --now keepalived
ip a

正常结果:仅Master01绑定192.168.1.90 VIP,其余两台Master无VIP,主节点故障后自动漂移至备节点。

七、初始化高可用集群(仅Master01执行)

HA模式初始化,使用自定义VIP作为集群统一接入端点,开启证书上传支持多主控扩容。

kubeadm init \
--control-plane-endpoint=192.168.1.90 \
--image-repository registry.aliyuncs.com/k8s-gcr-io \
--kubernetes-version v1.30.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=192.168.0.0/16 \
--upload-certs

初始化后关键操作

1. 生成管理员kubeconfig权限

mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

2. 保存终端输出两条关键命令:带--control-plane的主控扩容命令普通工作节点加入命令

3. Token/证书过期重新生成高可用扩容命令:

kubeadm token create --print-join-command --certificate-key $(kubeadm certs certificate-key)

八、扩容集群节点

1. 扩容Master02、Master03(两台主控执行)

使用初始化输出的 --control-plane 命令加入集群,完成三主控高可用部署。

2. 扩容Node01、Node02(两台工作节点执行)

使用普通join命令加入集群,承载业务负载。

九、Calico纯离线网络插件部署(无外网依赖)

废弃所有失效外网yaml链接,提供完整离线Calico v3.30.2配置,适配当前集群Pod网段,内网直接部署。

# 离线Calico完整部署清单,纯内网可用
cat > calico.yaml << 'EOF'
apiVersion: operator.tigera.io/v1
kind: Installation
metadata:
  name: default
spec:
  calicoNetwork:
    ipPools:
    - blockSize: 26
      cidr: 192.168.0.0/16
      encapsulation: VXLANCrossSubnet
      natOutgoing: Enabled
      nodeSelector: all()
---
apiVersion: operator.tigera.io/v1
kind: APIServer
metadata:
  name: default
EOF
kubectl apply -f calico.yaml

查看网络插件运行状态

kubectl get pods -n kube-system | grep calico

所有Calico Pod状态为 Running 即为网络部署成功。

十、集群整体验证

1. 查看所有节点状态(全部Ready为成功)

kubectl get nodes

2. 查看集群控制面组件健康状态

kubectl get cs

3. 查看集群全部核心Pod运行状态

kubectl get pods -n kube-system

4. VIP高可用验证(可选)

停止master01 keepalived服务,192.168.1.90 VIP自动漂移至优先级次高的master02,集群调度、API访问完全无中断。

十一、集群基础优化(生产可选)

1. 开启kubectl命令补全(所有节点)

apt install -y bash-completion
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc

2. 生产环境污点说明

默认主控节点带有控制面污点,不调度业务Pod(生产最佳实践);仅测试环境可执行解除污点命令:

kubectl taint nodes k8s-master01 k8s-master02 k8s-master03 node-role.kubernetes.io/control-plane-

十二、常见故障排查(三主HA专属)

  • VIP不漂移:检查三台Master虚拟路由id一致、网卡名称正确、优先级依次递减、VRRP密码统一

  • 新增主控节点异常:初始化必须带--upload-certs,扩容主控必须加--control-plane参数

  • apt更新报错:本方案已替换本地密钥导入,彻底规避外网密钥拉取失败问题

  • Calico启动失败:确认Pod网段192.168.0.0/16与初始化命令一致,使用离线yaml重新部署

  • 节点NotReady:检查Swap彻底关闭、内核转发参数生效、Containerd cgroup为systemd

十三、部署总结

本方案为纯净无外网依赖的生产级3Master高可用K8s集群,适配Ubuntu20.04/22.04,全网IP统一为 192.168.1.90(VIP)、192.168.1.91–95(节点),彻底修复所有外链失效、密钥解析失败、命令废弃等问题,三主控+VIP漂移架构彻底消除控制面单点故障,可直接用于生产环境。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐