我最近注意到状态为“关闭”的豆荚大量堆积。自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
。”
被驱逐的吊舱不是故意移走的,正如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信号。此时,库伯内特斯等待一个称为终止宽限期的指定时间。
有关更多信息,请参阅。