Kubernetes liveness 探测:pod 可以监控自己的标准输出吗?

Kubernetes liveness probe: can a pod monitor its own stdout?

我的想法是将 liveness probe 实现为命令,并使用类似

的东西
$ grep something ERROR

从 pod 内部,因此如果在 pod 的输出中存在包含 ERROR 的行,则 liveness 探测失败。

这可能吗?如果没有,我是否可以在同一个 pod 中添加另一个容器来监控第一个容器?

您可以查询 Kubernetes API server.

请求如下所示:

GET /api/v1/namespaces/{namespace}/pods/{name}/log

要使用通常挂载在 Pod 中的令牌,您可以这样调用它:

curl https://kubernetes/api/v1/namespaces/default/pods/$HOSTNAME/log -k \
     -H "Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)"

当然,每个 pod 可以有一个以上的容器。这不是标准方法,因为它违反了 "one process per container" 原则。您可以阅读此 article 解释 Kubernetes 中的多容器 pods,有哪些用例等等。

apiVersion: v1
kind: Pod
metadata:
  name: test
spec:
  containers:
  - name: 1st
    image: nginx
    volumeMounts:
    - name: html
      mountPath: /tmp/html
    livenessProbe:
      exec:
        command:
        - cat
        - /tmp/html/test
      initialDelaySeconds: 10
      periodSeconds: 3
  - name: 2nd
    image: debian
    volumeMounts:
    - name: html
      mountPath: /tmp/html
    command: ["/bin/sh", "-c"]
    args:
      - while true; do
          date >> /tmp/html/test;
          sleep 5;
        done
  volumes:
  - name: html
    emptyDir: {}

在此示例中 pod 有两个容器。装有 /tmp/htmllivenessProbe 的容器 1st 运行 nginx 开始后 10 秒检查文件 /tmp/html/test 是否每 3 秒存在一次缺少它会重新启动容器。 2nd容器 运行 debian 安装了 /tmp/html/,但它也会每 5 秒向文件 /tmp/html/test 添加数据条目。

在上面的示例中,如果您手动删除文件并探测缓存它,它将重新启动 1st 容器。

您必须根据您的特定需求调整此示例,例如使用 grep -q ERROR /tml/html/test,如果成功删除 /tmp/html/test 或更改探测器本身。