Pod — это минимальная и атомарная единица развертывания в Kubernetes. Он представляет собой логическое окружение для одного или нескольких контейнеров, которые запускаются совместно, делят между собой сетевой стек, IP-адрес и тома (хранилище). Все контейнеры внутри пода видят друг друга как
localhost
Pod создаётся и управляется как единое целое: если один из контейнеров выходит из строя, Kubernetes может перезапустить весь под. Именно поэтому в один под помещают тесно связанные процессы, например — основной сервис и вспомогательный sidecar-контейнер (логирование, прокси, мониторинг и т.п.).
Каждому поду назначается уникальный IP-адрес внутри кластера, и он становится доступен другим подам по внутренней сети. Команды
kubectl describe pod
kubectl logs
kubectl exec
В отличие от контейнера, который — это просто исполняемая среда, pod — это обёртка, которая определяет, как контейнер будет работать в рамках кластера: где хранить данные, как взаимодействовать с другими сервисами, какие порты открыты, и какие ресурсы нужны.
Поды — это основной строительный блок в Kubernetes. Они обеспечивают гибкое масштабирование, быструю замену, и устойчивость к сбоям. K8s может создавать или удалять поды в зависимости от нагрузки, автоматизируя жизненный цикл приложения.
Pod vs Container:
– Container — это единица запуска (например, процесс в Docker),
– Pod — это единица управления и развертывания в Kubernetes, которая может включать несколько контейнеров.
Понимание архитектуры подов — ключевой шаг к работе с Kubernetes, особенно при построении микросервисов, CI/CD пайплайнов и масштабируемых облачных решений.
Пример YAML-файла для Pod
apiVersion: v1 kind: Pod metadata: name: example-pod labels: app: demo spec: containers: - name: nginx-container image: nginx:1.25 ports: - containerPort: 80 resources: limits: memory: "128Mi" cpu: "500m"
Что делает этот Pod:
- Разворачивает контейнер с образом .
nginx:1.25
- Открывает порт 80 внутри контейнера.
- Ограничивает использование ресурсов: до 128 МБ оперативной памяти и 0.5 CPU.
- Присваивает имя и метку
example-pod
.app: demo
Пример Pod с двумя контейнерами
apiVersion: v1 kind: Pod metadata: name: multi-container-pod labels: app: demo-multi spec: containers: - name: app-container image: nginx:1.25 ports: - containerPort: 80 volumeMounts: - name: shared-logs mountPath: /var/log/nginx - name: log-sidecar image: busybox command: ["sh", "-c", "tail -f /var/log/nginx/access.log"] volumeMounts: - name: shared-logs mountPath: /var/log/nginx volumes: - name: shared-logs emptyDir: {}
Что здесь происходит:
- Первый контейнер () запускает NGINX — это основной сервис.
app-container
- Второй контейнер () запускает
log-sidecar
, который просто читает логи NGINX в режимеbusybox
.tail -f
- Оба контейнера используют общий том , созданный через
shared-logs
. Это временное хранилище, доступное им одновременно.emptyDir
- Контейнеры работают как единый процесс: Kubernetes управляет ими как одним целым.