• 「Bug」Pod/Namespace 无法删除,卡在 Terminating 状态


    修改了 Deployment 后,旧的 Pod 被 Terminated,新的 Pod 被启动。

    然后问题就出现了,旧 Pod 一直处于 Exited: Terminated 状态,无法删除。

    因为我们使用了 hostPort,端口一直被这个旧 Pod 占用,新 Pod 就无法启动,一直 Pending.

    通过 kubectl describe pod <pod-name> 查看:

    ...
    Annotations:               cni.projectcalico.org/podIP: 100.103.53.8/32
    Status:                    Terminating (lasts 29h)
    Termination Grace Period:  5s
    IP:
    IPs:                       <none>
    ...
    Conditions:
      Type              Status
      Initialized       True
      Ready             False
      ContainersReady   False
      PodScheduled      True
    Volumes:
      test-token-d4d2k:
        Type:        Secret (a volume populated by a Secret)
        SecretName:  test-token-d4d2k
        Optional:    false
    QoS Class:       Burstable
    Node-Selectors:  kubernetes.io/hostname=xxxxxx
    Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                     node.kubernetes.io/unreachable:NoExecute for 300s
    Events:          <none>
    

    显示终止状态持续了 29h: Status: Terminating (lasts 29h)

    原因分析

    目前尚不清楚原因,通过 docker ps -a | grep <pod-name> 查看,发现该容器已经处于 Exited 状态,也就是说容易已经死掉了。
    但是容器只是 Exited 了,没有被删除, Pod 也一直卡在 Terminating 状态。

    网上询问同道,说这种情况可能是容器相关的其他资源(数据卷之类的东西)无法删除,导致容器一直卡在这个状态。
    下次好好排查一下看看。

    解决方法

    方法一

    使用 kubectl 命令:

    kubectl delete pods <pod> --grace-period=0 --force
    

    方法二

    使用 docker 命令:

    1. 手动登录到对应的节点,通过 docker ps -a | grep 查找到已经 Exited 的容器
    2. 然后 docker rm -f <container-id> 手动删除掉它。

    现在再进 kubernetes,发现旧 Pod 已经消失了。

    Namespace 无法删除

    网上搜到的这类问题,貌似都是 monitoring 名字空间的。这是 kube-prometheus 常用的名字空间。
    无法删除的原因也是某些资源无法被释放。可通过手动删除 namespace 配置中的析构器(spec.finalizer,在名字空间生命周期结束前会生成的配置项),这样名字空间就会直接被删除了。

    # 编辑名字空间的配置
    kubectl edit namespace <ns-name>
    # 手动删除掉 spec.finalizer。
    
  • 相关阅读:
    主流液晶显示器尺寸参数
    不能访问网络位置的解决方法(转)
    打开Word提示你正试图运行的函数包含有宏或需要宏语言支持的内容
    教你如何防“蹭网”
    ASA数据库瘦身(原创)
    多种解决:“Word无法启动转换器mswrd632.wpc”方法
    百兆线与千兆线网线制作方法
    linux常用命令
    DefaultIfEmpty
    实现手机发送验证码 进行验证
  • 原文地址:https://www.cnblogs.com/kirito-c/p/12508577.html
Copyright © 2020-2023  润新知