为什么Kubernetes pod不能正常停止?

时间:2018-11-07 23:05:35

标签: kubernetes

即使删除pod,我也遇到了无法立即停止的问题。

为了正常终止,应该解决什么问题?

清单文件。

myParser [a,b]

复制程序

  1. 创建部署。
    myParser (a:b:cs)
  2. 删除部署。
    apiVersion: apps/v1 kind: Deployment metadata: name: cmd-example spec: replicas: 1 selector: matchLabels: app: cmd-example template: metadata: labels: app: cmd-example spec: terminationGracePeriodSeconds: 30 containers: - name: cmd-container image: alpine:3.8 resources: requests: cpu: 100m memory: 100Mi command: ["/bin/sh"] args: ["-c", "while true; do exec sleep 100;done"]

$ kubectl apply -f deployments.yaml输出是

kubectl delete-f 020-deployments.yaml

这应该更快完成。
完成大约30秒。可能是由于SIGKILL在终止GracePeriodSeconds 30s时发生的。
为什么不立即使用SIGTERM清理吊舱?

应该解决什么?

环境

我在以下环境中确认了它。

  • 适用于Mac的Docker:18.06.1-ce,Kubernetes:v1.10.3
  • 适用于Windows的Docker:18.06.1-ce,Kubernetes:v1.10.3
  • Google Kubernete Engine:1.11.2-gke.15

3 个答案:

答案 0 :(得分:1)

Hiroki Matsumoto,pod端接的行为就像它的设计行为一样。 您可以在Pod的documentation部分中找到

  

由于Pod表示集群中节点上正在运行的进程,因此   重要的是要允许这些进程在以下情况下正常终止   不再需要它们(与被杀害凶杀   信号,没有机会清理。)

长话短说(根据官方文档)

1)运行re.sub(r'(?!^)', '?', "Man") # Yields "M?a?n?" 时,您发送的命令的宽限期(默认为30秒)

2)运行kubectl delete -f deployments.yaml时,您可以看到它具有kubectl get pods状态

3)Kubelet看到此状态,并且Pod开始关闭。

4)宽限期结束后,如果仍有任何进程在运行,它将被SIGKILL杀死

因此要立即删除广告连播,您必须将宽限期降低为0并执行强制/立即删除:

terminating,这将导致立即删除。

答案 1 :(得分:1)

问题原因

此外壳程序是即使接受SIGTERM信号也不会停止。

解决方案

使用trap命令。

已更改地点

    command: ["/bin/sh"]
    args: ["-c", "trap 'exit 0' 15;while true; do exec sleep 100 & wait $!; done"]

结果

删除后,pod马上被清理干净!

img-example-d68954677-mwsqp   1/1       Running   0         2s
img-example-d68954677-mwsqp   1/1       Terminating   0         8s
img-example-d68954677-mwsqp   0/1       Terminating   0         10s
img-example-d68954677-mwsqp   0/1       Terminating   0         11s
img-example-d68954677-mwsqp   0/1       Terminating   0         11s

答案 2 :(得分:0)

您的广告连播实际上没有任何作用。如果您只想在偶尔在集群内部进行交互式调试的地方,请考虑使用kubectl run获得一次性的交互式容器

kubectl run --rm -it --name debug --image alpine:3.8

根据您的Pod规范尝试运行的命令,以shell脚本形式重写它:

#!/bin/sh
# Forever:
while true
do
  # Replace this shell with a process that sleeps for
  # 100 ms, then exits
  exec sleep 100
  # The shell no longer exists and you'll never get here
done

我不清楚Pod正在尝试做什么,但是如果您移除exec,至少它不会退出。 (它仍将永远处于空闲循环中。)