如何将 Kubernetes livenessprob 和 readinessprob 添加到我的 .net 核心控制台应用程序?

How to add Kubernetes livenessprob and readinessprob to my .net core console application?

我有一个简单的控制台应用程序,我希望有作为消费者的 rabbitmq 连接,并且有到 SQL 服务器的数据库连接。

在应用程序容器化之前。 我已经实现了一些命令,例如,如果我输入 X,应用程序将退出,所以在内部,我首先停止消费者并确保没有待处理的消息,然后优雅地退出应用程序。

应用程序容器化后 我确实成功地包含了应用程序并在 kuberenetes 集群下完美地工作,但我的问题是如何向我的应用程序发送命令?

例如我想实现 Livenessprob: 检查数据库连接

在终止 pod 之前,我想将 x 写入我的 运行 控制台以实现优雅地退出应用程序而不会丢失消息。

      postStart:
        exec:
          command: []
      preStop:
        exec:
          command: []

我希望解决方案是写入我的 运行 控制台应用程序的特定命令但是如何发送该命令? 或者如何让我的控制台能够接收来自 kubernetes 的命令?

在 Kubernetes 中,您可以设置 Liveness、Readiness 和 Startup Probes。查官方Kubernetes Documentation page on this topic.

Kubelet 节点代理可以使用 3 种不同的方法在 运行ning Pods 上执行这些探测:

  • HTTP:Kubelet 探测器对端点执行 HTTP GET 请求(如 /health),如果响应状态介于 200 和 399 之间则成功
  • TCP:Kubelet 探测器尝试连接到指定端口上的容器。如果能建立TCP连接,则探测成功。
  • 容器命令:Kubelet 探测器在 运行ning 容器内执行命令。如果退出代码为0,则探测成功。

如果你愿意,你可以定义一个活性探测命令:

  • 你可以运行一些命令:
livenessProbe:
  exec:
    command:
    - cat
    - /tmp/healthy
  initialDelaySeconds: 10
  periodSeconds: 5

为了执行探测,kubelet 在目标容器中执行命令cat /tmp/healthy。如果命令成功,它会返回 returns 0,并且 kubelet 认为容器是健康的。如果命令 returns 一个 non-zero 值,kubelet 会杀死容器并重新启动它。

  • 您可以 运行 位于容器中的一些 bash 脚本:
livenessProbe:
  exec:
    command: 
    - sh 
    - -c 
    - /health/ping_liveness_local.sh
...
  • 或者在探测部分编写bash脚本:
  livenessProbe:
    exec:
      command:
      - /bin/sh
      - -c
      - |-
        echo 'if the app writes a PID file, we could check that it is still alive';
        [ -f /run/my-application-web.pid ] && ps -A | grep my-application-web
 ...

容器生命周期挂钩(docs

可以为容器实现两种类型的挂钩处理程序:

  • HTTP - 对容器上的特定端点执行 HTTP 请求。
  • Exec - 在容器的 cgroup 和命名空间内执行特定命令,例如 pre-stop.sh。

示例:

spec:
  containers:
    lifecycle:
      postStart:
        exec:
          command: ["/bin/sh", "-c", "echo Hello from the postStart handler > /usr/share/message"]
      preStop:
        exec:
          command: ["/bin/sh","-c","nginx -s quit; while killall -0 nginx; do sleep 1; done"]

正如您在评论中提到的,您可以使用 touch /someDir/someFile preStop 命令创建一个文件并在您的应用程序中观察它以正常关闭。