【问题标题】:Why does not Kubernetes pod graceful stop?为什么 Kubernetes pod 不优雅停止?
【发布时间】:2018-11-07 23:05:35
【问题描述】:

我遇到了即使删除pod也不会立即停止的问题。

为了正常终止应该修复什么?

清单文件。

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"]

繁殖过程

  1. 创建部署。
    $ kubectl apply -f deployments.yaml
  2. 删除部署。
    kubectl delete-f 020-deployments.yaml

kubectl get po -woutput 是。

cmd-example-5cccf79598-zpvmz   1/1       Running   0         2s
cmd-example-5cccf79598-zpvmz   1/1       Terminating   0         6s
cmd-example-5cccf79598-zpvmz   0/1       Terminating   0         37s
cmd-example-5cccf79598-zpvmz   0/1       Terminating   0         38s
cmd-example-5cccf79598-zpvmz   0/1       Terminating   0         38s

这应该会更快完成。
完成大约需要 30 秒。可能是由于终止时的 SIGKILLGracePeriodSeconds 30s。
为什么不立即使用 SIGTERM 清理 pod?

应该解决什么问题?

环境

我在以下环境中确认了。

  • Docker for Mac:18.06.1-ce,Kubernetes :v1.10.3
  • Docker for Windows:18.06.1-ce,Kubernetes :v1.10.3
  • Google Kubernetes 引擎:1.11.2-gke.15

【问题讨论】:

  • 那能回答你的问题吗?
  • 我检查了这个文档,但找不到任何解决问题的方法。对不起。我英语不好,给我带来了误解。如果正常关机,我理解 Pod 是被 SIGTERM 终止的,会被清理而不等待终止GracePeriodSeconds,是我理解错了吗?

标签: kubernetes


【解决方案1】:

问题原因

这个shell就是即使接受SIGTERM的信号也不会停止。

解决方案

使用陷阱命令。

换了地方

    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】:

    Hiroki Matsumoto,吊舱终端的行为就像它设计的行为一样。 您可以在 Pod 的 documentation 部分找到:

    因为 pod 代表集群中节点上正在运行的进程,所以它 允许这些进程在何时正常终止很重要 不再需要它们(与被 KILL 暴力杀死相比) 信号并且没有机会清理)。

    长话短说(基于官方文档)

    1) 当你运行kubectl delete -f deployments.yaml 时,你会发送一个带有宽限期的命令(默认为 30 秒)

    2) 当你运行kubectl get pods 时,你可以看到它有terminating 状态

    3) Kubelet 看到这个状态,Pod 开始关闭。

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

    因此,要立即删除 pod,您必须将宽限期降低到 0 并运行强制/立即删除:

    kubectl delete -f deployments.yaml --grace-period=0 --force 这会导致即时删除。

    【讨论】:

    • 感谢您的回答。我明白为什么 SIGTERM 没有结束而 SIGKILL 完成了!这是因为您没有捕获 SIGTERM。我需要修复外壳。我将总结它是如何解决的。
    • 我写了解决的结果。 stackoverflow.com/questions/53199243/…
    【解决方案3】:

    您的 pod 实际上什么也没做。如果您只想在“集群内”进行偶尔的交互式调试,请考虑使用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,它至少不会退出。 (它仍然会永远处于空闲循环中。)

    【讨论】:

    • 这是一个简单的复制命令。我一直想运行容器。这是使用命令复制的。例如command : ["/ usr / bin / tail", "-f", "/"] 我了解 pod 终止过程如下所示。 STEP 1. 发送 SIGTERM 信号→ STEP 2. 等待终止GracePeriod 秒。→ STEP 3. 发送 SIGKILL 信号。我认为如果进程在终止GracePeriod之前终止,则不会执行第3步,但它有什么不同吗?总是等待终止GracePeriod 和 SIGKILL ?
    猜你喜欢
    • 2017-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-02
    • 1970-01-01
    • 1970-01-01
    • 2010-11-05
    • 1970-01-01
    相关资源
    最近更新 更多