暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Kubernetes DaemonSet 出现 Pod Unknown 状态,无法更新ds,如何解决?

运维笔谈 2025-05-16
191

 

在 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. 1. 节点失联:kubelet 无法上报状态(网络故障、kubelet 崩溃)。
  2. 2. 资源压力:节点 CPU/内存耗尽,导致 kubelet 无法工作。
  3. 3. 存储问题:持久卷(PV)无法卸载,导致 Pod 卡在终止状态。
  4. 4. 内核故障:节点操作系统崩溃。


 

文章转载自运维笔谈,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论