Как я могу позволить контейнеру (коляске) завершаться в рамках развертывания Kubernetes без его перезапуска? - PullRequest
1 голос
/ 16 января 2020

Мое развертывание состоит из:

  • контейнера инициализации
  • долгосрочной службы
  • дополнительной машины, которая должна настроить связанную службу.

Работа коляски выполняется после настройки отдельной службы. Однако он не может завершиться, потому что Kubernetes просто перезапустит его снова. Он не должен быть частью контейнера init, поскольку он не должен блокировать запуск службы.

Поскольку развертывания не позволяют OnFailure restartPolicy, моя текущая реализация заключается в том, чтобы позволить коляске go спать после это делается с помощью задачи конфигурации.

Есть ли способ разрешить завершению контейнера без перезапуска развертывания? В качестве альтернативы, есть ли способ для контейнера init запускаться вместе с обычными контейнерами?

Некоторые детали для решения проблем XY:

  • Служба выполняет некоторую обработку и выводит результаты в базу данных. .
  • Связанная служба предоставляет API для значений, хранящихся в базе данных.
  • Эти две службы находятся в отдельных развертываниях, поскольку я предполагаю, что они будут масштабироваться отдельно.

Пример:

#my-service.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-service
spec:
  replicas: 1
  template:
    spec:
      initContainers:
        - name: my-service-init
          image: my-service
          imagePullPolicy: IfNotPresent
          env:
          - name: DATABASE_URL
            value: postgres://postgres:postgres_password@$db_host:5432/database
          args: ['init_script.py']
      containers:
        - name: my-service
          env:
          - name: DATABASE_URL
            value: postgres://db_role:db_password@$db_host:5432/database
          image: my-service
          imagePullPolicy: IfNotPresent
          args: ['main.py']
        - name: related-service-configure
          env:
          - name: RELATED_API_SERVICE_ADMIN_ENDPOINT
            value: http://related_api_service/api/
          image: my-service
          imagePullPolicy: IfNotPresent
          args: ['manage_related_service.py']
#related-api-service.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: related-api-service  
spec:
  replicas: 1
  template:
    spec:
      containers:
        - name: related-api-service
          env:
          - name: DATABASE_URL
            value: postgres://db_role:db_password@$db_host:5432/database
          image: related-api-image
          imagePullPolicy: IfNotPresent
          ports:
          - containerPort: 8080
            name: http
            protocol: TCP
#manage_related_service.py
import time
import requests
import json


def upgrade_metadata(query_url, metadata_file):
    with open(metadata_file) as fp:
        metadata = json.load(fp)

    print(f"Querying {query_url}...")
    rsp = requests.post(query_url, json=metadata)
    response = rsp.json()
    print(f"Response to request was:\n{response}")
    if response.get('success') != 'True':
        raise ValueError("Metadata upgrade was not successful")


if __name__ == '__main__':
    from environs import Env
    env = Env()
    env.read_env()

    RELATED_API_SERVICE_ADMIN_ENDPOINT = env("RELATED_API_SERVICE_ADMIN_ENDPOINT")
    METADATA_FILE = env("METADATA_FILE", "metadata.json")

    upgrade_metadata(RELATED_API_SERVICE_ADMIN_ENDPOINT, METADATA_FILE)

    # Once metadata has been uploaded, sleep forever
    while True:
        time.sleep(3600)

1 Ответ

0 голосов
/ 30 января 2020

Я думаю, вы должны создать Kubernestes Jobs вместо Deployments. Затем вы должны завершить коляску. После этого указанный контейнер c также будет автоматически завершен.

Вы можете смоделировать определенные c поведения коляски. Вот пример сценария, который поможет вам сделать это:

containers:
  - name: example
    image: gcr.io/some/image:latest
    command: ["/bin/bash", "-c"]
    args:
      - |
        trap "touch /tmp/pod/main-terminated" EXIT
        /my-batch-job/bin/main --config=/config/my-job-config.yaml
    volumeMounts:
      - mountPath: /tmp/pod
        name: tmp-pod
  - name: envoy-container
    image: gcr.io/our-envoy-plus-bash-image:latest
    command: ["/bin/bash", "-c"]
    args:
      - |
        /usr/local/bin/envoy --config-path=/my-batch-job/etc/envoy.json &
        CHILD_PID=$!
        (while true; do if [[ -f "/tmp/pod/main-terminated" ]]; then kill $CHILD_PID; fi; sleep 1; done) &
        wait $CHILD_PID
        if [[ -f "/tmp/pod/main-terminated" ]]; then exit 0; fi
    volumeMounts:
      - mountPath: /tmp/pod
        name: tmp-pod
        readOnly: true
volumes:
  - name: tmp-pod
    emptyDir: {}

Более подробную информацию вы можете найти здесь: Завершение коляски , Боковое поведение .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...