提问者:小点点

如何移除库伯内特斯的“关闭”豆荚


我最近注意到状态为“关闭”的豆荚大量堆积。自2020年10月以来,我们一直在使用库伯内特斯。

生产和暂存运行在相同的节点上,除了暂存使用可抢占节点来降低成本。容器在暂存中也很稳定。(故障很少发生,因为它们之前在测试中被捕获)。

服务提供商谷歌云库伯内特斯。

我熟悉了文档并尝试搜索,但我既不认识也不认识google对这种特殊状态的帮助。日志中没有错误。

我没有问题pod被停止。理想情况下,我希望K8s自动删除这些关闭pod。如果我运行kubectl删除poredis-7b86cdccf9-zl6k9,它会在眨眼间消失。

kubectl get pod|grep Shutdown|awk'{print 1 USD}'|xargs kubectl delete pod是手动临时解决方法。

PS.k是我环境中kubectl的别名。

我偶然发现了一些相关的问题来解释https://github.com/kubernetes/website/pull/28235https://github.com/kubernetes/kubernetes/issues/102820

“当pod在优雅的节点关闭期间被驱逐时,它们被标记为失败。运行kubectl get pods将被驱逐的pod的状态显示为Shutdown。”


共3个答案

匿名用户

被驱逐的吊舱不是故意移走的,正如k8s团队在这里说的那样1,被驱逐的吊舱也不是为了在被驱逐后接受检查而被移走的。

我认为这里最好的方法是创建一个已经提到的cronjob2。

apiVersion: batch/v1
kind: CronJob
metadata:
  name: del-shutdown-pods
spec:
  schedule: "* 12 * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            imagePullPolicy: IfNotPresent
            command:
            - /bin/sh
            - -c
            - kubectl get pods | grep Shutdown | awk '{print $1}' | xargs kubectl delete pod
          restartPolicy: OnFailure

匿名用户

你不需要任何grep——只需使用kubectl提供的选择器。顺便说一句,你不能从busybox映像中调用kubectl,因为它根本没有kubectl。我还创建了一个有权删除pods的服务号。

apiVersion: batch/v1
kind: CronJob
metadata:
  name: del-shutdown-pods
spec:
  schedule: "0 */2 * * *"  
  concurrencyPolicy: Replace
  jobTemplate:
    metadata:
      name: shutdown-deleter
    spec:
      template:
        spec:
          serviceAccountName: deleter
          containers:
          - name: shutdown-deleter
            image: bitnami/kubectl
            imagePullPolicy: IfNotPresent
            command:
              - "/bin/sh"
            args:
              - "-c"
              - "kubectl delete pods --field-selector status.phase=Failed -A --ignore-not-found=true"
          restartPolicy: Never

匿名用户

首先,尝试使用以下命令强制删除kubernetes pod:

$kubectl删除pod

您可以使用以下命令直接删除pod:

$kubectl删除pod

然后,使用以下命令检查pod的状态:

$kubectl获取豆荚

在这里,您将看到pod已被删除。

您也可以使用yaml文件中的留档进行验证。

大多数程序在收到SIGTERM时会优雅地关闭,但是如果您正在使用第三方代码或正在管理您无法控制的系统,preStop挂钩是在不修改应用程序的情况下触发优雅关闭的好方法。库伯内特斯将向pod中的容器发送SIGTERM信号。此时,库伯内特斯等待一个称为终止宽限期的指定时间。

有关更多信息,请参阅。