如何为 livenessProbe/readinessProbe 定义 Pod 健康检查端口

How to define Pod health check port for livenessProbe/readinessProbe

如何定义不同的 Pod 端口,一个用于应用程序,另一个用于健康检查 (readinessProbe)?

下面显示的端口规范是否是使 readinessProbe 检查健康检查端口的正确方法 TCP/9090?我的意思是,readinessProbe 是否会到达端口 9090(当然假设它由 运行 容器打开)?或者是否需要指定任何其他端口(nodePort、targetPort、端口等)?

kind: Deployment
spec:
  template:
    spec:
      containers:
      - name: myapp
        image: <image>
        ports:
        - name: myapp-port
          containerPort: 8080
          protocol: TCP
        - name: healthcheck-port
          containerPort: 9090
          protocol: TCP

        readinessProbe:
          httpGet:
            port: healthcheck-port
            scheme: HTTP
          initialDelaySeconds: 60
          timeoutSeconds: 5
          periodSeconds: 10
          successThreshold: 2
          failureThreshold: 2

是的,您的规范片段几乎正确。您无需指定任何其他内容即可使就绪探测工作。

端口名称不能超过 15 个字符,因此名称 healthcheck-port 无效。您可能希望将名称更改为更小的名称,例如 healthcheck

您可以为 livenessProbereadinessProbe 指定任何端口和路径(假设它是 http),但是,当然,您需要在那里提供一些服务。

它不应该是一个服务端口,所以 NodePort 不是一个选项,因为它 kubelet 负责容器的健康,并且它可以直接访问容器。

您当前的配置几乎与@shashank-v 提到的一样正确,除了端口名称。

除了名称之外,我想在这里指出的是使用与最佳实践相同的端口,即 TCP/8080 但有一个 healthz 路径,您的应用程序在其中响应 okrunning。然后在你的 httpget:

readinessProbe:
      httpGet:
        port: 8080
        path: /healthz
readinessProbe:
  tcpSocket:
    port: 8080
  initialDelaySeconds: 5
  periodSeconds: 10

很好的参考:

https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#define-a-tcp-liveness-probe