Облачная платформаAdvanced

Настройка жизненного цикла контейнера

Язык статьи: Русский
Показать оригинал
Страница переведена автоматически и может содержать неточности. Рекомендуем сверяться с английской версией.

Хуки жизненного цикла контейнера являются базовыми механизмами, предоставляемыми Kubernetes. Они позволяют вставлять пользовательскую логику на ключевых этапах жизненного цикла контейнера. Эти хуки обеспечивают тонкий контроль процессов над контейнеризованными приложениями, позволяя приложениям лучше адаптироваться к динамическим характеристикам облачной нативной среды. CCE предоставляет следующие хуки жизненного цикла контейнера. Для получения дополнительной информации см. Container Lifecycle Hooks.

  • Startup Command: команда, выполняемая при запуске контейнера. Она используется для определения основного процесса контейнера. Основной процесс является записью по умолчанию после запуска контейнера, и его статус определяет жизненный цикл контейнера. Такой тип хука применим к сценариям инициализации, когда необходимо указать точку входа приложения, переменные среды, точки монтирования или сопоставление портов.
  • PostStart Hook: используется для выполнения задач инициализации, таких как регистрация сервисов и генерация динамической конфигурации, сразу после запуска основного процесса контейнера. Такой хук асинхронно вызывается kubelet и работает параллельно с основным процессом, предотвращая блокировку процесса запуска контейнера и ускоряя готовность контейнера. Этот тип хука применим к сценарию, когда необходимо настроить окружение или выполнить логику инициализации сразу после запуска процесса приложения.
  • PreStop Hook: используется для выполнения предопределённой логики очистки перед завершением контейнера. Когда pod удаляется или обновляется, kubelet вызывает этот хук для выполнения операций (например, отмены регистрации сервисов и обновления статуса), после чего отправляет сигнал SIGTERM основному процессу контейнера, чтобы приложение завершилось корректно. Этот тип хука применим к сценарию, когда требуется безопасное завершение для предотвращения потери данных или при возникновении исключений сервисов.

Startup Command

Команда запуска выполняется при старте контейнера. Она используется для определения основного процесса контейнера. Статус основного процесса определяет жизненный цикл контейнера. Если команда не выполнится и политика перезапуска не настроена, контейнер будет завершён.

По умолчанию команда по умолчанию выполняется при запуске образа. Чтобы выполнить конкретную команду или переопределить настройку образа по умолчанию, необходимо выполнить определённые операции. По умолчанию контейнер исполняет предустановленную в образе команду запуска. Образы Docker содержат набор полей метаданных для определения поведения при запуске, включая ENTRYPOINT и CMD. Если команды и аргументы (указанные в Command и Args) не настроены в спецификациях контейнера, используются значения по умолчанию, заданные при сборке образа.

Если команды и аргументы, используемые для запуска контейнера, настроены во время создания рабочей нагрузки, команды по умолчанию ENTRYPOINT и CMD перезаписываются при сборке образа. Правила следующие:

Table 1 Команды и аргументы, используемые для запуска контейнера

Image ENTRYPOINT

Image CMD

Command to Run a Container

Argument to Run a Container

Command Executed

[touch]

[/root/test]

Не задано

Не задано

[touch /root/test]

[touch]

[/root/test]

[mkdir]

Не задано

[mkdir]

[touch]

[/root/test]

Не задано

[/opt/test]

[touch /opt/test]

[touch]

[/root/test]

[mkdir]

[/opt/test]

[mkdir /opt/test]

  1. Войдите в CCE console.
  2. Нажмите имя кластера, чтобы перейти в консоль кластера, выберите Workloads в панели навигации и нажмите Create Workload в правом верхнем углу.
  3. В Container Settings выберите Container Information > Lifecycle > Startup Command и введите команду и аргументы.

    Table 2 Команда запуска контейнера

    Параметр

    Пример значения

    Описание

    Пример YAML

    Команда

    • /bin/sh

    Введите одну или несколько исполняемых команд. Для нескольких команд разместите каждую на отдельной строке.

    ПРИМЕЧАНИЕ:

    При выполнении нескольких команд используйте /bin/sh или другой shell в качестве исполняемого файла и передавайте команды в виде аргументов.

    ...
    spec:
    containers:
    - image: nginx:latest
    command:
    - /bin/sh
    args:
    - '-c '
    - sleep 10
    ...

    Args

    • -c
    • sleep 10

    Введите один или несколько аргументов. Если требуется несколько аргументов, разделите их разными строками.

  4. Настройте остальные параметры и нажмите Create Workload в правом нижнем углу. Если рабочая нагрузка находится в состоянии Running, команда запуска успешно выполнена.

PostStart Hook

PostStart hook, хук жизненного цикла контейнера, предоставляемый Kubernetes, используется для выполнения задач инициализации, таких как регистрация сервисов и генерация динамической конфигурации, сразу после запуска основного процесса контейнера. Этот хук асинхронно вызывается kubelet и работает параллельно с основным процессом. Хотя PostStart hook выполняется асинхронно с основным процессом контейнера, если он занимает слишком много времени или приостановлен, контейнер может не перейти в состояние Running. Если выполнение PostStart hook не удалось, контейнер может не запуститься и будет завершён.

  1. Войдите в CCE console.
  2. Нажмите имя кластера, чтобы перейти в консоль кластера, выберите Workloads в панели навигации и нажмите Create Workload в правом верхнем углу.
  3. В Container Settings выберите Container Information > Lifecycle > Post-Start и настройте параметры в соответствии с требованиями сервиса. Например:

    • Если логика инициализации (например, запуск скриптов и настройка окружения) должна быть выполнена в контейнере, выберите CLI.
    • Когда внешним системам или сервисам требуется уведомление, например, регистрация сервиса или вызов Settings API, выберите HTTP request.

    Таблица 3 Обработка postStart

    Метод обработки

    Пример значения

    Описание

    Пример YAML

    CLI

    Выполните следующие команды, чтобы записать файл сообщения в каталог /usr/share контейнера:

    • /bin/sh
    • -c
    • echo Hello from the postStart handler > /usr/share/message

    Используется для выполнения команд в контейнере. Необходимо настроить Command.

    Формат команды: Command Arg[1] Arg[2]..., где Command обозначает системную команду или пользовательскую исполняемую программу. Если путь не указан, система ищет команду в пути по умолчанию. Если необходимо выполнить несколько команд, запишите их в скрипт в образе контейнера заранее и вызовите скрипт с помощью этой команды. Эта исполняемая командадолжна выполняться синхронно или во фронтенде. Если она выполняется асинхронно или в бэкенде, обработчик жизненного цикла может не выполниться.

    ВНИМАНИЕ:

    Убедитесь, что скрипт postStart выполняется до завершения и корректно завершается. В противном случае последующие обновления статуса pod и удаление pod будут затронуты.

    ...
    lifecycle:
    postStart:
    exec:
    command:
    - /bin/sh
    - '-c'
    - echo Hello from the postStart handler > /usr/share/message
    ...

    HTTP‑запрос

    • Path: /nginx
    • Port: 80
    • Host: 127.0.0.1

    Используется для инициирования HTTP‑запроса. Связанные параметры описаны ниже:

    • Path: (optional) URL запроса.
    • Port: (mandatory) запрашиваемый порт.
    • Host: (optional) запрашиваемый IP‑адрес хоста. Значение по умолчанию — IP‑адрес pod.
    lifecycle:
    postStart:
    httpGet:
    path: /nginx
    port: 80
    host: 127.0.0.1
    scheme: HTTP
    ...

  4. Настройте остальные параметры и нажмите Create Workload в правом нижнем углу. Через некоторое время статус workload изменится на Running.

PreStop Hook

Если контейнер падает или завершается аномально, хук PreStop не будет вызван. Период Grace Period завершения pod начинает отсчёт до выполнения хука PreStop. Независимо от результата обработчика хука, контейнер будет завершён в течение периода Grace Period завершения pod, если только финализатор не задерживает процесс завершения. Другие операции управления контейнером блокируются до завершения хука PreStop или истечения периода Grace Period.

  1. Войдите в CCE console.
  2. Нажмите название кластера, чтобы перейти в консоль кластера, выберите Workloads в панели навигации и нажмите Create Workload в правом верхнем углу.
  3. В Container Settings выберите Container Information > Lifecycle > Pre-Stop и настройте параметры.

    Table 4 Параметры обработки Pre-stop

    Параметр

    Пример значения

    Описание

    Пример YAML

    CLI

    Введите следующие команды для корректной остановки службы Nginx:

    • /bin/sh
    • -c
    • nginx -s quit; while killall -0 nginx; do sleep 1; done

    Используется для выполнения команд в контейнере. Вам необходимо настроить Command.

    Формат команды: Command Arg[1] Arg[2]..., где Command указывает на системную команду или пользовательскую исполняемую программу. Если путь не указан, система ищет команду в пути по умолчанию. Если необходимо выполнить несколько команд, запишите их в скрипт в образе контейнера заранее и вызовите скрипт с помощью этой команды.

    ...
    lifecycle:
    preStop:
    exec:
    command:
    - /bin/sh
    - '-c'
    - nginx -s quit; while killall -0 nginx; do sleep 1; done
    ...

    HTTP запрос

    • Path: /nginx
    • Port: 80
    • Host: 127.0.0.1

    Используется для инициации HTTP запроса. Связанные параметры описаны следующим образом:

    • Path: (необязательно) URL запроса.
    • Port: (обязательно) запрашиваемый порт.
    • Host: (необязательно) запрашиваемый IP-адрес хоста. Значение по умолчанию — IP-адрес pod.
    lifecycle:
    preStop:
    httpGet:
    path: /nginx
    port: 80
    host: 127.0.0.1
    scheme: HTTP
    ...

  4. Настройте другие параметры и нажмите Create Workload в правом нижнем углу. Через некоторое время статус workload изменится на Running.

Пример YAML

  1. Используйте kubectl для доступа к кластеру. Подробности см. в Accessing a Cluster Using kubectl.
  2. Создайте YAML‑файл для настройки workload. В этом примере имя файла lifecycle.yaml. При необходимости его можно изменить.

    vim lifecycle.yaml

    Пример содержимого файла:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: nginx
    spec:
    replicas: 1
    selector:
    matchLabels:
    app: nginx
    template:
    metadata:
    labels:
    app: nginx
    spec:
    containers:
    - image: nginx
    command: # Startup command: Pause the current process for 10 seconds.
    - /bin/sh
    args:
    - '-c '
    - sleep 10
    imagePullPolicy: Always
    lifecycle:
    postStart: # Post-start command: Write the message file to the container's /usr/share directory.
    exec:
    command:
    - /bin/sh
    - '-c'
    - echo Hello from the postStart handler > /usr/share/message
    preStop: # Pre-stop command: Gracefully stop the Nginx service.
    exec:
    command:
    - /bin/sh
    - '-c'
    - nginx -s quit; while killall -0 nginx; do sleep 1; done
    name: nginx
    imagePullSecrets:
    - name: default-secret

  3. Создайте workload.

    kubectl create -f lifecycle.yaml

    Если отображается информация, аналогичная следующей, workload создаётся:

    deployment.apps/nginx created

  4. Проверьте статус workload.

    kubectl get deployment

    Если все pod‑ы workload доступны, workload создан.

    NAME READY UP-TO-DATE AVAILABLE AGE
    nginx 1/1 1 1 4m59s