Я не могу найти способ реализовать то, что хочу. У меня есть StatefulSet, в котором запущено несколько одинаковых модулей кода, использующих базу данных. Мне нужно, чтобы база данных была предварительно заполнена (таблицы, схемы и т. Д.). Итак, я использую контейнеры инициализации, и все идет хорошо: StatefulSet последовательно запускает один модуль за раз, контейнер инициализации запускается, выполняет свою работу, затем то же самое происходит с каждым другим контейнером, контейнер инициализации завершается очень быстро, поскольку им больше нечего делать.
---
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-контейнер, в котором написано sleep n seconds
.
Поскольку рассматриваемый код является устаревшим, я не могу использовать решение, которое включает модификации кода, например сценарий в контейнере инициализации, который входит в базу данных, чтобы проверить, правильно ли что-то установлено, мне нужно чистое решение Kubernetes.
Я тестировал, используя следующий пример набора состояний: https://raw.githubusercontent.com/kubernetes/website/master/content/en/examples/application/web/web.yaml
Теперь во втором наборе состояний я использовал initcontainer с этим кодом bash:
while true;do sleep 2; curl http://web-0.nginx/ && break ;done
Таким образом, второй набор состояний будет запущен только тогда, когда будет доступна первая копия первого.