k8s关于Orphaned pod <pod_id> found,volume paths are still present on disk 的解决方法

本文档描述了在Kubernetes(k8s)集群中,由于节点意外关机导致Pod异常终止,进而产生孤儿Pod的问题。在系统日志中发现持续报错,指出孤儿Pod的Volume路径仍在磁盘上。通过检查Pod的etc-hosts文件确认已无对应实例运行,因此直接删除Pod目录以解决告警。虽然此操作可能存在数据丢失风险,但对无状态服务通常无影响。完成清理后,告警日志停止刷屏。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述
因k8s节点异常关机导致启动后业务Pod重新部署,关机之前的Pod状态已被删除,今天在查看日志时发现在异常关机之前的集群节点Pod是非正常移除的,一直刷报错信息;如下:

问题排查
查看系统日志/var/log/messages发现一直在刷kubectl服务的以下的报错,从错误信息可以看到,这台节点存在一个孤儿Pod,并且该Pod挂载了数据卷(volume),阻碍了Kubelet对孤儿Pod正常的回收清理。

[root@sss-010xl-n02 ~]# tail -3 /var/log/messages
Dec 12 17:50:17 sss-010xl-n02 bash[470923]: user=root,ppid=454652,from=,pwd=/var/lib/kubelet/pods,command:20211212-175006: ll
Dec 12 17:55:15 sss-010xl-n02 kubelet: E1212 17:55:15.645612    2423 kubelet_volumes.go:154] Orphaned pod "aad90ab1-2f04-11ec-b488-b4055dae3f29" found, but volume paths are still present on disk : There were a total of 1 errors similar to this. Turn up verbosity to see them.
Dec 12 17:55:15 sss-010xl-n02 kubelet: E1212 17:55:15.645612    2423 kubelet_volumes.go:154] Orphaned pod "aad90ab1-2f04-11ec-b488-b4055dae3f29" found, but volume paths are still present on disk : There were a total of 1 errors similar to this. Turn up verbosity to see them.

通过pod_id号,进入kubelet的目录,可以发现里面装的是容器的数据,etc-hosts文件中还保留着Pod_name

[root@sss-010xl-n02 ~]# cd /var/lib/kubelet/pods/aad90ab1-2f04-11ec-b488-b4055dae3f29
[root@sss-010xl-n02 pods]# cd aad90ab1-2f04-11ec-b488-b4055dae3f29/
[root@sss-010xl-n02 aad90ab1-2f04-11ec-b488-b4055dae3f29]# ll
total 4
drwxr-x--- 3 root root  30 Dec 10 15:54 containers
-rw-r--r-- 1 root root 230 Dec 10 15:54 etc-hosts
drwxr-x--- 3 root root  37 Dec 10 15:54 plugins
drwxr-x--- 5 root root  82 Dec 10 15:54 volumes
drwxr-x--- 3 root root  49 Dec 10 15:54 volume-subpaths
[root@sss-010xl-n02 7e1a3af8-598e-11ec-b488-b4055dae3f29]# cat etc-hosts 
# Kubernetes-managed hosts file.
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
fe00::0 ip6-mcastprefix
fe00::1 ip6-allnodes
fe00::2 ip6-allrouters
172.30.128.2    sss-wanted-010xl-5945fb4885-7gz85	\\被孤立的Pod

解决问题
首先通过etc-hosts文件的pod_name发现已经没有相关的实例在运行了,所以直接删除pod的目录即可

[root@sss-010xl-n02 7e1a3af8-598e-11ec-b488-b4055dae3f29]# cd ..
[root@sss-010xl-n02 pods]# rm -rf 7e1a3af8-598e-11ec-b488-b4055dae3f29/

网上看其他人的博客都说这个方法有一定的危险性,还不确认是否有数据丢失的风险,如果可以确认,再执行;如果是无状态服务,一般没有问题。

再去查看日志,就不会再刷这样的告警日志了

<think>我们正在排查Flannel集成Cilium后出现的Pod无法互通以及日志中出现"orphaned pod"错误的问题。根据之前的讨论,这通常是由于多个CNI插件冲突引起的。以下将结合用户提供的引用信息和实际排查步骤进行分析。 ### 问题分析 1. **CNI插件冲突**:Flannel和Cilium都是CNI插件,同时存在会导致网络配置冲突(如IPAM、路由规则等)。 2. **orphaned pod错误**:该错误通常发生在kubelet认为Pod已被调度到节点,但无法正确配置网络时。可能原因包括: - CNI插件配置错误 - 节点网络命名空间残留旧配置 - 多个CNI配置文件导致kubelet选择错误 ### 排查步骤 #### 1. 检查CNI配置文件(关键步骤) ```bash # 查看节点上的CNI配置文件 ls /etc/cni/net.d/ ``` - **正常情况**:应只有一个主CNI配置文件(如`10-flannel.conflist`或`05-cilium.conf`)。 - **异常情况**:同时存在Flannel和Cilium的配置文件(如`10-flannel.conflist`和`05-cilium.conf`),需删除其中一个。 #### 2. 检查kubelet日志 ```bash journalctl -u kubelet | grep -iE "cni|flannel|cilium|orphan" ``` 重点关注以下错误模式: - `error setting up network for pod ...: CNI network not ready` → CNI插件未就绪 - `orphaned pod "<pod-id>" found but volume paths are still present` → 卷清理失败导致Pod残留 - `multiple CNI configurations` → 检测到多个CNI配置 #### 3. 验证CNI插件状态 - **Flannel状态检查**: ```bash kubectl get pods -n kube-system -l app=flannel kubectl logs <flannel-pod> -n kube-system ``` - **Cilium状态检查**: ```bash cilium status # 若cilium CLI未安装,使用以下命令 kubectl exec -n kube-system <cilium-pod> -- cilium status ``` #### 4. 检查节点网络配置 ```bash # 查看路由表 ip route show # 检查网卡配置 ip link show | grep -E &#39;cilium|flannel|cni0&#39; ``` - **异常迹象**: - 路由目标重复(如`10.244.0.0/16`同时指向`cni0`和`cilium_host`) - Flannel的`flannel.1`或Cilium的`cilium_host`网卡缺失 #### 5. 解决orphaned pod错误 该错误通常因Pod被删除后kubelet无法清理网络导致: 1. **手动清理残留Pod**: ```bash # 删除kubelet中的orphaned pod sudo rm -rf /var/lib/kubelet/pods/<orphaned-pod-id> ``` 2. **重启kubelet**: ```bash systemctl restart kubelet ``` ### 解决方案 #### 方案一:完全移除其中一个CNI(推荐) ```bash # 移除Flannel kubectl delete -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml # 移除Cilium helm uninstall cilium -n kube-system ``` #### 方案二:使用Cilium的Flannel兼容模式(混合部署) ```bash helm upgrade cilium cilium/cilium --version 1.14.3 \ --namespace kube-system \ --reuse-values \ --set flannel.enabled=true \ --set flannel.install=false \ # 若已安装Flannel则设为false --set tunnel=disabled \ --set ipam.mode=kubernetes ``` #### 方案三:修复网络冲突(高级) 1. **统一PodCIDR**: - 确保Flannel和Cilium使用相同的Pod网段(如`10.244.0.0/16`) 2. **放行VXLAN流量**: ```yaml # cilium-networkpolicy-allow-flannel.yaml apiVersion: cilium.io/v2 kind: CiliumNetworkPolicy metadata: name: allow-flannel-vxlan spec: endpointSelector: {} ingress: - fromEndpoints: - {} toPorts: - ports: - port: "8472" protocol: UDP ``` ### 验证修复 ```bash # 创建测试Pod kubectl run test-pod --image=nginx --restart=Never kubectl run target-pod --image=nginx --restart=Never # 检查跨Pod通信 kubectl exec test-pod -- curl $(kubectl get pod target-pod -o jsonpath=&#39;{.status.podIP}&#39;) ``` ### 引用说明 用户提供的引用[1]提到"某些情况下不想让Node承担创建带IP Pod的工作",这提示我们: - 如果某些节点(如master)未分配PodCIDR,可能导致Flannel无法正常工作[^1]。 - 引用[2]中的调度器代码片段说明Pod调度依赖`pod.Spec.NodeName`的正确设置[^2],若网络插件冲突导致Pod无法绑定到节点,也可能引发orphaned错误。 --- §§ 相关问题 §§ 1. 如何为Kubernetes master节点设置污点以禁止调度普通Pod? 2. Cilium的Flannel兼容模式实现原理是什么? 3. Kubernetes中如何彻底清理"orphaned pod"? [^1]: 节点未分配PodCIDR时,Flannel无法分配IP [^2]: Pod调度依赖`pod.Spec.NodeName`的正确设置</think>### 问题分析:Flannel集成Cilium后Pod无法互通并出现"orphaned pod"错误 #### 核心原因 1. **CNI插件冲突** Flannel和Cilium同时管理网络会导致: - IP地址管理(IPAM)冲突(Flannel默认使用`10.244.0.0/16`,Cilium常用`10.0.0.0/8`) - 路由规则互相覆盖(如Flannel的`cni0`和Cilium的`cilium_host`网卡冲突) - **orphaned pod错误**:因CNI配置冲突导致Pod网络配置残留[^1] 2. **调度器与网络插件不协调** - 当节点未分配PodCIDR时(如master节点),Flannel无法创建带IP的Pod[^1] - 调度器将Pod标记为`Scheduled`后,网络插件未能完成IP分配[^2] 3. **资源清理失败** `orphaned pod`错误表明kubelet检测到: - 已删除Pod的卷/网络配置残留 - CNI插件未正确释放veth设备或IP地址 --- ### 排查步骤 #### 1. 检查CNI配置冲突 ```bash # 查看生效的CNI配置文件 ls /etc/cni/net.d/ # 检查配置文件内容 cat /etc/cni/net.d/*.conf* | grep -E &#39;type|name&#39; ``` - **危险信号**:同时存在`flannel`和`cilium`的配置类型 - **解决方案**:删除非主CNI的配置文件(保留一个) #### 2. 分析orphaned pod日志 ```bash journalctl -u kubelet | grep "orphaned pod" -A 20 ``` 典型错误模式: ``` orphaned pod <pod-id> found but volume paths still present orphaned pod <pod-id> found but cni config not released ``` #### 3. 验证节点网络状态 ```bash # 检查路由表冲突 ip route show | grep -E &#39;cni0|cilium&#39; # 检查IP分配 kubectl get nodes -o jsonpath=&#39;{range .items[*]}{.metadata.name}{"\t"}{.spec.podCIDR}{"\n"}{end}&#39; ``` - **关键点**:未分配PodCIDR的节点无法运行Flannel Pod[^1] #### 4. 检查Cilium-Flannel集成模式 ```bash kubectl -n kube-system get cm kube-flannel-cfg -o yaml | grep Backend ``` - **必须配置**:Flannel应使用Cilium作为后端 ```yaml net-conf.json: | { "Network": "10.244.0.0/16", "Backend": { "Type": "cilium" } # 关键配置[^2] } ``` #### 5. 排查资源残留 ```bash # 检查残留网络设备 ip link show | grep veth # 强制清理orphaned pod sudo rm -rf /var/lib/kubelet/pods/<orphaned-pod-id>/* ``` --- ### 解决方案 #### 方案1:纯Cilium模式(推荐) ```bash # 卸载Flannel kubectl delete -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml # 安装Cilium(启用IPAM) helm install cilium cilium/cilium \ --namespace kube-system \ --set ipam.mode=kubernetes ``` #### 方案2:正确配置混合模式 ```bash helm upgrade cilium cilium/cilium \ --namespace kube-system \ --reuse-values \ --set flannel.enabled=true \ --set flannel.install=false \ # 使用已存在的Flannel --set tunnel=disabled \ --set ipv4NativeRoutingCIDR=10.244.0.0/16 # 匹配Flannel网段 ``` #### 方案3:修复orphaned pod错误 ```bash # 重启kubelet并清理残留 sudo systemctl stop kubelet sudo rm -rf /var/lib/cni/* sudo rm -rf /etc/cni/net.d/* sudo systemctl start kubelet ``` --- ### 验证修复 ```bash # 创建测试Pod kubectl run test-pod --image=nginx --restart=Never # 检查网络状态 kubectl get pod test-pod -o jsonpath=&#39;{.status.podIP}{"\n"}&#39; ``` **成功标志**:获得有效IP且无`orphaned pod`日志 > **关键提示**:混合模式需要严格匹配Flannel和Cilium的PodCIDR。生产环境建议迁移到纯Cilium方案以获得eBPF性能优势[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值