Исходя из предоставленной вами информации, я полагаю, что вы можете достичь своей цели с помощью функции Kubernetes, которая называется InitContainer :
Контейнеры Init точно такие же, как обычные контейнеры, за исключением:
- Контейнеры инициализации всегда выполняются до завершения.
- Каждый контейнер инициализации должен успешно завершиться до запуска следующего.
Если контейнер инициализации модуля Pod завершается неудачно, Kubernetes повторно перезапускает Pod, пока контейнер init не будет успешным. Однако, если Pod имеет restartPolicy
Never, Kubernetes не перезапускает Pod.
- Я создам
initContainer
с busybox
для запуска команды linux для ожидания запуска службы mydb
перед продолжением развертывания.
Шаги для воспроизведения: - Создайте развертывание с initContainer
, которое будет запущено задание, которое необходимо выполнить перед развертыванием:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
run: my-app
name: my-app
spec:
replicas: 2
selector:
matchLabels:
run: my-app
template:
metadata:
labels:
run: my-app
spec:
restartPolicy: Always
containers:
- name: myapp-container
image: busybox:1.28
command: ['sh', '-c', 'echo The app is running! && sleep 3600']
initContainers:
- name: init-mydb
image: busybox:1.28
command: ['sh', '-c', "until nslookup mydb.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for mydb; sleep 2; done"]
В этом поле можно использовать многие виды команд, вам просто нужно выбрать docker образ, содержащий необходимый вам двоичный файл (включая ваше sequelize
задание)
- Теперь давайте применим его, чтобы увидеть состояние развертывания:
$ kubectl apply -f my-app.yaml
deployment.apps/my-app created
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
my-app-6b4fb4958f-44ds7 0/1 Init:0/1 0 4s
my-app-6b4fb4958f-s7wmr 0/1 Init:0/1 0 4s
Блоки находятся в состоянии Init:0/1
в ожидании завершение инициализации контейнера. - Теперь давайте создадим сервис, который initcontainer ожидает запуска, прежде чем завершить свою задачу:
apiVersion: v1
kind: Service
metadata:
name: mydb
spec:
ports:
- protocol: TCP
port: 80
targetPort: 9377
- Мы применим его и будем следить за изменениями в модулях:
$ kubectl apply -f mydb-svc.yaml
service/mydb created
$ kubectl get pods -w
NAME READY STATUS RESTARTS AGE
my-app-6b4fb4958f-44ds7 0/1 Init:0/1 0 91s
my-app-6b4fb4958f-s7wmr 0/1 Init:0/1 0 91s
my-app-6b4fb4958f-s7wmr 0/1 PodInitializing 0 93s
my-app-6b4fb4958f-44ds7 0/1 PodInitializing 0 94s
my-app-6b4fb4958f-s7wmr 1/1 Running 0 94s
my-app-6b4fb4958f-44ds7 1/1 Running 0 95s
^C
$ kubectl get all
NAME READY STATUS RESTARTS AGE
pod/my-app-6b4fb4958f-44ds7 1/1 Running 0 99s
pod/my-app-6b4fb4958f-s7wmr 1/1 Running 0 99s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/mydb ClusterIP 10.100.106.67 <none> 80/TCP 14s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/my-app 2/2 2 2 99s
NAME DESIRED CURRENT READY AGE
replicaset.apps/my-app-6b4fb4958f 2 2 2 99s
Если вам нужна помощь, чтобы применить это в вашей среде, дайте мне знать.