Выполнение нескольких команд и обработка ошибок запуска
На этом этапе мы узнаем, как выполнять несколько команд при запуске пода и как обрабатывать ошибки запуска с помощью проверок здоровья.
Выполнение нескольких команд
Часто при запуске контейнера нужно выполнить несколько команд. В Kubernetes есть несколько способов сделать это:
- Сцеплять команды с использованием операторов оболочки (
&&, ; и т.д.).
- Использовать файл скрипта.
- Использовать init-контейнер.
Рассмотрим первый метод, изучив файл multi-command-pod.yaml:
nano multi-command-pod.yaml
Вы увидите:
apiVersion: v1
kind: Pod
metadata:
name: multi-command-pod
spec:
containers:
- name: ubuntu
image: ubuntu:20.04
command: ["/bin/bash", "-c"]
args:
[
"echo 'First command' > /tmp/first.txt && echo 'Second command' > /tmp/second.txt && sleep 3600"
]
В этой конфигурации несколько команд объединяются с использованием оператора &&, который выполняет каждую команду только в том случае, если предыдущая завершилась успешно.
Нажмите Ctrl+X, чтобы выйти из редактора.
Создадим этот под:
kubectl apply -f multi-command-pod.yaml
Вы должны увидеть:
pod/multi-command-pod created
Теперь убедимся, что обе команды были выполнены, проверив созданные файлы:
kubectl exec multi-command-pod -- cat /tmp/first.txt
Вы должны увидеть:
First command
А для второго файла:
kubectl exec multi-command-pod -- cat /tmp/second.txt
Вы должны увидеть:
Second command
Обработка ошибок запуска с помощью проверок здоровья
Kubernetes предоставляет механизмы для обнаружения и обработки ошибок запуска:
- Liveness Probes (Проверки жизнеспособности): Проверяют, запущен ли контейнер; если нет, Kubernetes перезапустит его.
- Readiness Probes (Проверки готовности): Проверяют, готов ли контейнер принимать трафик.
- Startup Probes (Проверки запуска): Проверяют, запустилась ли приложение; полезно для контейнеров с долгим запуском.
Рассмотрим под, который использует проверку жизнеспособности:
nano liveness-probe-pod.yaml
Вы увидите:
apiVersion: v1
kind: Pod
metadata:
name: liveness-probe-pod
spec:
containers:
- name: ubuntu
image: ubuntu:20.04
command: ["/bin/bash", "-c"]
args: ["touch /tmp/healthy && sleep 3600"]
livenessProbe:
exec:
command: ["cat", "/tmp/healthy"]
initialDelaySeconds: 5
periodSeconds: 5
В этой конфигурации:
- Контейнер создает файл
/tmp/healthy при запуске.
- Проверка жизнеспособности проверяет наличие этого файла каждые 5 секунд.
- Если файл отсутствует, Kubernetes считает контейнер неработоспособным и перезапускает его.
Нажмите Ctrl+X, чтобы выйти из редактора.
Создадим этот под:
kubectl apply -f liveness-probe-pod.yaml
Вы должны увидеть:
pod/liveness-probe-pod created
Проверьте, что под запущен:
kubectl get pods liveness-probe-pod
Вы должны увидеть:
NAME READY STATUS RESTARTS AGE
liveness-probe-pod 1/1 Running 0 30s
Теперь посмотрим, что произойдет, если мы удалим файл проверки здоровья:
kubectl exec liveness-probe-pod -- rm /tmp/healthy
Подождите около 10 секунд, затем снова проверьте статус пода:
kubectl get pods liveness-probe-pod
Вы должны увидеть, что контейнер был перезапущен:
NAME READY STATUS RESTARTS AGE
liveness-probe-pod 1/1 Running 1 60s
Число перезапусков (RESTARTS) увеличилось до 1, что означает, что Kubernetes обнаружил неработоспособное состояние и перезапустил контейнер.
Убедимся, что файл проверки здоровья снова существует (он должен был быть пересоздан командой запуска при перезапуске контейнера):
kubectl exec liveness-probe-pod -- ls -la /tmp/healthy
Вы должны увидеть, что файл снова существует:
-rw-r--r-- 1 root root 0 Sep 21 10:30 /tmp/healthy
Это показывает, как Kubernetes может автоматически восстановиться после ошибок запуска и поддерживать желаемое состояние ваших приложений.
Создание пользовательского скрипта запуска
Для более сложной инициализации вы можете использовать пользовательский скрипт запуска. Создадим под, который использует скрипт оболочки для запуска:
nano script-pod.yaml
Добавьте следующее содержимое:
apiVersion: v1
kind: Pod
metadata:
name: script-pod
spec:
containers:
- name: ubuntu
image: ubuntu:20.04
command: ["/bin/bash", "-c"]
args:
- |
cat > /tmp/startup.sh << 'EOF'
#!/bin/bash
echo "Script started at $(date)" > /tmp/script-log.txt
echo "Creating configuration files..." >> /tmp/script-log.txt
mkdir -p /tmp/config
echo "app_name=MyApp" > /tmp/config/app.conf
echo "version=1.0" >> /tmp/config/app.conf
echo "Script completed successfully" >> /tmp/script-log.txt
EOF
chmod +x /tmp/startup.sh
/tmp/startup.sh
sleep 3600
В этой конфигурации:
- Создается скрипт запуска в контейнере.
- Скрипт делается исполняемым.
- Скрипт запускается.
- Контейнер остается запущенным с помощью команды
sleep.
Сохраните и выйдите, нажав Ctrl+X, затем Y и Enter.
Создадим этот под:
kubectl apply -f script-pod.yaml
Вы должны увидеть:
pod/script-pod created
Подождите немного, пока под запустится, затем проверьте его статус:
kubectl get pods script-pod
Вы должны увидеть:
NAME READY STATUS RESTARTS AGE
script-pod 1/1 Running 0 30s
Теперь проверим вывод нашего скрипта:
kubectl exec script-pod -- cat /tmp/script-log.txt
Вы должны увидеть что-то вроде этого:
Script started at Tue Sep 21 10:35:42 UTC 2023
Creating configuration files...
Script completed successfully
И убедимся, что файл конфигурации был создан:
kubectl exec script-pod -- cat /tmp/config/app.conf
Вы должны увидеть:
app_name=MyApp
version=1.0
Это показывает, как использовать сложные скрипты запуска для инициализации контейнеров в Kubernetes.