2

我想知道是否有可能对 pod 中的多个容器或仅对 pod 中的一个容器应用活性和就绪探测检查。我确实尝试使用多个容器进行检查,但容器 A 的探测检查失败,并且容器 B 在 pod 中通过。

4

3 回答 3

2

欢迎来到社区。

回答

绝对可以对 pod 中的容器应用多个探针。接下来会发生什么取决于探测。

Containers 探针中列出了三个可以使用的探针livenessreadinessstartup。我将更多地描述livenessand readiness

活力

livenessProbe:指示容器是否正在运行。如果 liveness探测失败,kubelet 会杀死容器,并且容器会受到其重启策略的约束。如果 Container 不提供liveness探测,则默认状态为 Success

kubelet 使用 liveness probes 来了解何时重新启动容器。例如,活跃度探针可以捕获死锁,即应用程序正在运行,但无法取得进展。尽管存在错误,但在这种状态下重新启动容器有助于使应用程序更可用。

如果livenessProbe失败,kubelet将在 POD 中重新启动容器,POD 将保持不变(它的年龄也是如此)。

也可以签入container events,此报价来自Kubernetes in Action - Marko Lukša

我在很多场合都看到过这种情况,用户很困惑为什么要重新启动他们的容器。但如果他们使用kubectl describe,他们会看到容器以退出代码 137 或 143 终止,告诉他们 pod 已在外部终止

准备就绪

readinessProbe:指示容器是否准备好响应请求。如果readiness探测失败,端点控制器会从与 Pod 匹配的所有服务的端点中删除 Pod 的 IP 地址。初始延迟之前的默认状态readiness是失败。如果 Container 不提供readiness探测,则默认状态为 Success

kubelet 使用就绪探针来了解容器何时准备好开始接受流量。当 Pod 的所有容器都准备好时,就认为 Pod 准备好了。此信号的一种用途是控制哪些 Pod 用作服务的后端。当 Pod 未准备好时,它会从服务负载均衡器中移除。

这里发生的是 kubernetes 检查容器中的 webserver 是否正在处理请求,如果没有,则readinessProbe失败,并且 POD 的 IP(通常是整个 POD)将从端点中删除,并且不会将流量定向到 POD。

有用的链接

于 2021-06-22T08:07:56.653 回答
0

根据 K8S 规范,可以对每个容器执行活动性和就绪性检查,并带有自己的模板,该模板嵌套在特定的容器中。参见例如:https ://raw.githubusercontent.com/kubernetes/website/main/content/en/examples/pods/probe/exec-liveness.yaml 。

所以我认为这真的取决于你在探测中检查什么以及容器A如何以与容器B不同的方式回答。

如果你需要模板,你应该看看kustomize

于 2021-06-21T12:15:14.813 回答
0

是的,这是可能的,我已经尝试过了。这是我尝试过的。

  • 一个部署有 2 个副本。
  • 每个副本 pod 有 4 个容器。
  • 每个容器都有自己的活性探针。
  • http-get用于检查容器应用程序运行状况的活性探针。

需要注意的几点:

  • 由于<PODIP>:<CONTAINERPORT>/<ENDPOINT>liveness probe 使用它来发出 http 请求,因此必须确保<CONTAINERPORT>每个容器都不同。否则,吊舱将转到CrashLoopBack​​.

例子:

containers:
       - name: container1
...
        args:
        - --leader-election=true
        - --http-endpoint=:8080
...
        ports:
        - containerPort: 8080
          name: http-endpoint
          protocol: TCP
...
        livenessProbe:
          failureThreshold: 1
          httpGet:
            path: /healthz/leader-election
            port: http-endpoint
            scheme: HTTP
          initialDelaySeconds: 10
          periodSeconds: 20
          successThreshold: 1
          timeoutSeconds: 10
...
       - name: container2
...
        args:
        - --leader-election=true
        - --http-endpoint=:8081
...
        ports:
        - containerPort: 8081
          name: http-endpoint
          protocol: TCP
...
        livenessProbe:
          failureThreshold: 1
          httpGet:
            path: /healthz/leader-election
            port: http-endpoint
            scheme: HTTP
          initialDelaySeconds: 10
          periodSeconds: 20
          successThreshold: 1
          timeoutSeconds: 10
...

建议:

如果每个容器都是一个单独的应用程序并且不相互依赖并且足够重要以至于您需要对其进行活性探测,那么最好将它们部署在单独的 Pod 中。

于 2022-02-04T04:45:58.710 回答