Kubelet#

Kubelet - это сервис, который управляет pods, основываясь на их спецификации, является главным сервисом для Worker node. Сервис взаимодействует с API-server.

Для запуска полезной нагрузки на nodes используется агент Kubelet. В отличие от компонентов управляющего слоя, Kubelet запущен на каждом node: Master node и Worker node. Kubelet читает событие с помощью API-Server, что экземпляр сервиса распределен посредством Kube-scheduler на node, на котором он работает, и запускает экземпляр сервиса.

Для изоляции сервисов друг от друга они запускаются Kubelet в контейнерном окружении CRI-O. Также c использованием Kubelet возможно отслеживание работоспособности контейнеров, которые были запущены с его помощью.

Особенности последовательности запуска контейнеров в Kubelet#

Kubelet текущих версий DropApp запускает контейнеры внутри pods последовательно (в том порядке, в котором они указаны в манифесте).

При этом последовательность запуска блокируется на postStart Hook (то есть пока webhook не будет выполнен, следующий контейнер не запустится).

Порядок старта не должен работать, потому что K8S postStart hook не гарантирует порядок старта, а влияет лишь на lifecycle контейнера (где указан) и на его readinessProbe.

Для избежания ошибок проектирования, например, когда прикладной контейнер стартует раньше sidecar и возникают ошибки доступа к внешним ресурсам, следует применять отдельные средства для соблюдения строгой последовательности запуска контейнеров.

Используйте флаг HoldApplicationUntilProxyStarts для добавления sidecar в начало списка pods, настроенного на блокирование запуска всех других контейнеров до тех пор, пока прокси-сервер pod не будет готов принять трафик, что смягчает некоторые условия конкуренции при развертывании:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello
spec:
  replicas: 1
  selector:
    matchLabels:
      app: hello
      tier: backend
      track: stable
  template:
    metadata:
      labels:
        app: hello
        tier: backend
        track: stable
      annotations:
        proxy.istio.io/config: '{ "holdApplicationUntilProxyStarts": true }'
    spec:
      containers:
      - name: hello
        image: "fake.docker.io/google-samples/hello-go-gke:1.0"
        ports:
        - name: http
          containerPort: 80
        livenessProbe:
          httpGet:
            port: http
        readinessProbe:
          httpGet:
            port: 3333

Значение по умолчанию — false.