Назад | Перейти на главную страницу

Порядки, зависимости и приоритеты ресурсов Kubernetes

Я не могу найти способ реализовать то, что хочу. У меня есть 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

Таким образом, второй набор состояний будет запущен только тогда, когда будет доступна первая копия первого.