Какие знаешь свойства Pod?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Свойства 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 критичен для потерянных данных