【问题标题】:Kubernetes delete deployment signalKubernetes 删除部署信号
【发布时间】:2021-06-07 09:01:40
【问题描述】:

我有以下python 代码:

import time
import os
import signal
from abc import abstractmethod

class Stopper:
    stop = False
    
    @staticmethod
    def safe_stop(*args):
        Stopper.stop = true


signal.signal(signal.SIGINT, Stopper.safe_stop)
signal.signal(signal.SIGTERM, Stopper.safe_stop)

while not Stopper.stop:
    print("Running...")
    time.sleep(1)

os.system("touch /mnt/pod/sig")
print("Done")

然后我创建了一个部署,其中包含带有上述 Python 代码的图像。

当我使用 kubectl delete -f sig.yaml 删除部署时,我的 Python 代码不会创建 sig 文件指示,也不会打印“完成”消息。

在此链接:https://cloud.google.com/blog/products/containers-kubernetes/kubernetes-best-practices-terminating-with-grace 我看到 k8s 发送 SIGINTSIGTERM 信号,但我的应用程序没有任何反应。

如何让 k8s 向我的应用程序发送信号?我做错了什么?

【问题讨论】:

  • 会不会是因为signal.singal的拼写错误?
  • 哦,抱歉,错字 - 我已修复
  • 如果你在 Kubernetes 之外运行它(使用 ^C 或 kill(1) 停止程序)它是否有效? @abstractmethod 似乎不对,我怀疑您正确接收信号但函数调用失败。
  • @DavidMaze 是的,如果我运行它并停止程序 ^C 它对我来说很有效

标签: python kubernetes sigterm


【解决方案1】:

问题出在您的 Python 代码中。您需要调整类参数并使用Stopper.stop = True(大写的T)。

以下代码适用于 Python 3:

import time
import os
import signal
from abc import abstractmethod

class Stopper:
    stop = False
    
    @abstractmethod
    def safe_stop(self, args):
        Stopper.stop = True


signal.signal(signal.SIGINT, Stopper.safe_stop)
signal.signal(signal.SIGTERM, Stopper.safe_stop)

while not Stopper.stop:
    print("Running...")
    time.sleep(1)

os.system("touch /mnt/pod/sig")
print("Done")

【讨论】:

  • 嗨,我改正了错字,但还是不行
猜你喜欢
  • 1970-01-01
  • 2019-07-12
  • 1970-01-01
  • 2020-07-18
  • 1970-01-01
  • 2021-10-04
  • 2019-11-10
  • 2019-06-15
  • 2020-11-30
相关资源
最近更新 更多