转行小白也能一次成功的 Kubernetes v1.32 高可用集群部署指南(Ubuntu 22.04 + 国内环境 + 保姆级)
摘要:本文面向零基础转行运维/云原生的小白,手把手教你在国内家庭宽带环境下,不踩坑、不报错、一次性搭建出生产级的 Kubernetes v1.32 高可用集群(3 Master + 6 Node)。全程使用国内镜像源,无需翻墙,每一步均可复制粘贴,附完整验证命令与排错指南。
一、写在前面:为什么你之前安装总失败?
很多教程之所以让小白"反复折腾",通常踩了这几个坑:
| 坑点 | 后果 | 本文解决方案 |
|---|---|---|
默认拉取 k8s.gcr.io 镜像 | 国内超时/失败 | 全程使用阿里云 registry.aliyuncs.com/google_containers 镜像源 |
| 使用 Docker 作为运行时 | k8s 1.24+ 已移除 dockershim,配置复杂 | 使用官方推荐的 containerd,轻量且原生支持 |
| 命令行参数初始化 | 漏一个参数就全盘重来 | 使用 kubeadm 配置文件 初始化,参数集中管理 |
| 没有负载均衡器 | 单 Master 故障 = 集群瘫痪 | 3 Master + Keepalived + HAProxy 高可用方案 |
| 内核参数没配好 | 网络不通、DNS 异常 | 每一步都带 验证命令,确保没问题再往下走 |
本文架构设计:
[ 你的电脑 / 运维机 ]
|
[VIP: 10.10.1.100:6443]
[Keepalived + HAProxy 负载均衡]
|
-----------------------------------------
| | |
[k8s-master01] [k8s-master02] [k8s-master03]
10.10.1.10 10.10.1.11 10.10.1.12
(自带 etcd) (自带 etcd) (自带 etcd)
| | |
-----------------------------------------
|
-----------------------------------------
| | | | | |
[N1] [N2] [N3] [N4] [N5] [N6]
.21 .22 .23 .24 .25 .26
二、环境规划(请严格按照此表配置)
2.1 节点规划
| 角色 | 主机名 | IP 地址 | 配置要求 | OS |
|---|---|---|---|---|
| Master01 | k8s-master01 | 10.10.1.10 | 2C4G+ | Ubuntu 22.04 |
| Master02 | k8s-master02 | 10.10.1.11 | 2C4G+ | Ubuntu 22.04 |
| Master03 | k8s-master03 | 10.10.1.12 | 2C4G+ | Ubuntu 22.04 |
| Node01 | k8s-node01 | 10.10.1.21 | 2C4G+ | Ubuntu 22.04 |
| Node02 | k8s-node02 | 10.10.1.22 | 2C4G+ | Ubuntu 22.04 |
| Node03 | k8s-node03 | 10.10.1.23 | 2C4G+ | Ubuntu 22.04 |
| Node04 | k8s-node04 | 10.10.1.24 | 2C4G+ | Ubuntu 22.04 |
| Node05 | k8s-node05 | 10.10.1.25 | 2C4G+ | Ubuntu 22.04 |
| Node06 | k8s-node06 | 10.10.1.26 | 2C4G+ | Ubuntu 22.04 |
| 虚拟IP | — | 10.10.1.100 | 不占用实体机 | 由 Keepalived 漂移 |
2.2 网络规划(提前定好,避免冲突)
| 网络类型 | CIDR | 说明 |
|---|---|---|
| Pod 网络 | 172.16.0.0/16 | Calico 使用 |
| Service 网络 | 10.96.0.0/12 | ClusterIP 使用 |
| 虚拟 IP | 10.10.1.100 | Keepalived 漂移地址 |
注意:请确保
172.16.0.0/16和10.96.0.0/12不与你的内网网段冲突。如果冲突,请替换为其他私有网段。
三、基础环境初始化(所有 9 台节点都要执行)
执行范围:k8s-master01 ~ k8s-master03、k8s-node01 ~ k8s-node06
执行用户:root(全程使用 root,避免权限问题)
3.1 设置主机名(根据节点角色选择对应命令)
# 在 10.10.1.10 执行
hostnamectl set-hostname k8s-master01
# 在 10.10.1.11 执行
hostnamectl set-hostname k8s-master02
# 在 10.10.1.12 执行
hostnamectl set-hostname k8s-master03
# 在 10.10.1.21 执行
hostnamectl set-hostname k8s-node01
# 在 10.10.1.22 执行
hostnamectl set-hostname k8s-node02
# 在 10.10.1.23 执行
hostnamectl set-hostname k8s-node03
# 在 10.10.1.24 执行
hostnamectl set-hostname k8s-node04
# 在 10.10.1.25 执行
hostnamectl set-hostname k8s-node05
# 在 10.10.1.26 执行
hostnamectl set-hostname k8s-node06
3.2 配置 hosts 解析(所有节点执行)
cat >> /etc/hosts << 'EOF'
10.10.1.10 k8s-master01
10.10.1.11 k8s-master02
10.10.1.12 k8s-master03
10.10.1.21 k8s-node01
10.10.1.22 k8s-node02
10.10.1.23 k8s-node03
10.10.1.24 k8s-node04
10.10.1.25 k8s-node05
10.10.1.26 k8s-node06
10.10.1.100 k8s-vip
EOF
验证命令:
ping -c 2 k8s-master01
ping -c 2 k8s-node01
# 都能通说明 hosts 配置正确
3.3 更换 Ubuntu 国内源(所有节点执行)
# 备份原配置
cp /etc/apt/sources.list /etc/apt/sources.list.bak
# 写入阿里云源(Ubuntu 22.04 Jammy)
cat > /etc/apt/sources.list << 'EOF'
deb http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
EOF
apt update
3.4 关闭 Swap(所有节点执行)
k8s 官方要求关闭 swap,否则 kubelet 无法启动。
# 临时关闭
swapoff -a
# 永久关闭(注释掉 swap 行)
sed -i '/swap/s/^/#/' /etc/fstab
# 验证
free -h
# 看到 swap 行都是 0 就对了
3.5 关闭防火墙(所有节点执行)
systemctl stop ufw
systemctl disable ufw
# 验证
systemctl status ufw
# 看到 inactive (dead) 就对了
3.6 加载内核模块(所有节点执行)
# 写入模块配置
cat > /etc/modules-load.d/k8s.conf << 'EOF'
overlay
br_netfilter
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack
EOF
# 立即加载
modprobe overlay
modprobe br_netfilter
modprobe ip_vs
modprobe ip_vs_rr
modprobe ip_vs_wrr
modprobe ip_vs_sh
modprobe nf_conntrack
# 验证
lsmod | grep -E "overlay|br_netfilter|ip_vs"
# 能看到这些模块说明成功
3.7 配置内核参数(所有节点执行)
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
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.rp_filter = 0
EOF
# 立即生效
sysctl --system
# 验证
sysctl net.bridge.bridge-nf-call-iptables
# 返回 1 说明成功
3.8 安装基础工具(所有节点执行)
apt install -y apt-transport-https ca-certificates curl gnupg lsb-release \
software-properties-common vim wget net-tools ipvsadm ipset telnet
3.9 时间同步(所有节点执行)
apt install -y chrony
systemctl enable chrony --now
# 验证
chronyc sources
# 看到 ^* 开头表示已同步
四、安装 Containerd 容器运行时(所有节点执行)
k8s 1.32 官方推荐使用 containerd,比 Docker 更轻量,且无需 dockershim 适配层。
4.1 安装 Containerd
# 安装 containerd
apt install -y containerd
# 生成默认配置
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml
4.2 配置 Containerd(关键步骤)
需要修改三个地方:cgroup 驱动为 systemd、配置国内镜像加速、配置 sandbox 镜像地址。
# 修改 cgroup 驱动为 systemd(与 Ubuntu 22.04 默认一致)
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
# 修改 sandbox_image 为阿里云地址(否则 pause 镜像拉取失败)
sed -i 's|sandbox_image = "registry.k8s.io/pause:.*"|sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.10"|' /etc/containerd/config.toml
手动追加镜像加速配置(解决国内拉取 docker.io 等镜像超时问题):
cat >> /etc/containerd/config.toml << 'EOF'
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://docker.m.daocloud.io", "https://docker.xuanyuan.me"]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."registry.k8s.io"]
endpoint = ["https://swr.cn-north-4.myhuaweicloud.com/ddn-k8s/registry.k8s.io"]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."k8s.gcr.io"]
endpoint = ["https://swr.cn-north-4.myhuaweicloud.com/ddn-k8s/k8s.gcr.io"]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."gcr.io"]
endpoint = ["https://swr.cn-north-4.myhuaweicloud.com/ddn-k8s/gcr.io"]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."ghcr.io"]
endpoint = ["https://swr.cn-north-4.myhuaweicloud.com/ddn-k8s/ghcr.io"]
EOF
4.3 启动 Containerd
systemctl daemon-reload
systemctl enable containerd --now
# 验证
systemctl status containerd
ctr version
# 看到 Active: active (running) 说明成功
五、安装 Kubernetes 组件(所有节点执行)
5.1 添加 Kubernetes 国内 APT 源
官方源
apt.kubernetes.io在国内几乎无法访问,必须使用阿里云镜像。
# 创建 keyrings 目录
mkdir -p /etc/apt/keyrings
# 下载阿里云 GPG 密钥
curl -fsSL https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
# 添加阿里云 apt 源(注意:xenial 是仓库代号,Ubuntu 22.04 也适用)
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main" | tee /etc/apt/sources.list.d/kubernetes.list
apt update
5.2 安装指定版本(锁定 v1.32)
# 查看可用版本(确认有 1.32)
apt-cache madison kubelet | grep 1.32
# 安装 1.32 最新补丁版本(当前是 1.32.7,如有更新请替换)
VERSION="1.32.7-1.1"
apt install -y kubelet=$VERSION kubeadm=$VERSION kubectl=$VERSION
# 锁定版本,防止自动升级导致集群不一致
apt-mark hold kubelet kubeadm kubectl
# 验证
kubeadm version
kubectl version --client
kubelet --version
# 都显示 v1.32.x 说明成功
5.3 启动 Kubelet
systemctl enable kubelet --now
# 此时 kubelet 会处于重启状态,这是正常的(等待集群初始化)
systemctl status kubelet
六、部署 Keepalived + HAProxy(仅在 3 台 Master 执行)
为了实现高可用,我们需要一个虚拟 IP(10.10.1.100)作为 3 台 Master 的统一入口。Keepalived 负责 VIP 漂移,HAProxy 负责将 6443 端口负载均衡到 3 台 Master。
6.1 安装软件(3 台 Master)
apt install -y keepalived haproxy
6.2 配置 HAProxy(3 台 Master 配置相同)
mv /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak
cat > /etc/haproxy/haproxy.cfg << 'EOF'
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin
stats timeout 30s
user haproxy
group haproxy
daemon
maxconn 4000
defaults
mode tcp
log global
option tcplog
option dontlognull
timeout connect 5s
timeout client 50s
timeout server 50s
frontend k8s-apiserver
bind *:6443
mode tcp
default_backend k8s-apiserver-backend
backend k8s-apiserver-backend
mode tcp
option tcp-check
balance roundrobin
server k8s-master01 10.10.1.10:6443 check fall 2 rise 2
server k8s-master02 10.10.1.11:6443 check fall 2 rise 2
server k8s-master03 10.10.1.12:6443 check fall 2 rise 2
listen stats
bind *:1080
mode http
stats enable
stats uri /stats
stats refresh 5s
EOF
6.3 配置 Keepalived(3 台 Master 分别配置)
Master01(10.10.1.10)配置——主节点:
cat > /etc/keepalived/keepalived.conf << 'EOF'
global_defs {
router_id LVS_K8S
script_user root
enable_script_security
}
vrrp_script check_haproxy {
script "/etc/keepalived/check_haproxy.sh"
interval 3
weight -15
fall 2
rise 1
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass K8sHA@2026
}
virtual_ipaddress {
10.10.1.100/24
}
track_script {
check_haproxy
}
}
EOF
Master02(10.10.1.11)配置——备节点1:
cat > /etc/keepalived/keepalived.conf << 'EOF'
global_defs {
router_id LVS_K8S
script_user root
enable_script_security
}
vrrp_script check_haproxy {
script "/etc/keepalived/check_haproxy.sh"
interval 3
weight -15
fall 2
rise 1
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass K8sHA@2026
}
virtual_ipaddress {
10.10.1.100/24
}
track_script {
check_haproxy
}
}
EOF
Master03(10.10.1.12)配置——备节点2:
cat > /etc/keepalived/keepalived.conf << 'EOF'
global_defs {
router_id LVS_K8S
script_user root
enable_script_security
}
vrrp_script check_haproxy {
script "/etc/keepalived/check_haproxy.sh"
interval 3
weight -15
fall 2
rise 1
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 80
advert_int 1
authentication {
auth_type PASS
auth_pass K8sHA@2026
}
virtual_ipaddress {
10.10.1.100/24
}
track_script {
check_haproxy
}
}
EOF
注意:
interface ens33请替换为你实际的网卡名(通过ip addr查看)。
6.4 创建健康检查脚本(3 台 Master)
cat > /etc/keepalived/check_haproxy.sh << 'EOF'
#!/bin/bash
if ! pgrep -x "haproxy" > /dev/null; then
systemctl stop keepalived
exit 1
fi
exit 0
EOF
chmod +x /etc/keepalived/check_haproxy.sh
6.5 启动服务(3 台 Master)
systemctl enable haproxy keepalived --now
systemctl restart haproxy keepalived
# 验证 VIP 是否在 Master01 上
ip addr | grep 10.10.1.100
# 能看到 10.10.1.100 说明 Keepalived 工作正常
验证负载均衡:
# 在任意节点测试 VIP 连通性
telnet 10.10.1.100 6443
# 能连通说明 HAProxy 正常
七、初始化 Kubernetes 高可用集群
7.1 创建 kubeadm 初始化配置文件(仅在 Master01 执行)
使用配置文件而非命令行参数,可以避免漏配、错配,且便于版本管理。
mkdir -p /etc/kubernetes/init
cat > /etc/kubernetes/init/kubeadm-init.yaml << 'EOF'
apiVersion: kubeadm.k8s.io/v1beta4
kind: InitConfiguration
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
nodeRegistration:
criSocket: unix:///run/containerd/containerd.sock
imagePullPolicy: IfNotPresent
name: k8s-master01
---
apiVersion: kubeadm.k8s.io/v1beta4
kind: ClusterConfiguration
kubernetesVersion: 1.32.7
controlPlaneEndpoint: "10.10.1.100:6443"
imageRepository: registry.aliyuncs.com/google_containers
networking:
dnsDomain: cluster.local
podSubnet: 172.16.0.0/16
serviceSubnet: 10.96.0.0/12
apiServer:
certSANs:
- k8s-vip
- k8s-master01
- k8s-master02
- k8s-master03
- 10.10.1.10
- 10.10.1.11
- 10.10.1.12
- 10.10.1.100
- 127.0.0.1
etcd:
local:
dataDir: /var/lib/etcd
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
ipvs:
strictARP: true
EOF
7.2 提前拉取镜像(所有 Master 节点执行)
关键步骤:提前拉取镜像可以避免初始化时网络超时导致失败。
# 在 Master01、Master02、Master03 分别执行
kubeadm config images pull --config /etc/kubernetes/init/kubeadm-init.yaml
验证镜像:
crictl images | grep registry.aliyuncs.com
# 应该能看到 kube-apiserver、kube-controller-manager 等 7 个镜像
如果提示
crictl命令不存在,安装一下:apt install -y cri-tools
7.3 初始化第一个 Master(仅在 Master01 执行)
kubeadm init --config /etc/kubernetes/init/kubeadm-init.yaml --upload-certs
预期输出(请务必保存这段输出):
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
You can now join any number of control-plane nodes running the following command on each as root:
kubeadm join 10.10.1.100:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:xxxxxxxx \
--control-plane --certificate-key xxxxxxxx
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 10.10.1.100:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:xxxxxxxx
7.4 配置 kubectl(仅在 Master01 执行)
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
# 验证
kubectl get nodes
# 应该能看到 k8s-master01,状态为 NotReady(正常,还没装网络插件)
八、加入其他 Master 节点(Master02、Master03)
8.1 复制证书并加入(在 Master02、Master03 分别执行)
使用 Master01 初始化输出中的 control-plane join 命令:
# 示例(请替换为你实际输出的 token 和 hash)
kubeadm join 10.10.1.100:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx \
--control-plane --certificate-key xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx \
--cri-socket unix:///run/containerd/containerd.sock
注意:
--certificate-key有效期只有 2 小时。如果超时了,在 Master01 上重新生成:kubeadm init phase upload-certs --upload-certs
8.2 配置 kubectl(在 Master02、Master03 执行)
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
8.3 验证 Master 高可用
kubectl get nodes
# 应该看到 3 个 master,状态都是 NotReady
九、加入 Node 工作节点(Node01 ~ Node06)
9.1 提前拉取 Node 所需镜像(6 台 Node 执行)
Node 节点只需要 kube-proxy 和 pause 镜像:
# 在 Node 节点上拉取
crictl pull registry.aliyuncs.com/google_containers/kube-proxy:v1.32.7
crictl pull registry.aliyuncs.com/google_containers/pause:3.10
9.2 加入集群(6 台 Node 分别执行)
使用 Master01 初始化输出中的 worker join 命令:
# 示例(请替换为你实际输出的 token 和 hash)
kubeadm join 10.10.1.100:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx \
--cri-socket unix:///run/containerd/containerd.sock
9.3 验证节点加入
在任意 Master 节点执行:
kubectl get nodes
# 应该看到 3 个 master + 6 个 node,共 9 个节点
十、安装 Calico 网络插件(仅在 Master01 执行)
没有 CNI 插件,节点状态会一直是 NotReady,Pod 也无法通信。
10.1 下载并修改 Calico 配置
cd /root
# 下载 Calico 官方 YAML(v3.29 版本,支持 k8s 1.32)
wget https://raw.githubusercontent.com/projectcalico/calico/v3.29.0/manifests/calico.yaml
# 修改 Pod CIDR(必须与你 kubeadm 配置中的一致)
sed -i 's|# - name: CALICO_IPV4POOL_CIDR|- name: CALICO_IPV4POOL_CIDR|' calico.yaml
sed -i 's|# value: "192.168.0.0/16"| value: "172.16.0.0/16"|' calico.yaml
10.2 解决 Calico 镜像国内拉取问题
Calico 默认从 docker.io 拉取,国内可能超时。我们有两种方案:
方案 A(推荐):使用华为云镜像代理(无需修改 YAML)
由于我们在 containerd 中已配置了 docker.io 的镜像加速(docker.m.daocloud.io 和 docker.xuanyuan.me),直接 apply 即可:
kubectl apply -f calico.yaml
方案 B:如果方案 A 拉取失败,手动替换镜像地址
# 将 docker.io 替换为华为云代理
sed -i 's|docker.io|m.daocloud.io/docker.io|g' calico.yaml
kubectl apply -f calico.yaml
10.3 等待 Calico 启动
watch kubectl get pods -n kube-system
# 等待所有 pod 状态变为 Running(约 2-5 分钟)
10.4 验证节点状态
kubectl get nodes
# 所有节点状态应该变为 Ready
十一、集群功能验证(恭喜你,到这里基本成功了!)
11.1 验证节点状态
kubectl get nodes -o wide
# 期望输出:9 个节点,STATUS 全部为 Ready
11.2 验证系统 Pod
kubectl get pods -n kube-system
# 期望输出:coredns、kube-proxy、calico-node 等全部 Running
11.3 验证高可用(VIP 漂移测试)
# 1. 查看当前 VIP 在哪台 Master
ip addr | grep 10.10.1.100
# 假设在 Master01
# 2. 关闭 Master01 的网络或关机
systemctl stop keepalived
# 3. 在 Master02 或 Master03 上查看 VIP 是否漂移过来
ip addr | grep 10.10.1.100
# 应该能看到 VIP 漂移到新的 Master
# 4. 验证集群仍然可用
kubectl get nodes
# 仍然能正常输出,说明高可用生效
11.4 部署测试应用
# 创建一个 nginx 测试 Pod
kubectl create deployment nginx --image=nginx:alpine --replicas=3
# 暴露为 NodePort 服务
kubectl expose deployment nginx --port=80 --type=NodePort
# 查看
kubectl get svc nginx
# 看到类似 80:3xxxx/TCP,用任意 NodeIP:NodePort 访问测试
十二、常用运维命令(建议收藏)
| 场景 | 命令 |
|---|---|
| 查看节点 | kubectl get nodes -o wide |
| 查看所有 Pod | kubectl get pods -A |
| 查看系统日志 | journalctl -xeu kubelet |
| 查看容器日志 | crictl logs <container-id> |
| 生成新的 join token | kubeadm token create --print-join-command |
| 重新上传证书 | kubeadm init phase upload-certs --upload-certs |
| 重置节点(慎用) | kubeadm reset -f |
十三、排错指南(遇到问题先看这里)
13.1 初始化失败,如何重置?
# 在失败的 Master 上执行
kubeadm reset -f
rm -rf /etc/kubernetes /var/lib/etcd $HOME/.kube
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
ipvsadm --clear
# 然后重新执行 kubeadm init
13.2 节点状态 NotReady
# 查看具体原因
kubectl describe node <node-name>
# 常见原因1:CNI 没装好
kubectl get pods -n kube-system | grep calico
# 常见原因2:kubelet 没启动
systemctl status kubelet
journalctl -xeu kubelet
13.3 镜像拉取失败(ImagePullBackOff)
# 查看具体镜像
kubectl describe pod <pod-name> -n <namespace>
# 手动拉取测试
crictl pull <镜像名>
# 检查 containerd 镜像加速配置
cat /etc/containerd/config.toml | grep -A 5 "registry.mirrors"
13.4 Keepalived VIP 不漂移
# 检查脚本权限
ls -l /etc/keepalived/check_haproxy.sh
# 手动执行测试
bash /etc/keepalived/check_haproxy.sh
echo $?
# 返回 0 表示正常
十四、总结
通过本文,你完成了以下工作:
- ✅ 9 台 Ubuntu 22.04 节点 的基础环境标准化配置
- ✅ Containerd 容器运行时的安装与国内镜像加速配置
- ✅ Keepalived + HAProxy 高可用负载均衡(VIP: 10.10.1.100)
- ✅ Kubeadm 初始化 v1.32.7 高可用集群(3 Master + 6 Node)
- ✅ Calico CNI 网络插件部署
- ✅ 完整的验证测试与排错指南
这个集群的特点:
- 任意 1 台 Master 宕机,集群仍可正常管理
- 全程使用国内源,无需翻墙
- 使用配置文件管理,便于后续维护和升级
- 每一步都有验证命令,确保不出错
如果本文对你有帮助,欢迎点赞、收藏、转发!有问题可以在评论区留言,我会持续更新维护这篇文章。
标签:#Kubernetes #K8s #高可用集群 #Ubuntu #Containerd #Calico #Keepalived #运维 #云原生 #转行
更多推荐

所有评论(0)