一、问题背景
在 Rocky Linux 9 上使用 kubeadm 部署 Kubernetes 集群。
Master 节点:
主机名:k8s-master IP:10.0.0.13 系统:Rocky Linux 9 Kubernetes:v1.28.2 容器运行时:containerdKubernetes 控制平面初始化成功:
kubectl cluster-info输出:
Kubernetes control plane is running at https://10.0.0.13:6443但是查看节点状态:
kubectl get nodes发现:
NAME STATUS ROLES AGE VERSION k8s-master NotReady control-plane 15m v1.28.2二、排查 Node 为什么 NotReady
查看节点详细信息:
kubectl describe node k8s-master发现:
Ready False NetworkReady=false Network plugin returns error: cni plugin not initialized这说明:
Kubernetes 控制平面正常 etcd 正常 API Server正常 Scheduler正常 ControllerManager正常但是CNI 网络插件没有初始化Node NotReadyKubernetes 集群必须安装 CNI 网络插件才能让 Pod 网络正常通信。
因此选择部署 Flannel。
三、部署 Flannel 后出现新的问题
执行 Flannel 部署:
kubectl apply -f kube-flannel.yml资源创建成功:
namespace/kube-flannel created serviceaccount/flannel created clusterrole.rbac.authorization.k8s.io/flannel created clusterrolebinding.rbac.authorization.k8s.io/flannel created configmap/kube-flannel-cfg created daemonset.apps/kube-flannel-ds created查看 Flannel Pod:
kubectl get pods -n kube-flannel出现:
NAME READY STATUS kube-flannel-ds-xxxxx 0/1 Init:0/2等待后:
Init:1/2最终:
Init:ErrImagePull说明 Flannel 本身没有正常启动。
四、定位问题:镜像无法拉取
查看 Flannel Pod:
kubectl describe pod -n kube-flannel kube-flannel-ds-xxxxx可以看到 Kubernetes 正在拉取 Flannel 镜像。
原始官方配置使用:
ghcr.io/flannel-io/flannel以及:
ghcr.io/flannel-io/flannel-cni-pluginFlannel 启动过程:
Flannel Pod │ ├── InitContainer 1 │ ↓ │ 下载 CNI Plugin 镜像 │ ├── InitContainer 2 │ ↓ │ 下载 Flannel 镜像 │ └── Flannel Container ↓ 启动 CNI但是 Master 节点在拉取 GHCR 镜像时卡住。
使用:
crictl pull ghcr.io/flannel-io/flannel:v0.28.9发现镜像无法正常完成拉取。
containerd 日志也出现:
PullImage failed context canceled因此可以确定:
问题核心是 containerd 无法正常拉取 Flannel 所需的 GHCR 镜像。
五、解决方案:更换可访问镜像源
将 Flannel 镜像地址:
ghcr.io/flannel-io/替换为:
docker.io/flannel/例如:
原镜像: ghcr.io/flannel-io/flannel:v0.28.9 修改为: docker.io/flannel/flannel:0.28.9CNI Plugin:
docker.io/flannel/flannel-cni-plugin:v1.9.1-flannel3可以直接修改 YAML:
sed -i 's|ghcr.io/flannel-io/|docker.io/flannel/|g' kube-flannel.yml然后重新部署:
kubectl apply -f kube-flannel.yml六、验证镜像是否能够正常拉取
使用 crictl 测试:
crictl pull docker.io/flannel/flannel:0.28.9查看本地镜像:
crictl images | grep flannel如果能够看到:
docker.io/flannel/flannel docker.io/flannel/flannel-cni-plugin说明 containerd 已经可以正常拉取 Flannel 镜像。
七、Flannel 启动成功
重新查看:
kubectl get pods -n kube-flannel -o wide最终:
NAME READY STATUS RESTARTS kube-flannel-ds-c292x 1/1 Running 0