我找不到合适的方法来实现我想要的。我有一个 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。