type
Post
status
Published
date
May 22, 2026 01:58
slug
article/k8s-flannel-pod-cidr-not-assigned
summary
tags
k8s
DevOps
category
Code
icon
💻
password

1. 现象

在k8s集群的部署过程中,在初始化k8s master节点之后,准备通过如下kubeadm join命令添加当前worker节点到k8s集群,
根据日志输出,可知当前节点已加入集群,通过kubectl get nodes命令可以正常看到节点的状态为ready,但是通过kubectl get pods -A命令查看pods状态时,看到如下的CrashLoopBackOff的异常状态,
通过kubectl logs命令查询pod日志可以看到报pod cidr not assigned的异常信息,
当前发生问题的k8s版本为1.20.0,其中配置了flannel作为网络CNI插件。

2. 快速解决方案:手动分配podCIDR

这个问题主要是由于worker节点的flannel组件无法正常获取podCIDR的定义,一个快速的解决方法:可以通过执行如下命令对相应的worker节点添加podCIDR配置,
然后可以再次查看节点信息,
过一段时间,再次查看kube-flannel-ds-j69g6 pod,可以看到已经可以正常启动,状态为RUNNING。
这个解决方案是通过手动指定worker节点的可分配IP地址域,但是这个不是最佳的解决方案,最好找到根本原因,让flannel自动配置各个worker节点的podCIDR。

3. 异常根因和自动分配podCIDR

在k8s master集群部署中,通过kubeadm init初始化master节点时,flannel网络插件需要确保初始化命令配置了podCIDR如下启动参数,
  • -pod-network-cidr=172.18.0.0/16
初始化完毕之后,可以在配置文件/etc/kubernetes/manifest/kube-controller-manager.yaml中看到如下信息,
  • -allocate-node-cidrs=true
  • -cluster-cidr=172.18.0.0/16
同时在安装flannel cni网络插件时,通过kubectl apply kube-flannel.yml命令,kube-flannel配置文件中的Network参数需要和pod-network-cid保持一致,
在k8s集群上述初始化的过程中,若不小心出现如下情况,
  1. 对master主机初始化时,有1台或多台未正常配置podCIDR参数,即在kubeadm init命令中未添加pod-network-cid参数。
  1. 通过kubectl apply kube-flannel.yml命令添加flannel网络插件时,其指定的Network和pod-network-cid不一致。
都会导致flannel插件无法自动识别和分配pod cidr,从而出现pod cidr not assigned异常问题。
若出现此类问题,可以详细检查如上k8s集群配置。在配置都正确的情况下,各个k8s worker节点上的flannel将能够正常自动配置各个worker节点的podCIDR,如下为三个worker节点上查询到自动分配的网段,

4. 参考资料

  1. flannel touble shooting
  1. stack overflow: Kubernetes worker nodes not automatically being assigned podCidr on kubeadm join
Macbook Pro touchbar不亮的终极解决最新|解决Mac安装软件的“已损坏,无法打开。 您应该将它移到废纸篓”问题 - 知乎