Kubernetes управляет контейнерами через абстракции: Pod — минимальная единица запуска; Deployment — желаемое состояние реплик; Service — стабильный доступ к подам. Без этих трёх не обойтись ни в проде, ни в учёбе.
Связь ресурсов
Deployment декларирует образ и число реплик; ReplicaSet поддерживает нужное количество подов; Service даёт подам стабильный DNS и порт для доступа изнутри или снаружи кластера.
Pod
Один или несколько контейнеров в общем сетевом и файловом пространстве. Живёт на ноде; при падении не восстанавливается сам — для этого нужен контроллер (Deployment, StatefulSet). Описывается в YAML: image, ports, env, resources, probes.
Deployment
Декларация: сколько реплик, какой образ, стратегия обновления (rolling update или recreate). Контроллер поддерживает нужное количество подов и обновляет их при изменении манифеста. Rollback — через историю ревизий.
Service
Постоянный DNS и IP для набора подов (по селектору). ClusterIP — доступ внутри кластера; NodePort или LoadBalancer — снаружи. Без Service поды меняют IP при пересоздании; с Service приложение обращается по имени сервиса.
Ресурс и назначение
| Ресурс | Назначение |
|---|---|
| Pod | Минимальная единица запуска; один или несколько контейнеров, общая сеть и том |
| Deployment | Декларативное управление репликами подов; rolling update, rollback |
| ReplicaSet | Поддерживает нужное число подов; обычно создаётся Deployment'ом |
| Service | Стабильный DNS и доступ к подам по селектору; ClusterIP, NodePort, LoadBalancer |
Минимальный манифест
Deployment с одной репликой и Service типа ClusterIP — образ, порты, readiness probe; Service выбирает поды по метке app и отдаёт стабильный порт.
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: web-app
template:
metadata:
labels:
app: web-app
spec:
containers:
- name: app
image: your-registry/web-app:latest
ports:
- containerPort: 8080
readinessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
---
# service.yaml
apiVersion: v1
kind: Service
metadata:
name: web-app
namespace: default
spec:
type: ClusterIP
selector:
app: web-app
ports:
- port: 80
targetPort: 8080
name: http
Применение: kubectl apply -f deployment.yaml -f service.yaml. Внутри кластера приложение доступно по http://web-app.default.svc.cluster.local. Свои манифесты и типичные операции (kubectl get/describe/logs) храните в базе знаний. Дальше — ConfigMap, Secret, Ingress, RBAC.
Практики применения
- Начните с Pod, Deployment, Service; затем ConfigMap, Secret, Ingress.
- Документируйте манифесты и типичные операции в базе знаний — ускорит онбординг и расследование инцидентов.
Итого: Pod — минимальная единица; Deployment — декларативное управление подами; Service — стабильный доступ к подам. Манифесты и runbook'и — в базе знаний.