Облачная платформа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

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

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

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

[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. Нажмите название кластера, чтобы перейти в cluster console, выберите Workloads в navigation pane и нажмите Create Workload в правом верхнем углу.
  3. In Container Settings, выберите Container Information > Lifecycle > Startup Command и введите команду и аргументы.

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

    Parameter

    Example Value

    Description

    Example YAML

    Command

    /run/server

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

    ПРИМЕЧАНИЕ:

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

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

    Args

    --port=8080

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

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

PostStart Hook

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

  1. Войдите в CCE console.
  2. Нажмите название кластера, чтобы перейти в консоль кластера, выберите Workloads в панели навигации и нажмите Create Workload в правом верхнем углу.
  3. In Container Settings, choose Container Information > Lifecycle > Post-Start and configure parameters. based on the service requirements. For example:

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

    Table 3 Post-start processing

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

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

    Описание

    Пример YAML

    CLI

    /install.sh

    install_agent

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

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

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

    HTTP-запрос

    Путь: /nginx

    Порт: 80

    Хост: 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 в правом нижнем углу. Через некоторое время статус рабочей нагрузки меняется на Running.

PreStop Hook

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

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

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

    Parameter

    Example Value

    Description

    Example YAML

    CLI

    /uninstall.sh

    uninstall_agent

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

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

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

    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 в правом нижнем углу. Через некоторое время статус рабочей нагрузки изменится на Running.

Пример YAML

  1. Используйте kubectl для доступа к кластеру. Подробности см. в Accessing a Cluster Using kubectl.
  2. Create a YAML file for configuring a workload. In this example, the file name is lifecycle.yaml. You can change it as needed.

    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. Создайте 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