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

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

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

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

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

Startup Command

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

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

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

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

Образ ENTRYPOINT

Образ CMD

Команда для запуска контейнера

Аргумент для запуска контейнера

Выполненная команда

[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 консоль.
  2. Щелкните имя кластера, чтобы перейти в консоль кластера, выберите Рабочие нагрузки в навигационной панели, и щелкните Создать рабочую нагрузку в правом верхнем углу.
  3. В Настройки контейнера, выберите Информация о контейнере > Жизненный цикл > Команда запуска и введите команду и аргументы.

    Таблица 2 Команда запуска контейнера

    Параметр

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

    Описание

    Пример YAML

    Команда

    /run/server

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

    ПРИМЕЧАНИЕ:

    В случае нескольких команд рекомендуется запускать /bin/sh или другой оболочка команды. Другие команды используются как параметры.

    ...
    spec:
    containers:
    - image: nginx:latest
    command:
    - /run/server
    args:
    - '--port=8080'
    ...

    Аргументы

    --port=8080

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

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

PostStart Hook

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

  1. Войдите в CCE консоль.
  2. Щелкните имя кластера, чтобы перейти к консоли кластера, выберите Рабочие нагрузки в навигационной панели и щелкните Создать рабочую нагрузку в правом верхнем углу.
  3. В Настройки контейнера, выберите Информация о контейнере > Жизненный цикл > Post-Start и настройте параметры. на основе требований сервиса. Например:

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

    Таблица 3 Обработка после запуска

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

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

    Описание

    Пример YAML

    CLI

    /install.sh

    install_agent

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

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

    ...
    lifecycle:
    postStart:
    exec:
    command:
    - /install.sh
    - install_agent
    ...

    HTTP запрос

    Путь: /nginx

    Порт: 80

    Хост: 127.0.0.1

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

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

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

PreStop Hook

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

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

    Таблица 4 Параметры обработки Pre-stop

    Параметр

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

    Описание

    Пример YAML

    CLI

    /uninstall.sh

    uninstall_agent

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

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

    ...
    lifecycle:
    preStop:
    exec:
    command:
    - /uninstall.sh
    - uninstall_agent
    ...

    HTTP запрос

    Путь: /nginx

    Порт: 80

    Хост: 127.0.0.1

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

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

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

Пример YAML

  1. Используйте kubectl для доступа к кластеру. Для подробностей см. Доступ к кластеру с использованием kubectl.
  2. Создайте файл YAML для настройки нагрузки. В этом примере имя файла 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:
    - sleep 3600 #Startup command: suspends the current process for 3,600s.
    imagePullPolicy: Always
    lifecycle:
    postStart:
    exec:
    command:
    - /bin/bash
    - install.sh #Post-start command: Run the install.sh command in /bin/bash.
    preStop:
    exec:
    command:
    - /bin/bash
    - uninstall.sh #Pre-stop command: Run the uninstall.sh command in /bin/bash.
    name: nginx
    imagePullSecrets:
    - name: default-secret

  3. Создайте нагрузку.

    kubectl create -f lifecycle.yaml

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

    deployment.apps/nginx created

  4. Проверьте статус нагрузки.

    kubectl get deployment

    Если все поды нагрузки доступны, нагрузка создана.

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