Kubernetes 资源顺序、依赖关系和优先级

Kubernetes 资源顺序、依赖关系和优先级

我找不到合适的方法来实现我想要的。我有一个 StatefulSet,运行几个相同的使用数据库的代码 pod。我需要先预填充数据库(表、模式等)。所以我使用 init-containers,一切进展顺利:StatefulSet 一次按顺序启动一个 pod,init-container 被触发,执行其工作,然后其他每个容器都会发生同样的事情,init 容器很快就会结束,因为它们没有其他事情要做。

---
kind: StatefulSet
apiVersion: apps/v1
metadata:
  name: the-name-1
spec:
  replicas: 3
  selector:
    matchLabels:
      name: the-name-1
  template:
    metadata:
      labels:
        name: the-name-1
    spec:
      initContainers:
        - name: init
          image: registry/image1
          command: ["/bin/sh"]
          args: ["-c", "set -e; /scripts/pre-populate-db.sh;"]
      containers:
        - name: container-1
          image: registry/image1

但是,现在我还有第二个 StatefulSet,它也需要预先填充数据库。因此,第二个 StatefulSet 需要第一个 StatefulSet 中的至少一个容器成功启动。

我找不到合适的方法来告诉这个 StatefulSet:等待第一个 StatefulSet 完成其工作。我更确切地说,恰当的,因为我不想有一个说 的 init-container sleep n seconds

由于所讨论的代码是遗留的,我无法采用涉及代码修改的解决方案,例如进入数据库以检查某些设置是否正确的 init 容器中的脚本,我想要一个纯 Kubernetes 解决方案。

  • 有没有办法告诉 StatefulSet pod 等待“Kubernetes 某物”准备就绪后再启动?
  • 有没有办法运行 Kubernetes Job 并使 Deployment/StatefulSet 依赖于该 Job 是否正确执行?

答案1

我使用以下 statefulset 示例进行了测试:https://raw.githubusercontent.com/kubernetes/website/master/content/en/examples/application/web/web.yaml

现在在第二个 statefulset 中我使用了带有以下 bash 代码的 initcontainer:

while true;do sleep 2; curl http://web-0.nginx/ && break ;done

这样,仅当第一个 statefulset 的第一个副本可用时,才会运行第二个 statefulset。

相关内容