
在 Kubernetes 中,DaemonSet 管理的 Pod 如果处于 Unknown
状态,这个时候假如对DaemonSet 的yaml进行了更新,是无法触发更新的。要是手残了,手动删除了pod,会出现对应节点上pod丢失的情况,很不幸我遇到了这个情况
。
Pod 如果处于 Unknown
通常是因为节点失联(Node NotReady)或节点资源问题导致 Pod 无法被正常调度或驱逐。
1. 检查节点和 Pod 状态
首先确认 Pod 所在节点的状态:
kubectl get nodes
kubectl describe pod <pod-name> -n <namespace>
• 如果节点处于 NotReady
状态,Pod 可能因节点故障无法被驱逐。• 如果节点处于 Ready
状态但 Pod 仍异常,可能是 kubelet 或网络问题。
2. 处理不可恢复的节点
如果节点确定可以下线,我们需要手动移除该节点:
kubectl delete node <node-name>
• DaemonSet 的机制:DaemonSet 只会在存在的节点上调度 Pod。删除节点后,DaemonSet 会认为该节点已消失,不再尝试在其上创建 Pod。 • 如果节点是临时故障,修复后状态会自动恢复。
3. 强制删除 Unknown 状态的 Pod
如果节点已删除或不可达,但 Pod 仍残留为 Unknown
状态,可强制删除:
kubectl delete pod <pod-name> -n <namespace> --grace-period=0 --force
• --grace-period=0
: 立即终止。• --force
: 绕过正常终止流程。
4. 防止 Pod 重新调度到故障节点
如果节点未删除但处于 NotReady
,DaemonSet 会持续尝试在该节点重建 Pod。可通过以下方式解决:
(1) 恢复节点
修复节点问题(如重启 kubelet、解决资源压力):
# 登录到故障节点
systemctl restart kubelet # 重启 kubelet
节点恢复后,Pod 会自动重建。
(2) 标记节点为不可调度(Cordon)
如果节点需要维护,标记为不可调度:
kubectl cordon <node-name>
这会阻止新 Pod 调度到该节点,但是 DaemonSet 是有可能仍会尝试创建 Pod。
(3) 驱逐节点上的 Pod
驱逐节点上所有 Pod(包括 DaemonSet):
kubectl drain <node-name> --ignore-daemonsets --delete-emptydir-data
• --ignore-daemonsets
: 允许驱逐 DaemonSet 管理的 Pod。• 此操作会删除 Pod 并在其他可用节点重建(如果集群满足条件)。
5. 检查 DaemonSet 配置
确保 DaemonSet 的配置正确,避免因配置问题导致 Pod 无法调度:
apiVersion: apps/v1
kind:DaemonSet
spec:
updateStrategy:
type:RollingUpdate# 确保使用滚动更新策略
template:
spec:
tolerations:
-operator:Exists # 允许调度到有污点的节点(按需调整)
6. 总结原因分析
Pod 进入 Unknown
状态的常见原因:
1. 节点失联:kubelet 无法上报状态(网络故障、kubelet 崩溃)。 2. 资源压力:节点 CPU/内存耗尽,导致 kubelet 无法工作。 3. 存储问题:持久卷(PV)无法卸载,导致 Pod 卡在终止状态。 4. 内核故障:节点操作系统崩溃。
文章转载自运维笔谈,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




