- PVSM.RU - https://www.pvsm.ru -
Прим. перев.: эта небольшая (но ёмкая!) статья, написанная Michael Hausenblas из команды OpenShift в Red Hat, настолько пришлась нам «по душе», что практически сразу же после её обнаружения была добавлена в нашу внутреннюю базу знаний по Kubernetes. А поскольку представленная в ней информация явно будет полезной и для более широкого русскоязычного ИТ-сообщества, с удовольствием выкладываем её перевод.

Как вы могли догадаться, заголовок этой публикации — отсылка к мультфильму Pixar 1998-го года «A Bug’s Life» (в российском прокате он назывался «Приключения Флика» или «Жизнь насекомого» — прим. перев.), и действительно: между муравьём-рабочим и подом в Kubernetes есть много схожего. Мы внимательно посмотрим на полный жизненный цикл пода с практической точки зрения — в частности, на способы, которыми вы можете повлиять на поведение при старте и завершении работы, а также на правильные подходы к проверке состояния приложения.
Вне зависимости от того, создали вы под сами или же, что лучше, через контролер вроде Deployment, DaemonSet или StatefulSet, под может находиться в одной из следующих фаз:
Выполняя kubectl get pod, обратите внимание, что столбец STATUS может показывать и другие (кроме этих пяти) сообщения — например, Init:0/1 или CrashLoopBackOff. Так происходит по той причине, что фаза — это лишь часть общего состояния пода. Хороший способ узнать, что же конкретно произошло, — запустить kubectl describe pod/$PODNAME и посмотреть на запись Events: внизу. Она выводит список актуальных действий: что образ контейнера был получен, под был запланирован, контейнер находится в «проблемном» (unhealthy) состоянии.
Теперь взглянем на конкретный пример жизненного цикла пода от начала до конца, продемонстрированный на следующей схеме:

Что здесь произошло? Этапы следующие:
Как я пришёл к указанной выше последовательности и её таймингу? Для этого использовался следующий Deployment, созданный специально для отслеживания порядка происходящих событий (сам по себе он не очень полезен):
kind: Deployment
apiVersion: apps/v1beta1
metadata:
name: loap
spec:
replicas: 1
template:
metadata:
labels:
app: loap
spec:
initContainers:
- name: init
image: busybox
command: ['sh', '-c', 'echo $(date +%s): INIT >> /loap/timing']
volumeMounts:
- mountPath: /loap
name: timing
containers:
- name: main
image: busybox
command: ['sh', '-c', 'echo $(date +%s): START >> /loap/timing;
sleep 10; echo $(date +%s): END >> /loap/timing;']
volumeMounts:
- mountPath: /loap
name: timing
livenessProbe:
exec:
command: ['sh', '-c', 'echo $(date +%s): LIVENESS >> /loap/timing']
readinessProbe:
exec:
command: ['sh', '-c', 'echo $(date +%s): READINESS >> /loap/timing']
lifecycle:
postStart:
exec:
command: ['sh', '-c', 'echo $(date +%s): POST-START >> /loap/timing']
preStop:
exec:
command: ['sh', '-c', 'echo $(date +%s): PRE-HOOK >> /loap/timing']
volumes:
- name: timing
hostPath:
path: /tmp/loap
Заметьте, что для насильного завершения работы пода в момент, когда основной контейнер работал, я выполнил следующую команду:
$ kubectl scale deployment loap --replicas=0
Мы посмотрели на конкретную последовательность событий в действии и готовы теперь двигаться дальше — к практикам в области управления жизненным циклом пода. Они таковы:
livenessProbe и readinessProbe. Первая используется kubelet'ом, чтобы понять, нужно ли и когда нужно перезапускать контейнер, и deployment'ом, чтобы решить, был ли успешным rolling update. Вторая — используется service'ом для принятия решения о направлении трафика на под. Если эти пробы не определены, kubelet для обоих предполагает, что они успешно выполнились. Это приводит к двум последствиям: а) политика рестарта [5] не может быть применена, б) контейнеры в поде мгновенно получают трафик от стоящего перед ними service'а, даже если они всё ещё заняты процессом запуска./dev/termination-log, а вы — просматривать сообщения с помощью kubectl describe pod …. Эти настройки по умолчанию меняются через terminationMessagePath и/или с помощью terminationMessagePolicy в спецификации пода — подробнее см. в API reference [6].В этой публикации не рассматриваются initializers [7] (некоторые подробности о них можно найти в конце этого материала [8] — прим. перев.). Это полностью новая концепция, представленная в Kubernetes 1.7. Инициализаторы работают внутри control plane (API Server) вместо того, чтобы находиться в контексте kubelet, и могут использоваться для «обогащения» подов, например, sidecar-контейнерами или приведением в исполнение политик безопасности. Кроме того, не были рассмотрены PodPresets [9], которые в дальнейшем могут быть замещены более гибкой концепцией инициализаторов.
Читайте также в нашем блоге:
Автор: distol
Источник [16]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/sistemnoe-administrirovanie/285097
Ссылки в тексте:
[1] infra-контейнер: https://www.ianlewis.org/en/almighty-pause-container
[2] init-контейнер: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/
[3] Хуки: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/
[4] завершения работы пода: https://kubernetes.io/docs/concepts/abstractions/pod-termination/
[5] политика рестарта: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy
[6] API reference: https://kubernetes.io/docs/api-reference/v1.8/#container-v1-core
[7] initializers: https://ahmet.im/blog/initializers/
[8] этого материала: https://habr.com/company/flant/blog/342658/
[9] PodPresets: https://kubernetes.io/docs/tasks/inject-data-application/podpreset/
[10] часть 2: https://habr.com/company/flant/blog/342822/
[11] Как на самом деле работает планировщик Kubernetes?: https://habr.com/company/flant/blog/335552/
[12] Иллюстрированное руководство по устройству сети в Kubernetes: https://habr.com/company/flant/blog/346304/
[13] Наш опыт с Kubernetes в небольших проектах: https://habr.com/company/flant/blog/331188/
[14] Play with Kubernetes — сервис для практического знакомства с K8s: https://habr.com/company/flant/blog/415381/
[15] Инфраструктура с Kubernetes как доступная услуга: https://habr.com/company/flant/blog/341760/
[16] Источник: https://habr.com/post/415393/?utm_campaign=415393
Нажмите здесь для печати.