• Русский
  • Pods

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

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

    Pod — это наименьшая единица вычислений, которую вы можете создать и управлять в Kubernetes. Pod (как стая китов или стручок гороха) представляет собой группу из одного или нескольких контейнеров (например, контейнеров), с общим хранилищем и сетевыми ресурсами, а также спецификацией того, как запускать контейнеры. 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), а превышение лимита памяти — к завершению контейнера (OOM Killed).
    Для подробного описания единиц измерения (например, m для milliCPU, Mi для mebibytes) смотрите 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 CPU/памяти для 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 над списком, подтвердите.