基于 Kubeadm 和 Containerd 部署 Kubernetes 高可用集群
·
基于 Kubeadm 和 Containerd 部署 Kubernetes 高可用集群
一、环境说明
基础配置
| 组件 | 版本/规格 |
|---|---|
| OS | Ubuntu Server 24.04 LTS |
| CRI | Containerd 2.2.1 |
| Kubernetes | 1.35.0 |
| 节点资源 | master节点4G、node节点2G、高可用/负载均衡节点1G |
节点规划
| IP | 主机名 | 角色 | 核心作用 |
|---|---|---|---|
| 10.0.0.112 | master1.wang.org | K8s集群主节点1(Master+etcd) | 控制平面核心+分布式存储节点 |
| 10.0.0.113 | master2.wang.org | K8s集群主节点2(Master+etcd) | 控制平面高可用冗余节点 |
| 10.0.0.114 | master3.wang.org | K8s集群主节点3(Master+etcd) | 控制平面高可用冗余节点 |
| 10.0.0.115 | node1.wang.org | K8s集群工作节点1 | 业务Pod运行载体 |
| 10.0.0.116 | node2.wang.org | K8s集群工作节点2 | 业务Pod运行载体 |
| 10.0.0.117 | node3.wang.org | K8s集群工作节点3 | 业务Pod运行载体 |
| 10.0.0.118 | ha1.wang.org | K8s主节点访问入口1(高可用+负载均衡) | VIP承载+ApiServer流量转发 |
| 10.0.0.119 | ha2.wang.org | K8s主节点访问入口2(高可用+负载均衡) | VIP漂移备份+流量转发冗余 |
| 10.0.0.100 | kubeapi.wang.org | VIP(在ha1/ha2实现) | 控制平面统一访问入口 |
二、前置准备(所有节点执行)
1. SSH Key验证(可选,master1执行)
# 生成密钥(一路回车即可,无密码更便捷)
ssh-keygen
# 分发密钥到所有节点(示例,需替换目标IP)
ssh-copy-id root@10.0.0.113
ssh-copy-id root@10.0.0.114
# 批量分发可循环处理(覆盖所有节点)
for i in {113..119};do ssh-copy-id root@10.0.0.$i;done
补充说明:
- 配置SSH免密登录可简化后续跨节点操作(如文件同步、命令执行),若节点IP范围变更,需对应调整循环中的IP段;
- 若执行
ssh-copy-id提示权限错误,可先通过密码登录目标节点,检查/root/.ssh目录权限(需为700)。
2. 安装rsyslog日志服务
apt update
apt install -y rsyslog
systemctl enable --now rsyslog
systemctl status rsyslog
补充说明:
- rsyslog用于集中管理节点日志,便于集群故障排查,安装后需确认服务状态为
active (running); - 生产环境建议配置日志远程转发(如至ELK集群),避免单节点日志丢失。
3. 主机名与域名解析
# 添加主机解析(所有节点本地生效)
cat >> /etc/hosts <<EOF
10.0.0.100 kubeapi.wang.org kubeapi
10.0.0.112 master1.wang.org master1
10.0.0.113 master2.wang.org master2
10.0.0.114 master3.wang.org master3
10.0.0.115 node1.wang.org node1
10.0.0.116 node2.wang.org node2
10.0.0.117 node3.wang.org node3
10.0.0.118 ha1.wang.org ha1
10.0.0.119 ha2.wang.org ha2
EOF
# 批量同步到其他节点(master1执行,确保所有节点解析一致)
for i in {113..119};do scp /etc/hosts root@10.0.0.$i:/etc/; done
补充说明:
- 主机名与IP映射需确保所有节点完全一致,否则会导致kube-apiserver、etcd等组件通信失败;
- 同步后可登录其他节点执行
cat /etc/hosts验证,或执行ping master1测试解析是否生效; - 生产环境建议部署DNS服务器(如CoreDNS)管理集群解析,替代hosts文件。
4. 时间同步
# 设置时区(统一为上海时区)
timedatectl set-timezone Asia/Shanghai
# 安装chrony时间同步工具
apt update && apt install chrony -y
# 修改配置文件,添加阿里云时间源(提升国内同步稳定性)
vim /etc/chrony/chrony.conf
# 新增/调整时间源配置(优先阿里云,后Ubuntu官方)
pool ntp.aliyun.com iburst maxsources 2
pool ntp.ubuntu.com iburst maxsources 4
pool 0.ubuntu.pool.ntp.org iburst maxsources 1
pool 1.ubuntu.pool.ntp.org iburst maxsources 1
pool 2.ubuntu.pool.ntp.org iburst maxsources 2
# 重启服务并设置开机自启
systemctl enable --now chrony
# 验证同步状态(*代表已成功同步)
chronyc sources
补充说明:
- K8s集群对时间同步要求严格(误差需控制在1秒内),时间偏差会导致证书验证失败、etcd数据不一致等问题;
chronyc sources输出中:*表示已同步到该时间源,?表示未同步,^表示同步中;- 若执行
chronyc sources无输出,需检查节点网络是否能访问NTP服务器(可临时关闭防火墙测试)。
5. 关闭防火墙
ufw disable
ufw status # 验证状态为“不活动(inactive)”
补充说明:
- Ubuntu默认使用ufw防火墙,关闭后需确认状态为
inactive;若使用iptables防火墙,需执行iptables -F && iptables -X && systemctl stop iptables清理规则并停止服务; - 生产环境建议按需开放端口(如6443、2379-2380、10250等),而非完全关闭防火墙,具体端口列表可参考K8s官方文档。
6. 禁用Swap
# 临时禁用Swap(立即生效)
swapoff -a
# 永久禁用Swap(注释/etc/fstab中的Swap分区)
sed -i '/swap/s/^/#/' /etc/fstab
补充说明:
- K8s要求禁用Swap(避免资源调度异常、性能下降),
swapoff -a为临时禁用,重启节点后失效;修改/etc/fstab可永久生效; - 验证:执行
swapon --show无输出则表示禁用成功;若仍有输出,需检查/etc/fstab是否注释完全,或重启节点后再次验证。
7. 内核优化
# 配置开机加载的内核模块(容器网络/存储依赖)
cat <<EOF | tee /etc/modules-load.d/k8s.conf
overlay # 容器存储层依赖
br_netfilter # 桥接网络iptables规则生效依赖
EOF
# 立即加载内核模块
modprobe overlay
modprobe br_netfilter
# 验证模块加载(输出overlay和br_netfilter则成功)
lsmod | grep -E 'overlay|br_netfilter'
# 设置sysctl网络参数(K8s网络通信必备)
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1 # 桥接流量触发iptables规则
net.bridge.bridge-nf-call-ip6tables = 1 # IPv6桥接流量触发iptables规则
net.ipv4.ip_forward = 1 # 开启IP转发(Pod跨节点通信必备)
EOF
# 应用sysctl参数(无需重启节点)
sysctl --system
补充说明:
overlay模块为Containerd的overlayfs存储驱动提供支持,br_netfilter确保容器网络的iptables规则生效;sysctl --system会重载所有sysctl配置文件,执行后可通过sysctl net.ipv4.ip_forward验证参数是否生效(输出1则成功);- 若执行
modprobe提示模块不存在,需检查内核版本是否兼容(Ubuntu 24.04默认内核已包含这些模块)。
三、高可用配置(ha1/ha2节点)
1. Keepalived(VIP管理)
安装
# 设置主机名(区分ha1/ha2)
hostnamectl hostname ha1 # ha1执行
hostnamectl hostname ha2 # ha2执行
# 安装keepalived
apt update && apt -y install keepalived
# 备份默认配置文件
cp /etc/keepalived/keepalived.conf.sample /etc/keepalived/keepalived.conf
配置ha1(主节点)
vim /etc/keepalived/keepalived.conf
global_defs {
router_id ha1.wang.org # 唯一标识,ha2需改为ha2.wang.org
}
# 监控haproxy服务状态(故障时降低节点优先级,触发VIP漂移)
vrrp_script check_haproxy {
script "killall -0 haproxy" # 检查haproxy进程是否存在
interval 1 # 检查间隔(秒)
weight -30 # 故障时优先级降低30
fall 3 # 连续3次失败判定为故障
rise 2 # 连续2次成功判定为恢复
timeout 2 # 检查超时时间(秒)
}
vrrp_instance VI_1 {
state MASTER # ha2需改为BACKUP
interface ens33 # 替换为节点实际网卡名称(ip addr查看)
garp_master_delay 10 # 抢占VIP后延迟发送ARP广播(避免网络抖动)
smtp_alert # 可选,开启邮件告警(需额外配置SMTP)
virtual_router_id 51 # ha1/ha2需相同(范围0-255)
priority 100 # ha2需改为80(优先级越高越易成为主节点)
advert_int 1 # VRRP通告间隔(秒)
authentication {
auth_type PASS # 认证类型
auth_pass 123456 # ha1/ha2需相同(自定义密码)
}
virtual_ipaddress {
10.0.0.100/24 dev ens33 label ens33:1 # VIP配置(ha1/ha2需相同)
}
track_script {
check_haproxy # 关联haproxy监控脚本
}
}
配置ha2(备节点)
vim /etc/keepalived/keepalived.conf
global_defs {
router_id ha2.wang.org # 唯一标识
}
vrrp_instance VI_1 {
state BACKUP # 备节点
interface ens33 # 替换为实际网卡名称
garp_master_delay 10
smtp_alert
virtual_router_id 51 # 与ha1保持一致
priority 80 # 低于ha1的100
advert_int 1
authentication {
auth_type PASS
auth_pass 123456 # 与ha1保持一致
}
virtual_ipaddress {
10.0.0.100/24 dev ens33 label ens33:1 # 与ha1保持一致
}
}
启动验证
systemctl restart keepalived
hostname -I # 验证VIP(10.0.0.100)是否存在
补充说明:
interface ens33需替换为节点实际网卡名称(可通过ip addr查看,通常为ens33、eth0等);- 验证高可用:停止ha1的keepalived服务(
systemctl stop keepalived),在ha2执行hostname -I应能看到VIP;恢复ha1服务后,VIP应漂移回ha1; - 若VIP未漂移,需检查:① ha1/ha2的virtual_router_id、auth_pass是否一致;② 节点间网络是否互通(ping测试);③ 防火墙是否关闭(VRRP使用组播224.0.0.18)。
2. Haproxy(负载均衡)
配置系统参数
# 允许haproxy监听VIP(即使VIP未绑定到本机)
cat >> /etc/sysctl.conf <<EOF
net.ipv4.ip_nonlocal_bind = 1
EOF
# 应用参数
sysctl -p
安装配置
apt -y install haproxy
vim /etc/haproxy/haproxy.cfg
# 保留原有配置,在文件末尾添加以下内容:
# 监控页面配置(查看后端节点状态)
listen stats
mode http
bind 0.0.0.0:8888
stats enable # 开启监控统计
log global
stats uri /status # 监控页面路径
stats auth admin:123456 # 监控页面账号密码
# K8s ApiServer负载均衡配置(四层TCP代理)
listen kubernetes-api-6443
bind 10.0.0.100:6443 # 监听VIP的6443端口
mode tcp # 四层TCP模式(适配ApiServer协议)
server master1 10.0.0.112:6443 check inter 3s fall 3 rise 3
# 集群初始化后启用master2/3(取消注释)
# server master2 10.0.0.113:6443 check inter 3s fall 3 rise 3
# server master3 10.0.0.114:6443 check inter 3s fall 3 rise 3
# 重启服务并验证状态
systemctl restart haproxy
systemctl is-active haproxy # 输出active则成功
验证
- 浏览器访问
http://10.0.0.100:8888/status(账号admin/123456),可查看后端节点健康状态; - 测试端口连通性:
telnet 10.0.0.100 6443(能连接则成功)。
补充说明:
mode tcp表示四层负载均衡(适配K8s Api-server的TCP协议),不可改为http;check inter 3s fall 3 rise 3:每3秒检查后端节点状态,连续3次失败标记为不可用,连续3次成功标记为可用;- 集群初始化完成后,需取消master2/3的注释,实现多master节点的负载均衡;
- 若监控页面显示master1为DOWN,需检查:① master1的6443端口是否开放;② ha1/ha2能否访问master1的6443端口(telnet测试)。
四、容器运行时配置(所有master/node节点)
1. 安装Containerd
# Ubuntu24.04通过官方源安装containerd
apt update && apt -y install containerd
# 设置开机自启并启动服务
systemctl enable --now containerd
# 验证安装(输出版本信息则成功)
systemctl status containerd
containerd -v
runc -v
ctr -v
# 生成默认配置文件(toml格式)
mkdir /etc/containerd/
containerd config default > /etc/containerd/config.toml
# 1. 替换pause镜像源为阿里云(解决国内网络问题)
sed -i "s#registry.k8s.io/pause:3.10.1#registry.aliyuncs.com/google_containers/pause:3.10.1#" /etc/containerd/config.toml
# 2. 配置Containerd的Cgroup驱动为systemd(与K8s一致)
sed -i "s#SystemdCgroup = false#SystemdCgroup = true#g" /etc/containerd/config.toml
# 3. 降低Containerd的OOM分数(防止被系统OOM杀死)
sed -i '/^\[plugins."io.containerd.grpc.v1.cri"\]/i oom_score = -999' /etc/containerd/config.toml
# 4. 配置镜像加速+私有仓库认证
#4.1配置Docker官方仓库镜像加速
mkdir -p /etc/containerd/certs.d/docker.io
cat << EOF > /etc/containerd/certs.d/docker.io/hosts.toml
server = "https://registry-1.docker.io"
[host."https://docker.m.daocloud.io"]
capabilities = ["pull", "resolve"]
[host."https://docker.1panel.live"]
capabilities = ["pull", "resolve"]
[host."https://docker.1ms.run"]
capabilities = ["pull", "resolve"]
[host."https://docker.xuanyuan.me"]
capabilities = ["pull", "resolve"]
EOF
#4.2配置K8S官方仓库镜像加速
mkdir -p /etc/containerd/certs.d/registry.k8s.io
cat << EOF > /etc/containerd/certs.d/registry.k8s.io/hosts.toml
server = "https://registry.k8s.io"
[host."https://registry.aliyuncs.com/google_containers"]
capabilities = ["pull", "resolve"]
EOF
#4.3配置私有仓库 (如 Harbor)
sudo mkdir -p /etc/containerd/certs.d/harbor.wang.org
cat << EOF > /etc/containerd/certs.d/harbor.wang.org/hosts.toml
server = "https://harbor.wang.org"
[host."https://harbor.wang.org"]
capabilities = ["pull", "resolve", "push"]
# 如果 Harbor 使用自签名证书,需要跳过 TLS 验证
# skip_verify = true
EOF
#配置认证信息:
#由于 hosts.toml 不直接支持用户名密码,认证信息仍需写在主配置文件 /etc/containerd/config.toml 中。在文件末尾添加:
[plugins."io.containerd.grpc.v1.cri".registry.configs."harbor.wang.org".auth]
username = "admin"
password = "123456"
# 重启Containerd使配置生效
systemctl restart containerd
# 批量同步配置到其他节点(master1执行)
for i in {112..117};do scp -r /etc/containerd/ root@10.0.0.$i:/etc/;done
补充说明:
- 当前环境使用 Ubuntu 24.04 官方源安装的 containerd 2.2.1(新版 v2 架构),配套 runc 1.3.4,为K8s 1.34/1.35推荐版本;
- 在 containerd 的新版本(特别是 2.x 系列,配置文件版本为 3)中,镜像仓库的配置方式发生了重大变化。旧的 registry.mirrors 配置方式已被废弃,推荐使用基于 hosts.toml 的模块化配置。
2.安装 CNI 插件(解决 Kubernetes Pod 创建失败)
containerd 自带的 CNI 插件版本太老 / 不兼容 K8s,必须手动安装标准 CNI 插件包才能正常跑 Pod。
Pod 报错类似:
network plugin is not ready: cni config uninitialized
failed to create pod sandbox
- cri-containerd 自带的 CNI 缺少配置文件
- 版本和 K8s 不兼容
#下载链接:https://github.com/containernetworking/plugins/releases
wget https://github.com/containernetworking/plugins/releases/download/v1.4.0/cni-plugins-linux-amd64-v1.4.0.tgz
tar xf cni-plugins-linux-amd64-v1.4.0.tgz -C /opt/cni/bin/
重启 containerd 生效
五、K8S组件安装(所有master/node节点)
1. 安装kubeadm/kubelet/kubectl
# 安装依赖包
apt-get update && apt-get install -y apt-transport-https
# 指定K8s版本(与集群初始化版本一致)
export K8S_VERSION=v1.35
# 添加阿里云K8s镜像源(解决国内无法访问官方源问题)
curl -fsSL https://mirrors.aliyun.com/kubernetes-new/core/stable/${K8S_VERSION}/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://mirrors.aliyun.com/kubernetes-new/core/stable/${K8S_VERSION}//deb/ /" | tee /etc/apt/sources.list.d/kubernetes.list
# 查看可安装的版本(可选,确认版本是否存在)
apt-cache madison kubeadm
apt list kubeadm kubectl kubelet
# 安装指定版本(示例为1.35.0,可根据需要修改)
apt -y install kubeadm=1.35.0-00 kubelet=1.35.0-00 kubectl=1.35.0-00
# 锁定版本(防止系统更新自动升级K8s组件)
apt-mark hold kubelet kubeadm kubectl
# 解锁版本(如需升级时执行)
# apt-mark unhold kubelet kubeadm kubectl
补充说明:
- 1.30版本后kubeadm、kubelet、kubectl无依赖关系,需单独指定版本安装;
- 安装后kubelet启动失败为正常现象(日志提示缺少/var/lib/kubelet/config.yaml),完成
kubeadm init/join后会自动生成配置文件并正常启动; - 验证安装:执行
kubeadm version、kubectl version --client应输出对应版本信息。
2. 命令补全(可选,提升操作效率)
# 安装补全依赖
apt update
apt install -y bash-completion
# 配置kubectl补全
kubectl completion bash | tee /etc/bash_completion.d/kubectl
# 配置kubeadm补全
kubeadm completion bash | tee /etc/bash_completion.d/kubeadm
# 立即生效(当前会话)
source /usr/share/bash-completion/bash_completion
source ~/.bashrc
# 永久生效(下次登录自动加载)
echo "source /etc/bash_completion.d/kubectl" >> ~/.bashrc
echo "source /etc/bash_completion.d/kubeadm" >> ~/.bashrc
# 测试补全功能(按两下Tab键应显示子命令)
kubeadm <Tab><Tab>
kubectl <Tab><Tab>
补充说明:
- 命令补全仅需在频繁执行kubectl/kubeadm的节点配置(如master1);
- 若补全功能不生效,需检查bash-completion是否安装成功,或重启终端后重试。
六、集群初始化与节点加入
1. 初始化master1节点
# 指定K8s版本
K8S_RELEASE_VERSION=1.35.0
# 集群初始化(仅执行一次)
kubeadm init \
--kubernetes-version=v${K8S_RELEASE_VERSION} \ # 指定K8s版本
--control-plane-endpoint kubeapi.wang.org \ # 高可用VIP/域名
--pod-network-cidr=10.244.0.0/16 \ # Pod网络网段(适配Flannel)
--service-cidr=10.96.0.0/12 \ # Service网络网段(K8s默认)
--token-ttl=0 \ # Token永不过期(方便后续加节点)
--image-repository=registry.aliyuncs.com/google_containers \ # 阿里云镜像仓库
--upload-certs \ # 自动上传证书(多master必备)
# 重置集群(如需重新初始化时执行)
# kubeadm reset -f
# rm -rf /etc/cni/net.d/ $HOME/.kube/config
# reboot
初始化成功后保存关键信息:
# master节点加入命令(包含证书密钥,敏感信息需妥善保存)
kubeadm join kubeapi.wang.org:6443 --token xxx --discovery-token-ca-cert-hash sha256:xxx --control-plane --certificate-key xxx
# worker节点加入命令
kubeadm join kubeapi.wang.org:6443 --token xxx --discovery-token-ca-cert-hash sha256:xxx
补充说明:
--control-plane-endpoint指定VIP/域名,确保多master节点的统一访问入口;--upload-certs上传的证书有效期为2小时,若超时需重新执行kubeadm init phase upload-certs --upload-certs生成新的证书密钥;- 初始化过程中若镜像拉取失败,可手动下载镜像后再执行(参考master2/3的镜像同步方法);
- 初始化成功后,需保存输出的join命令(包含token、cert-hash、certificate-key),后续加入节点需使用。
2. 配置kubectl授权(master1)
# 创建kubectl配置目录
mkdir -p $HOME/.kube
# 复制集群管理员配置文件
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# 修改配置文件权限(避免root用户操作时报错)
chown $(id -u):$(id -g) $HOME/.kube/config
补充说明:
- 若使用root用户操作,可直接执行
export KUBECONFIG=/etc/kubernetes/admin.conf临时生效; - 配置完成后执行
kubectl get nodes,应能看到master1节点(状态为NotReady,需安装网络插件后变为Ready)。
-
3. 加入其他master节点(master2/3)
步骤1:同步镜像(解决网络拉取失败)
# ========================
# 【master1】打包所有K8s镜像为离线包
# ========================
nerdctl save -o k8s-images.tar $(nerdctl images --format "{{.Repository}}:{{.Tag}}")
# ========================
# 分发镜像包到master2/master3
# ========================
for i in {113..114};do
scp ./k8s-images.tar root@10.0.0.$i:/root
done
# ========================
# 【master2/master3】导入离线镜像
# ========================
nerdctl load -i k8s-images.tar
# ========================
# 修正pause镜像标签(让K8s识别为官方镜像)
# ========================
nerdctl tag registry.aliyuncs.com/google_containers/pause:3.10.1 registry.k8s.io/pause:3.10.1
补充说明:
- 镜像打包/导入可避免master2/3因网络问题拉取镜像失败;
- 若镜像文件过大,可使用
scp -C开启压缩传输(提升速度); - 验证镜像:执行
nerdctl images应能看到所有K8s组件镜像(如kube-apiserver、kube-controller-manager等)。
步骤2:执行加入命令(替换为实际token和密钥)
kubeadm join kubeapi.wang.org:6443 \
--token xxx \ # 集群初始化输出的token
--discovery-token-ca-cert-hash sha256:xxx \ # 集群初始化输出的cert-hash
--control-plane \ # 指定以master节点加入
--certificate-key xxx \ # 集群初始化输出的certificate-key
# 配置kubectl授权(可选,让master2/3具备集群管理权限)
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
# 验证节点加入(master1执行)
kubectl get nodes
补充说明:
- 加入完成后,master2/3的kubelet会自动启动并生成配置文件;
- 若加入失败,需检查:① token是否过期(可在master1执行
kubeadm token create --print-join-command生成新命令);② 节点间网络是否互通;③ 镜像是否同步完成。
4. 加入worker节点(node1/2/3)
# 执行加入命令(无--control-plane和--certificate-key)
kubeadm join kubeapi.wang.org:6443 \
--token xxx \ # 集群初始化输出的token
--discovery-token-ca-cert-hash sha256:xxx \ # 集群初始化输出的cert-hash
# 验证所有节点(master1执行)
kubectl get nodes
补充说明:
- worker节点无需同步镜像(加入后会自动拉取所需镜像,若网络问题可参考master节点的镜像同步方法);
- 若token过期,在master1执行
kubeadm token create --print-join-command生成新的join命令; - 加入完成后节点状态为NotReady,需安装网络插件后变为Ready。
七、网络插件安装(master1执行)
1. 安装Flannel(轻量级网络插件,适配小规模集群)
准备工作(离线/在线)
# 方式1:离线部署(推荐,避免网络问题)
# 加载flannel离线镜像(所有节点执行)
nerdctl load -i flannel.tar
# 方式2:在线部署(需科学上网或代理)
# 下载Flannel配置文件(新版,适配K8s v1.17+)
wget https://mirror.ghproxy.com/https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
# 备用旧版配置文件
# wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
修改配置(按需)
# 编辑配置文件(若自定义了pod-network-cidr需修改)
vim kube-flannel.yml # 或离线文件kube-flannel-v0.28.2.yml
# 找到以下内容,修改Network值为集群初始化时的pod-network-cidr
net-conf.json: |
{
"Network": "10.244.0.0/16", # 与--pod-network-cidr保持一致
"Backend": {
"Type": "vxlan"
}
}
部署Flannel
# 应用配置(仅master1执行)
kubectl apply -f kube-flannel.yml # 或kube-flannel-v0.28.2.yml
# 验证Flannel Pod状态(所有Pod应为Running)
kubectl get pods -n kube-flannel
# 验证节点状态(所有节点应为Ready)
kubectl get nodes
补充说明:
- Flannel部署后需等待1-2分钟,Pod会在所有节点启动,节点状态从NotReady变为Ready;
- 若Flannel Pod卡在ContainerCreating,多为镜像拉取失败,需确保所有节点加载了flannel镜像;
- 若Pod之间无法通信,需检查:① 节点间网络是否互通;② Flannel的VXLAN隧道是否正常(
ip link show flannel.1);③pod-network-cidr是否与Flannel配置一致; - 生产环境如需网络策略(如Pod隔离),可替换为Calico网络插件。
八、集群测试
1. 创建测试Deployment和Service
# 创建测试Deployment(2副本)
kubectl create deployment pod-test --image=registry.cn-beijing.aliyuncs.com/wangxiaochun/pod-test:v0.1 --replicas=2
# 扩容到3副本
kubectl scale deployment/pod-test --replicas=3
# 创建NodePort服务(暴露Pod到集群外)
kubectl create service nodeport pod-test --tcp=80:80
# 查看服务端口(NODE_PORT列即为暴露的端口)
kubectl get svc -l app=pod-test
# 外部访问测试(替换为实际NodeIP和NODE_PORT)
# http://10.0.0.115:32246
2. 验证结果
- 执行
kubectl get pods,所有测试Pod应为Running; - 浏览器访问
http://NodeIP:NODE_PORT,应能看到测试页面(显示节点信息); - 清理测试资源(可选):
kubectl delete deployment pod-test kubectl delete svc pod-test
补充说明:
- NodePort服务的端口范围为30000-32767,若需固定端口,可使用
kubectl edit svc pod-test修改nodePort字段; - 若访问失败,需检查:① 测试Pod是否正常运行;② 节点防火墙是否关闭;③ NodePort端口是否被占用。
九、常见问题处理
1. 清理错误环境(重置集群)
# 重置kubeadm配置
kubeadm reset -f --cri-socket=unix:///var/run/cri-dockerd.sock
# 删除残留文件
rm -rf /etc/kubernetes /var/lib/etcd /var/lib/kubelet $HOME/.kube/config
# 重启容器运行时
systemctl restart containerd
# 重启节点(可选,确保清理彻底)
reboot
补充说明:
- 重置集群会清除所有K8s配置和数据,需谨慎操作;
- 重置后所有节点需重新执行初始化/加入操作;
- 若重置后仍有残留问题,可检查
/etc/cni/net.d目录是否清空,或重新安装kubelet。
2. kubelet启动失败
- 原因:未执行
kubeadm init/join,缺少/var/lib/kubelet/config.yaml; - 解决:完成集群初始化/节点加入后自动生成配置文件;
- 进阶排查:
- 检查Containerd服务是否正常:
systemctl status containerd; - 查看kubelet日志:
journalctl -u kubelet -f; - 检查kubelet配置文件:
cat /etc/systemd/system/kubelet.service.d/10-kubeadm.conf。
- 检查Containerd服务是否正常:
3. Flannel网络异常
- 排查步骤:
- 检查
pod-network-cidr与Flannel配置是否一致; - 重新加载Flannel镜像:
nerdctl load -i flannel.tar; - 重建Flannel网络:
kubectl delete -f kube-flannel.yml && kubectl apply -f kube-flannel.yml; - 查看Flannel Pod日志:
kubectl logs -n kube-flannel <pod-name>;
- 检查
- 常见问题:
- Pod卡在ContainerCreating:镜像拉取失败,需确保节点能访问镜像仓库或加载离线镜像;
- 节点状态NotReady:Flannel Pod未启动,或VXLAN隧道未建立(
ip link show flannel.1无输出); - Pod之间无法通信:节点间网络不通,或iptables规则被清空(重启Flannel Pod重新生成规则)。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)