← Назад к вопросам

Какие знаешь свойства Pod?

2.4 Senior🔥 121 комментариев
#Docker, Kubernetes и DevOps

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Свойства Pod в Kubernetes

Pod — это основная и наименьшая развёртываемая единица в Kubernetes. Pod — это обёртка над одним или несколькими контейнерами, которые совместно используют сетевое пространство и хранилище. Разберём основные свойства Pod'ов.

1. Архитектура и структура Pod'а

Pod может содержать один или несколько контейнеров

Обычно это один контейнер (сингл-контейнер Pod), но может быть несколько:

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
    - name: main-container
      image: nginx:latest
    - name: sidecar-container
      image: log-collector:latest

Все контейнеры в Pod'е:

  • Имеют общий IP адрес
  • Могут подключаться друг к другу через localhost
  • Совместно используют сетевое пространство (network namespace)

2. Сетевые свойства

Единый IP адрес на Pod

Все контейнеры в одном Pod'е имеют один IP адрес:

# Два контейнера в одном Pod'е
spec:
  containers:
    - name: web
      image: nginx
      ports:
        - containerPort: 80  # Слушает на :80
    - name: api
      image: api:latest
      ports:
        - containerPort: 8080  # Слушает на :8080
  # Оба доступны по одному IP, но разным портам

Коммуникация между контейнерами через localhost

// Контейнер 1 может обратиться к контейнеру 2
String url = "http://localhost:8080/api"; // По порту контейнера 2
HttpResponse response = client.get(url);

3. Хранилище (Volumes)

Контейнеры в Pod'е могут совместно использовать тома

spec:
  containers:
    - name: writer
      image: writer:latest
      volumeMounts:
        - name: shared-data
          mountPath: /data
    - name: reader
      image: reader:latest
      volumeMounts:
        - name: shared-data
          mountPath: /read-data
  volumes:
    - name: shared-data
      emptyDir: {}
      # Оба контейнера видят одни и те же файлы

4. Жизненный цикл Pod'а

Pod имеет несколько фаз существования:

Pending → Running → Succeeded/Failed/Unknown

Pending — Pod создан, но контейнеры ещё не запущены Running — Как минимум один контейнер запущен Succeeded — Все контейнеры завершились успешно (для Job'ов) Failed — Как минимум один контейнер завершился с ошибкой Unknown — Статус Pod'а неизвестен

// В Java коде можно проверить статус
if (pod.getStatus().getPhase().equals("Running")) {
    // Pod запущен
}

5. Restart Policy (Политика перезагрузки)

Pod может автоматически перезагружаться при сбое

spec:
  restartPolicy: Always  # Перезагружать всегда (по умолчанию)
  # или
  restartPolicy: OnFailure  # Перезагружать только при ошибке
  # или
  restartPolicy: Never  # Никогда не перезагружать
  
  containers:
    - name: app
      image: app:latest

Проблема: Pod может перезагружаться бесконечно, создавая CrashLoopBackOff:

Pod перезагружается → падает → перезагружается → ...

6. Resource Limits и Requests

Pod может быть ограничен по ресурсам

spec:
  containers:
    - name: app
      image: app:latest
      resources:
        requests:
          memory: "256Mi"
          cpu: "100m"  # 100 millicores = 0.1 CPU
        limits:
          memory: "512Mi"
          cpu: "500m"
      # requests — гарантированный минимум
      # limits — максимум, которое Pod не может превышать

Проблемы:

  • Если Pod превышает limits, он будет убит (OOMKilled)
  • Неправильные limits приводят к недостаточной производительности
  • Трудно правильно оценить требуемые ресурсы

7. Liveness и Readiness Probes

Kubernetes проверяет здоровье Pod'а через пробы

spec:
  containers:
    - name: app
      image: app:latest
      livenessProbe:
        httpGet:
          path: /health
          port: 8080
        initialDelaySeconds: 30
        periodSeconds: 10
        # Если проба провалится 3 раза, Pod перезагружается
      
      readinessProbe:
        httpGet:
          path: /ready
          port: 8080
        initialDelaySeconds: 5
        periodSeconds: 5
        # Если проба провалится, трафик не будет направлен в Pod
// В приложении реализуй endpoints
@GetMapping("/health")
public ResponseEntity<String> health() {
    return ResponseEntity.ok("OK");
}

@GetMapping("/ready")
public ResponseEntity<String> ready() {
    if (databaseConnected && cacheInitialized) {
        return ResponseEntity.ok("Ready");
    }
    return ResponseEntity.status(503).build();
}

8. Security Context

Pod может быть запущен с определёнными привилегиями и ограничениями

spec:
  securityContext:
    runAsUser: 1000  # Запускать от пользователя 1000
    fsGroup: 1000    # Группа для volumes
    runAsNonRoot: true  # Не позволять root
  
  containers:
    - name: app
      image: app:latest
      securityContext:
        allowPrivilegeEscalation: false  # Запретить escalation
        readOnlyRootFilesystem: true  # Только чтение root
        capabilities:
          drop:
            - ALL  # Убрать все Linux capabilities

9. Init Containers

Pod может запустить init контейнеры перед основными

spec:
  initContainers:
    - name: wait-for-db
      image: busybox
      command: ['sh', '-c', 'until nc -z postgres:5432; do sleep 1; done']
  
  containers:
    - name: app
      image: app:latest
      # Запустится только после успеха init контейнера

10. Service Account

Pod имеет identity в кластере

spec:
  serviceAccountName: my-app-account
  containers:
    - name: app
      image: app:latest
      # Token автоматически смонтируется в /var/run/secrets/kubernetes.io/serviceaccount/
// Из Java приложения можно обращаться к Kubernetes API
String token = new String(
    Files.readAllBytes(Paths.get(
        "/var/run/secrets/kubernetes.io/serviceaccount/token"
    ))
);
// Использовать token для API запросов

11. DNS и сетевое имя

Pod получает DNS имя в кластере

Pod DNS: <pod-name>.<namespace>.pod.cluster.local

Если Pod связан с Service:

Service DNS: <service-name>.<namespace>.svc.cluster.local
# Pod в default namespace с именем "my-app"
# Доступен как: my-app.default.pod.cluster.local

spec:
  hostname: my-app
  subdomain: my-service  # Для StatefulSet

12. Tolerations и Affinity

Pod может быть направлен на конкретные ноды

spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
          - matchExpressions:
              - key: disktype
                operator: In
                values:
                  - ssd  # Запустить на node с меткой disktype=ssd
  
  tolerations:
    - key: gpu
      operator: Equal
      value: "true"
      effect: NoSchedule  # Может работать на GPU nodes

13. Termination Grace Period

Pod получает время на корректное завершение

spec:
  terminationGracePeriodSeconds: 30  # 30 секунд на graceful shutdown
  containers:
    - name: app
      image: app:latest
      lifecycle:
        preStop:
          exec:
            command: ["/bin/sh", "-c", "sleep 5"]  # Время на очистку
// Приложение должно слушать SIGTERM
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
    // Закрыть соединения с БД
    // Завершить обработку текущих запросов
    // Записать состояние
    System.out.println("Shutting down gracefully");
}));

14. Labels и Annotations

Pod имеет метаданные для организации

metadata:
  name: my-app
  labels:
    app: myapp
    version: v1
    tier: frontend
  annotations:
    description: "Production frontend Pod"
    deployed-by: "terraform"
spec:
  containers:
    - name: app
      image: app:v1
// Использовать labels для селектора
pod.getMetadata().getLabels().get("app"); // "myapp"

15. Собственник и GarbageCollection

Pod может быть собственником другого Pod'а

metadata:
  ownerReferences:
    - apiVersion: apps/v1
      kind: Deployment
      name: my-deployment
      uid: 12345
      # При удалении Deployment, Pod тоже удалится

Заключение

Pod — это сложная сущность с множеством свойств и конфигураций. Основные моменты:

  • Pod = обёртка над контейнерами с общей сетью и хранилищем
  • Жизненный цикл управляется Kubernetes, не запускай Pod'ы напрямую
  • Используй более высокие сущности (Deployment, StatefulSet, DaemonSet)
  • Правильно конфигурируй probes для надёжности
  • Устанавливай resource limits для стабильности кластера
  • Graceful shutdown критичен для потерянных данных
Какие знаешь свойства Pod? | PrepBro