☰
Kubernetes 集群部署:Flannel 镜像拉取失败导致 Node NotReady
2026/10/8 8:52:21 网站建设 项目流程

一、问题背景

在 Rocky Linux 9 上使用 kubeadm 部署 Kubernetes 集群。

Master 节点:

主机名:k8s-master IP:10.0.0.13 系统:Rocky Linux 9 Kubernetes:v1.28.2 容器运行时:containerd

Kubernetes 控制平面初始化成功:

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 NotReady

Kubernetes 集群必须安装 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-plugin

Flannel 启动过程:

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.9

CNI 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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询