livenessProbe好像没有被执行

livenessProbe seems not to be executed

部署内定义的容器有一个 livenessProbe 设置:根据定义,它调用远程端点并检查响应是否包含有用信息或空响应(这应触发 pod 的重启)。

整个定义如下(为了标记更清晰,我删除了进一步的检查):

apiVersion: apps/v1
kind: Deployment
metadata:
  name: fc-backend-deployment
  labels:
    name: fc-backend-deployment
    app: fc-test
spec:
  replicas: 1
  selector:
    matchLabels:
      name: fc-backend-pod
      app: fc-test
  template:
    metadata:
      name: fc-backend-pod
      labels:
        name: fc-backend-pod
        app: fc-test
    spec:
      containers:
      - name: fc-backend
        image: localhost:5000/backend:1.3
        ports:
        - containerPort: 4044
        env:
        - name: NODE_ENV
          value: "dev"
        - name: REDIS_HOST
          value: "redis"
        livenessProbe:
          exec:
            command:
            - curl -X GET $BACKEND_SERVICE_HOST:$BACKEND_SERVICE_PORT/api/v3/stats | head -c 30 > /app/out.log
          initialDelaySeconds: 20
          failureThreshold: 12
          periodSeconds: 10

我也试过将命令放入数组中:

command: ["sh", "-c", "curl -X GET $BACKEND_SERVICE_HOST:$BACKEND_SERVICE_PORT/api/v3/stats", "|", "head", "-c", "30", ">", "/app/out.log"]

并分成不同的行:

- /bin/bash
- -c
- curl
- -X
- GET
- $BACKEND_SERVICE_HOST:$BACKEND_SERVICE_PORT/api/v3/stats
- |
- head
- -c
- "30"
- >
- /app/out.log

甚至像这样:

command:
  - |
      curl -X GET $BACKEND_SERVICE_HOST:$BACKEND_SERVICE_PORT/api/v3/stats | head -c 30 > /app/out.log

使用和不使用 (/bin/ba)sh -c 进行了所有尝试 - 结果相同。

但是,当您阅读本文时,您已经知道其中 none 有效。

我通过 exec 进入 运行ning 容器并尝试找到 /app/out.log 文件知道了它 - 在我查看目录内容时它不存在。看起来探测器从未执行过。

运行ning 容器中的命令 运行 工作正常:数据被提取并写入指定文件。

什么可能导致探测未被执行?

当使用 exec 类型的探测时,Kubernetes 将 而不是 运行 一个 shell 来处理命令,它只会 运行 直接命令。这意味着您只能使用一个命令,并且 | 字符被视为 curl.

的另一个参数

要解决这个问题,你需要使用sh -c来执行shell代码,类似下面的代码:

    livenessProbe:
      exec:
        command:
          - sh
          - -c
          - >-
              curl -X GET $BACKEND_SERVICE_HOST:$BACKEND_SERVICE_PORT/api/v3/stats |
              head -c 30 > /app/out.log