
在 Kubernetes 中,DaemonSet(DS)管理的 Pod 如果处于 Unknown 状态,这个时候假如对DaemonSet 的yaml进行了更新,是无法触发更新的,要是手残了,手动删除了pod,会出现对应节点上pod丢失的情况。
Pod 如果处于 Unknown通常是因为节点失联(Node NotReady)或节点资源问题导致 Pod 无法被正常调度或驱逐。
1. 检查节点和 Pod 状态首先确认 Pod 所在节点的状态:
kubectl get nodeskubectl 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/v1kind: DaemonSetspec: updateStrategy: type: RollingUpdate # 确保使用滚动更新策略 template: spec: tolerations: - operator: Exists # 允许调度到有污点的节点(按需调整)6. 总结原因分析Pod 进入 Unknown 状态的常见原因:
节点失联:kubelet 无法上报状态(网络故障、kubelet 崩溃)。资源压力:节点 CPU/内存耗尽,导致 kubelet 无法工作。存储问题:持久卷(PV)无法卸载,导致 Pod 卡在终止状态。内核故障:节点操作系统崩溃。