【问题标题】:How to check readiness without creating a deadlock in a cluster configuration in Kubernetes?如何在不在 Kubernetes 的集群配置中创建死锁的情况下检查准备情况?
【发布时间】:2021-10-11 22:17:42
【问题描述】:

我想部署一个包含三个副本的服务,每个副本都有一个就绪探测。只有当其他两个 pod 也启动时,一个 pod 才会开始工作(在测试就绪的端口发送数据)。这三个 pod 都需要启动,在内部服务中注册它们的 IP,然后它们才能被发现。

在我看来,就绪探测器是按顺序工作的,因此只会启动一个 pod。这会造成死锁情况,即启动的 pod 等待其他两个 pod 开始运行,即使它们没有启动应用程序,并且 K8s 不会启动其他两个 pod,直到第一个 pod 的就绪状态得到满足。

我的就绪配置是:

readinessProbe=ExecProbe(
          execute=ExecAction(command=["curl", "localhost:2004"]),
          initialDelaySeconds=120,
          timeoutSeconds=10,
          periodSeconds=10,
          successThreshold=1,
          failureThreshold=10
        )

我希望我的 pod 能够启动,即使当前的 pod 正在运行但它们的准备工作不成功。或者也许我应该使用准备之外的其他东西?

【问题讨论】:

  • 你使用的是 Deployment 还是 StatefulSet?
  • 如何确认?每个 pod 都有自己的 PVC,所以 StatefulSet?

标签: kubernetes readinessprobe


【解决方案1】:

如果您使用 StatefulSet,请使用 parallel pod management 以允许 Kubernetes 并行创建副本,而无需等待之前的 pod 准备好。

在 StatefulSet 的清单中设置 .spec.podManagementPolicy: Parallel

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql-db
spec:
  podManagementPolicy: Parallel
  replicas: 3
  <omitted>

【讨论】:

  • 但是,在执行更新的同时,不启动新的 Pod 是否也会终止 Pod?
  • @AviralSrivastava,不,它只影响缩放操作(包括初始创建和完全删除)。来自kubernetes.io/docs/concepts/workloads/controllers/statefulset/…This option only affects the behavior for scaling operations. Updates are not affected.
猜你喜欢
  • 1970-01-01
  • 2017-09-04
  • 1970-01-01
  • 1970-01-01
  • 2019-11-08
  • 1970-01-01
  • 2020-06-28
  • 2019-12-26
  • 2015-04-14
相关资源
最近更新 更多