K3s中Flannel因failed to acquire lease启动失败,主因是Lease API不可用、RBAC权限缺失、CNI残留或时间不同步;优先重启k3s服务或清理/etc/cni/net.d/配置即可解决。

这是 K3s 使用 Flannel 作为 CNI 插件时的典型问题:Flannel Pod 启动失败,日志中反复出现 failed to acquire lease,导致节点无法获取 PodCIDR,进而无法分配 Pod IP,所有工作负载卡在 Pending 状态。
根本原因:Flannel 依赖 kube-apiserver 和 etcd(或 k3s 内置的 sqlite/etcd)正常提供租约(Lease)能力
Flannel v0.20+ 默认启用 lease 模式(通过 --lease-enable),它会向 Kubernetes 的 coordination.k8s.io/v1 Lease API 创建并续租一个名为 flannel 的 Lease 对象(位于 kube-flannel 命名空间)。这个 Lease 用于选举主 Flannel 实例、同步子网(Subnet)信息。一旦 Flannel 无法创建或更新该 Lease,就会报错退出。
常见触发条件包括:
- 集群未就绪:kube-apiserver 尚未完全启动(比如 K3s 正在初始化 sqlite 或嵌入式 etcd),Flannel Pod 却已提前调度运行;
-
RBAC 权限缺失:Flannel ServiceAccount 缺少
leases资源的create/update权限(K3s v1.25+ 默认已修复,但自定义部署或旧版本可能遗漏); -
网络插件冲突:节点上残留了旧的 CNI 配置(如
/etc/cni/net.d/10-flannel.conflist)或其它 CNI 插件(如 Calico、Cilium)干扰; -
时间不同步:节点系统时间偏差过大(>1 分钟),导致 Lease 的
renewTime校验失败; -
K3s 启动参数异常:例如禁用了
--disable=traefik,servicelb却未关掉 flannel(K3s 默认启用 flannel,不建议手动 disable 后又部署 flannel)。
快速诊断步骤
先确认关键状态:
- 运行
kubectl get nodes—— 若节点为NotReady,且kubectl get pods -A | grep flannel显示 CrashLoopBackOff,则高度疑似此问题; - 查看 Flannel 日志:
kubectl logs -n kube-flannel deploy/kube-flannel,重点找failed to acquire lease和cannot create lease或forbidden字样; - 检查 Lease 资源是否存在:
kubectl get leases -n kube-flannel—— 正常应有 1 条flannel记录;若报错the server could not find the requested resource,说明 apiserver 未启用 Lease API(极罕见,K3s 默认开启); - 验证 RBAC:
kubectl auth can-i create leases -n kube-flannel --as=system:serviceaccount:kube-flannel:flannel应返回yes。
常用解决方法
按优先级尝试以下操作(多数情况只需第 1 或第 2 步):
-
重启 K3s 服务:最简单有效。Flannel 启动过早常因 K3s 初始化未完成所致。执行
sudo systemctl restart k3s(或k3s-killall.sh && k3s server &),等待 30 秒后观察kubectl get pods -n kube-flannel是否转为 Running; -
清理残留 CNI 配置:删除节点上的旧配置文件:
sudo rm -f /etc/cni/net.d/*.conf /etc/cni/net.d/*.conflist,再重启 K3s; -
强制重建 Flannel Deployment:如果 Lease 已损坏,可删掉它让 Flannel 重试:
kubectl delete lease -n kube-flannel flannel,再删 Flannel Pod:kubectl delete pod -n kube-flannel -l app=flannel; -
降级 Flannel(仅临时应急):若确认是 Lease 兼容问题(如 K3s 版本较老),可在 K3s 启动时指定旧版 Flannel 镜像并关闭 lease:
--flannel-image rancher/flannel:v0.19.2 --flannel-backend=host-gw --flannel-conf=/var/lib/rancher/k3s/server/manifests/flannel-config.yaml,并在flannel-config.yaml中添加args: ["--lease-enable=false"](不推荐长期使用)。
预防建议
部署新集群时注意:
- 确保系统时间同步(
systemctl enable --now systemd-timesyncd); - 避免在 K3s 启动命令中混用
--disable=flannel和手动部署 Flannel; - 升级 K3s 前查阅 Release Notes,特别是涉及 CNI 或 embedded etcd 的变更;
- 生产环境建议使用 K3s 官方推荐的默认网络(即内置 Flannel),而非自行替换镜像或修改 backend。
不复杂但容易忽略——往往就是一次重启或删个配置文件的事。










