Облачная платформаВсе платформы

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

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

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

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

Startup Command

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

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

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

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

ENTRYPOINT образа

CMD образа

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

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

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

[touch]

[/root/test]

Not set

Not set

[touch /root/test]

[touch]

[/root/test]

[mkdir]

Not set

[mkdir]

[touch]

[/root/test]

Not set

[/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 и введите команду и аргументы.

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

    Параметр

    Example Value

    Описание

    Example YAML

    Команда

    /run/server

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

    NOTE:

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

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

    Аргументы

    --port=8080

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

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

PostStart Hook

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

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

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

    Таблица 3 Обработка Post-start

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

    Example Value

    Описание

    Example YAML

    CLI

    /install.sh

    install_agent

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

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

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

    HTTP запрос

    Путь: /nginx

    Порт: 80

    Хост: 127.0.0.1

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

    • Путь: (необязательно) URL запроса.
    • Порт: (обязательно) запрашиваемый порт.
    • Хост: (необязательно) IP‑адрес запрашиваемого хоста. Значение по умолчанию — IP‑адрес pod.
    lifecycle:
    postStart: postStart:
    httpGet: httpGet:
    path: /nginx path: /nginx
    port: 80 port: 80
    host: 127.0.0.1 host: 127.0.0.1
    scheme: HTTP 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 и настройте параметры.

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

    Параметр

    Example Value

    Описание

    Example YAML

    CLI

    /uninstall.sh

    uninstall_agent

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

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

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

    HTTP запрос

    Путь: /nginx

    Порт: 80

    Хост: 127.0.0.1

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

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

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

Example YAML

  1. Используйте kubectl для доступа к кластеру. Подробнее см. Accessing a Cluster Using 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: command:
    - sleep 3600 - sleep 3600 #Startup command #Startup command: приостанавливает текущий процесс на 3 600 сек.
    imagePullPolicy: Always
    lifecycle:
    postStart: postStart:
    exec: exec:
    command: command:
    - /bin/bash - /bin/bash
    - install.sh - install.sh ##Post-start commandPost-start command: Выполнить install.shinstall.sh command in /bin/bash/bin/bash.
    preStop: preStop:
    exec: exec:
    command: command:
    - /bin/bash - /bin/bash
    - uninstall.sh - uninstall.sh #Pre-stop command #Pre-stop command: Выполнить uninstall.shuninstall.sh command in /bin/bash/bin/bash.
    name: nginx
    imagePullSecrets:
    - name: default-secret

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

    kubectl create -f lifecycle.yaml

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

    deployment.apps/nginx created

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

    kubectl get deployment

    Если все pod этой рабочей нагрузки доступны, нагрузка успешно создана.

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