Pods

Содержание

Понимание Pod'ов

Обратитесь к официальной документации сайта Kubernetes: Pod

Pod — это наименьшая единица вычислений, которую вы можете создать и управлять в Kubernetes. Pod (как стая китов или стручок гороха) — это группа из одного или нескольких контейнеров (например, Docker-контейнеров) с общими ресурсами хранения и сети, а также спецификацией того, как запускать эти контейнеры. Pods являются фундаментальными строительными блоками, на которых основаны все контроллеры более высокого уровня (например, Deployments, StatefulSets, DaemonSets).

Пример YAML файла

pod-example.yaml
apiVersion: v1
kind: Pod
metadata:
  name: my-nginx-pod
  labels:
    app: nginx
spec:
  containers:
    - name: nginx
      image: nginx:latest # The container image to use.
      ports:
        - containerPort: 80 # Container ports exposed.
      resources: # Defines CPU and memory requests and limits for the container.
        requests:
          cpu: '100m'
          memory: '128Mi'
        limits:
          cpu: '200m'
          memory: '256Mi'

Управление Pod с помощью CLI

Хотя Pods часто управляются контроллерами более высокого уровня, прямые операции kubectl с Pod'ами полезны для устранения неполадок, инспекции и выполнения разовых задач.

Просмотр Pod

  • Чтобы вывести список всех Pod в текущем namespace:

    kubectl get pods
  • Чтобы вывести список всех Pod во всех namespace:

    kubectl get pods --all-namespaces
    # Или более короткая версия:
    kubectl get pods -A
  • Чтобы получить подробную информацию о конкретном Pod:

    kubectl describe pod <pod-name> -n <namespace>
    
    # Пример
    kubectl describe pod my-nginx-pod -n default

Просмотр логов Pod

  • Чтобы просмотреть логи контейнера внутри Pod (полезно для отладки):

    kubectl logs <pod-name> -n <namespace>
  • Если в Pod несколько контейнеров, необходимо указать имя контейнера:

    kubectl logs <pod-name> -c <container-name> -n <namespace>
  • Чтобы следить за логами в режиме реального времени (поток новых логов по мере их появления):

    kubectl logs -f <pod-name> -n <namespace>

Выполнение команд в Pod

Чтобы выполнить команду внутри конкретного контейнера в Pod (полезно для отладки, например, доступа к shell):

kubectl exec -it <pod-name> -n <namespace> -- <command>

# Пример (для получения shell):
kubectl exec -it my-nginx-pod -n default -- /bin/bash

Проброс портов к Pod

Для проброса локального порта на порт Pod, что позволяет напрямую получить доступ к сервису, работающему внутри Pod, с вашей локальной машины (полезно для тестирования или прямого доступа без внешнего экспонирования сервиса):

kubectl port-forward <pod-name> <local-port>:<pod-port> -n <namespace>

#Пример
kubectl port-forward my-nginx-pod 8080:80 -n default

После выполнения этой команды вы сможете получить доступ к веб-серверу Nginx, работающему в my-nginx-pod, перейдя в браузере по адресу localhost:8080 .

Удаление Pod

  • Чтобы удалить конкретный Pod:

    kubectl delete pod <pod-name> -n <namespace>
    
    # Пример
    kubectl delete pod my-nginx-pod -n default
  • Чтобы удалить несколько Pod по именам:

    kubectl delete pod <pod-name-1> <pod-name-2> -n <namespace>
  • Чтобы удалить Pod по селектору меток (например, удалить все Pod с меткой app=nginx):

    kubectl delete pods -l app=nginx -n <namespace>

Управление Pod с помощью веб-консоли

Просмотр Pod

Интерфейс платформы предоставляет различную информацию о Pod для быстрого ознакомления.

Процедура

  1. В Container Platform перейдите в Workloads > Pods в левой боковой панели.

  2. Найдите Pod, который хотите просмотреть.

  3. Нажмите на имя деплоя, чтобы увидеть Details, YAML, Configuration, Logs, Events, Monitoring и другие вкладки.

Параметры Pod

Ниже приведены пояснения к некоторым параметрам:

ПараметрОписание
Resource Requests & LimitsResource Requests и Limits определяют границы потребления CPU и памяти для контейнеров внутри Pod, которые затем суммируются для формирования общего профиля ресурсов Pod. Эти значения важны для планировщика Kubernetes, чтобы эффективно размещать Pod на узлах, а также для kubelet, чтобы обеспечивать управление ресурсами.
  • Requests: минимально гарантированное количество CPU/памяти, необходимое для запуска и работы контейнера. Это значение используется планировщиком Kubernetes для выбора Node, на котором может работать Pod.
  • Limits: максимальное количество CPU/памяти, которое контейнер может потреблять во время выполнения. Превышение лимита CPU приводит к ограничению (throttling), а превышение лимита памяти — к завершению контейнера с ошибкой Out Of Memory (OOM Killed).
Для подробного описания единиц измерения (например, m для milliCPU, Mi для мебибайт) см. Resource Units.

Логика расчёта ресурсов на уровне Pod
Эффективные значения Requests и Limits CPU и памяти для Pod вычисляются как сумма и максимум значений отдельных контейнеров. Метод расчёта для Requests и Limits на уровне Pod аналогичен; в этом документе приведена логика на примере Limit. Если Pod содержит только стандартные контейнеры (рабочие контейнеры): Эффективное значение Limit CPU/памяти Pod — это сумма Limit CPU/памяти всех контейнеров внутри Pod.

Пример: если Pod содержит два контейнера с Limit CPU/памяти 100m/100Mi и 50m/200Mi соответственно, то агрегированный Limit CPU/памяти Pod будет 150m/300Mi. Если Pod содержит как initContainers, так и стандартные контейнеры: Шаги расчёта Limit CPU/памяти Pod следующие:
  • 1. Определить максимальное значение Limit CPU/памяти среди всех initContainers.
  • 2. Вычислить сумму Limit CPU/памяти всех стандартных контейнеров.
  • 3. Сравнить результаты шагов 1 и 2. Комплексный Limit CPU/памяти Pod будет максимальным из значений CPU (максимум из initContainers и сумма стандартных контейнеров) и максимальным из значений памяти (максимум из initContainers и сумма стандартных контейнеров).
Пример расчёта: если Pod содержит два initContainers с Limit CPU/памяти 100m/200Mi и 200m/100Mi, максимальный эффективный Limit для initContainers будет 200m/200Mi. Одновременно, если Pod содержит два стандартных контейнера с Limit CPU/памяти 100m/100Mi и 50m/200Mi, общая сумма Limit для стандартных контейнеров будет 150m/300Mi. Таким образом, комплексный Limit CPU/памяти Pod будет max(200m, 150m) для CPU и max(200Mi, 300Mi) для памяти, что равно 200m/300Mi.
SourceКонтроллер рабочей нагрузки Kubernetes, управляющий жизненным циклом этого Pod. Это могут быть Deployments, StatefulSets, DaemonSets, Jobs.
RestartКоличество перезапусков контейнера внутри Pod с момента запуска Pod. Высокое количество перезапусков часто указывает на проблему с приложением или его окружением.
NodeИмя Kubernetes Node, на котором в данный момент запланирован и работает Pod.
Service AccountService Account — это объект Kubernetes, предоставляющий идентичность процессам и сервисам, работающим внутри Pod, позволяя им аутентифицироваться и получать доступ к Kubernetes APIServer. Это поле обычно видно только пользователям с ролью администратора платформы или аудитора платформы, что позволяет просматривать YAML-определение Service Account.

Удаление Pod

Удаление Pod может повлиять на работу вычислительных компонентов; пожалуйста, действуйте осторожно.

Сценарии использования

  • Быстро восстановить Pod в желаемое состояние: если Pod находится в состоянии, влияющем на бизнес-процессы, например Pending или CrashLoopBackOff, ручное удаление Pod после устранения ошибки поможет ему быстро вернуться в желаемое состояние, например Running. При этом удалённые Pod будут пересозданы на текущем узле или переназначены.

  • Очистка ресурсов для управления операциями: некоторые Pod достигают определённого этапа, когда они больше не изменяются, и такие группы часто накапливаются в большом количестве, усложняя управление другими Pod. К Pod, подлежащим очистке, могут относиться те, что находятся в статусе Evicted из-за нехватки ресурсов узла, или в статусе Completed, вызванном повторяющимися запланированными задачами. В этом случае удалённые Pod больше не будут существовать.

    Примечание: для запланированных задач, если необходимо проверять логи каждого выполнения задачи, не рекомендуется удалять соответствующие Pod со статусом Completed.

Процедура

  1. Перейдите в Container Platform.

  2. В левой навигационной панели нажмите Workloads > Pods.

  3. (Удаление по одному) Нажмите ⋮ справа от Pod, который нужно удалить > Delete, подтвердите действие.

  4. (Массовое удаление) Выберите Pod для удаления, нажмите Delete над списком и подтвердите.