如何删除Kubernetes“shutdown”Pod

k97glaaz  于 2023-08-03  发布在  Kubernetes
关注(0)|答案(8)|浏览(130)

我最近注意到大量状态为“关闭”的Pod。我们从2020年10月开始使用Kubernetes。
生产和转移在相同的节点上运行,只是转移使用可抢占的节点来降低成本。集装箱在分段运输中也是稳定的。(故障很少发生,因为它们以前在测试中被发现过)。
服务提供商谷歌云Kubernetes。
我熟悉了自己的文档,并尝试搜索,但我都不认识,也没有谷歌帮助与这个特定的状态。日志中没有错误。
100d 1xx 1c 1d 1x的字符串
我不介意吊舱被拦截。理想情况下,我希望K8能自动删除这些关机Pod。如果我运行kubectl delete po redis-7b86cdccf9-zl6k9,它会在一眨眼的时间内消失。
kubectl get pods | grep Shutdown | awk '{print $1}' | xargs kubectl delete pod是手动临时解决方法。
PS.k是我的环境中kubectl的别名。
最后一个示例:它在所有命名空间//不同的容器中发生。


我偶然发现了一些解释https://github.com/kubernetes/website/pull/28235https://github.com/kubernetes/kubernetes/issues/102820状态的相关问题
“如果在正常关闭节点期间收回单元,则会将其标记为失败。运行kubectl get pods会将逐出的pod的状态显示为Shutdown。”

b09cbbtk

b09cbbtk1#

被驱逐的吊舱不是故意移除的,正如k8s团队在这里所说的1,被驱逐的吊舱不是为了在被驱逐后被检查。
我相信这里最好的方法是创建一个cronjob 2,正如前面提到的。

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

字符串

kmbjn2e3

kmbjn2e32#

你不需要任何 grep -只需要使用kubectl提供的选择器。顺便说一句,你不能从busybox镜像调用kubectl,因为它根本没有 kubectl。我还创建了一个服务帐户,具有删除Pod的权限。

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

字符串

r7xajy2e

r7xajy2e3#

首先,尝试使用以下命令强制删除kubernetes pod:
$ kubectl delete pod<pod_name>-n --grace-period 0 --force
您可以使用以下命令直接删除pod:
$ kubectl delete pod
然后,使用以下命令检查pod的状态:
$ kubectl获取pods
在这里,你会看到pod已经被删除。
您也可以使用yaml文件中的documentation进行验证。
大多数程序在收到SIGTERM时都会正常关闭,但是如果您使用的是第三方代码或者管理的是一个无法控制的系统,那么preStop钩子是一个很好的方法,可以在不修改应用程序的情况下触发正常关闭。Kubernetes会向pod中的容器发送SIGTERM信号。此时,Kubernetes等待一个指定的时间,称为终止宽限期。
更多信息refer

xfyts7mz

xfyts7mz4#

目前,Kubernetes默认情况下不会删除驱逐和关闭状态pod。在我们的环境中,我们也面临着类似的问题。
作为一个自动修复程序,您可以创建一个Kubernetes cronjob,它可以删除具有驱逐和关闭状态的pod。Kubernetes cronjob pod可以使用serviceaccount和RBAC进行身份验证,您可以限制实用程序的动词和名称空间。

amrnrhlw

amrnrhlw5#

您可以使用https://github.com/hjacobs/kube-janitor。这提供了各种可配置的选项来清理

7kjnsjlb

7kjnsjlb6#

我对这个问题的看法是这样的(这里来自其他解决方案的灵感):

# Delete all shutdown pods. This is common problem on kubernetes using preemptible nodes on gke
# why awk, not failed pods: https://github.com/kubernetes/kubernetes/issues/54525#issuecomment-340035375
# due fact failed will delete evicted pods, that will complicate pod troubleshooting

---
apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: del-shutdown-pods
  namespace: kube-system
  labels:
    app: shutdown-pod-cleaner
spec:
  schedule: "*/1 * * * *"
  successfulJobsHistoryLimit: 1
  jobTemplate:
    spec:
      template:
        metadata:
          labels:
            app: shutdown-pod-cleaner
        spec:
          volumes:
          - name: scripts
            configMap:
              name: shutdown-pods-scripts
              defaultMode: 0777
          serviceAccountName: shutdown-pod-sa
          containers:
          - name: zombie-killer
            image: bitnami/kubectl
            imagePullPolicy: IfNotPresent
            command:
              - "/bin/sh"
            args:
              - "-c"
              - "/scripts/podCleaner.sh"
            volumeMounts:
              - name: scripts
                mountPath: "/scripts"
                readOnly: true
          restartPolicy: OnFailure
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: shutdown-pod-cleaner
  namespace: kube-system
  labels:
    app: shutdown-pod-cleaner
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["delete", "list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: shutdown-pod-cleaner-cluster
  namespace: kube-system
subjects:
- kind: ServiceAccount
  name: shutdown-pod-sa
  namespace: kube-system
roleRef:
  kind: ClusterRole
  name: shutdown-pod-cleaner
  apiGroup: ""
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: shutdown-pod-sa
  namespace: kube-system
  labels:
    app: shutdown-pod-cleaner
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: shutdown-pods-scripts
  namespace: kube-system
  labels:
    app: shutdown-pod-cleaner
data:
  podCleaner.sh: |
    #!/bin/sh
    if [ $(kubectl get pods --all-namespaces --ignore-not-found=true | grep Shutdown | wc -l) -ge 1 ]
    then
    kubectl get pods -A | grep Shutdown | awk '{print $1,$2}' | xargs -n2 sh -c 'kubectl delete pod -n $0 $1 --ignore-not-found=true'
    else
    echo "no shutdown pods to clean"
    fi

字符串

7xllpg7q

7xllpg7q7#

我刚安排了一个cronjob来清理死的GKE吊舱。完整的设置包括RBAC角色、角色绑定和服务帐户。
服务帐户和群集角色设置。

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: pod-accessor-role
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "delete", "watch", "list"]
---

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: pod-access
subjects:
- kind: ServiceAccount
  name: cronjob-svc
  namespace: kube-system
roleRef:
  kind: ClusterRole
  name: pod-accessor-role
  apiGroup: rbac.authorization.k8s.io

---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: cronjob-svc
  namespace: kube-system

字符串
Cronjob清理死豆荚。

apiVersion: batch/v1
kind: CronJob
metadata:
  name: pod-cleaner-cron
  namespace: kube-system
spec:
  schedule: "0 */12 * * *"
  successfulJobsHistoryLimit: 1
  jobTemplate:
    spec:
      template:
        metadata:
          name: pod-cleaner-cron
          namespace: kube-system
        spec:
          serviceAccountName: cronjob-svc
          restartPolicy: Never
          containers:
          - name: pod-cleaner-cron
            imagePullPolicy: IfNotPresent
            image: bitnami/kubectl
            command:
              - "/bin/sh"
            args:
              - "-c"
              - "kubectl delete pods --field-selector status.phase=Failed -A --ignore-not-found=true"
status: {}

z31licg0

z31licg08#

受这里讨论的启发,我在GitHub上创建了以下kube-clean repository,并在artifacthub.io上创建了相应的kube-clean helm chart,为每个指定的名称空间生成一个CronJob

相关问题