DC娱乐网

Kubernetes DaemonSet 出现 Pod Unknown...

在 Kubernetes 中,DaemonSet(DS)管理的 Pod 如果处于 Unknown 状态,这个时候假如对D

在 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 卡在终止状态。内核故障:节点操作系统崩溃。