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: {}
Что здесь происходит:
- Первый контейнер (
app-container) запускает NGINX — это основной сервис. - Второй контейнер (
log-sidecar) запускаетbusybox, который просто читает логи NGINX в режимеtail -f. - Оба контейнера используют общий том
shared-logs, созданный черезemptyDir. Это временное хранилище, доступное им одновременно. - Контейнеры работают как единый процесс: Kubernetes управляет ими как одним целым.