• Русский
  • 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 над списком и подтвердите.