Что такое Kubernetes
Kubernetes (K8s) — платформа оркестрации контейнеров с открытым кодом, разработанная Google и переданная CNCF. Автоматизирует развёртывание, масштабирование и управление контейнеризованными приложениями.
Для System Design: Kubernetes — стандарт де-факто для запуска микросервисов. На собеседованиях важно понимать архитектуру, основные ресурсы и паттерны деплоя.
Архитектура Kubernetes
Control Plane (Master)
┌────────────────────────────────────────────────┐
│ Control Plane │
│ │
│ ┌──────────────┐ ┌────────────────────────┐ │
│ │ API Server │ │ etcd (state store) │ │
│ │ (kube-api) │ │ (distributed KV) │ │
│ └──────┬───────┘ └────────────────────────┘ │
│ │ │
│ ┌──────┴───────┐ ┌────────────────────────┐ │
│ │ Scheduler │ │ Controller Manager │ │
│ │ (placement) │ │ (reconciliation) │ │
│ └──────────────┘ └────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────┐ │
│ │ Cloud Controller Manager (optional) │ │
│ └─────────────────────────────────────────┘ │
└────────────────────────────────────────────────┘
| Компонент | Роль |
|---|---|
| API Server | Единая точка входа для всех операций. RESTful API |
| etcd | Распределённое хранилище key-value для состояния кластера |
| Scheduler | Выбирает узел для размещения новых Pod |
| Controller Manager | Набор контроллеров, приводящих текущее состояние к желаемому |
Worker Node
┌──────────────────────────────────────────┐
│ Worker Node │
│ │
│ ┌────────────┐ ┌────────────────────┐ │
│ │ kubelet │ │ kube-proxy │ │
│ │ (agent) │ │ (networking) │ │
│ └──────┬─────┘ └────────────────────┘ │
│ │ │
│ ┌──────┴─────────────────────────────┐ │
│ │ Container Runtime (containerd) │ │
│ │ │ │
│ │ ┌─────┐ ┌─────┐ ┌─────┐ │ │
│ │ │ Pod │ │ Pod │ │ Pod │ ... │ │
│ │ └─────┘ └─────┘ └─────┘ │ │
│ └─────────────────────────────────────┘ │
└──────────────────────────────────────────┘
| Компонент | Роль |
|---|---|
| kubelet | Агент на каждом узле, управляет Pod |
| kube-proxy | Сетевой прокси, реализует Services |
| Container Runtime | containerd или CRI-O для запуска контейнеров |
Ключевые ресурсы Kubernetes
Pod — минимальная единица деплоя
Pod — один или несколько контейнеров с общей сетью и хранилищем. Это атомарная единица масштабирования.
apiVersion: v1
kind: Pod
metadata:
name: api-server
labels:
app: api
version: v1
spec:
containers:
- name: api
image: myapp/api:v1.2.3
ports:
- containerPort: 8080
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "500m"
memory: "512Mi"
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
readinessProbe:
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 3
periodSeconds: 5
env:
- name: DATABASE_URL
valueFrom:
secretKeyRef:
name: db-credentials
key: url
Важно: Pod обычно не создаётся напрямую. Используйте Deployment для управления Pod.
Health Checks
| Тип проверки | Назначение | При сбое |
|---|---|---|
| livenessProbe | Процесс жив? | Перезапуск контейнера |
| readinessProbe | Готов принимать трафик? | Убирается из Service |
| startupProbe | Запуск завершён? | Блокирует liveness/readiness |
Deployment — управление репликами
Deployment обеспечивает декларативное обновление Pod и ReplicaSet.
apiVersion: apps/v1
kind: Deployment
metadata:
name: api
labels:
app: api
spec:
replicas: 3
selector:
matchLabels:
app: api
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1 # Max pods above desired during update
maxUnavailable: 0 # Zero-downtime: always keep all replicas
template:
metadata:
labels:
app: api
spec:
containers:
- name: api
image: myapp/api:v1.2.3
ports:
- containerPort: 8080
resources:
requests:
cpu: "200m"
memory: "256Mi"
limits:
cpu: "1000m"
memory: "1Gi"
livenessProbe:
httpGet:
path: /health
port: 8080
readinessProbe:
httpGet:
path: /ready
port: 8080
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchLabels:
app: api
topologyKey: kubernetes.io/hostname
Service — сетевая абстракция
Service обеспечивает стабильный IP и DNS для доступа к набору Pod.
apiVersion: v1
kind: Service
metadata:
name: api-service
spec:
selector:
app: api
ports:
- port: 80 # Port exposed by service
targetPort: 8080 # Port on the container
protocol: TCP
type: ClusterIP # Internal only
| Тип Service | Доступность | Use Case |
|---|---|---|
| ClusterIP | Только внутри кластера | Межсервисная связь |
| NodePort | Внешний, через порт на узле (30000-32767) | Dev/тестирование |
| LoadBalancer | Внешний, через облачный LB | Production API |
| ExternalName | DNS CNAME на внешний сервис | Интеграция с внешним |
Ingress — HTTP-маршрутизация
Ingress управляет внешним доступом к сервисам по HTTP/HTTPS.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: api-ingress
annotations:
nginx.ingress.kubernetes.io/rate-limit: "100"
cert-manager.io/cluster-issuer: "letsencrypt-prod"
spec:
ingressClassName: nginx
tls:
- hosts:
- api.example.com
secretName: api-tls
rules:
- host: api.example.com
http:
paths:
- path: /v1
pathType: Prefix
backend:
service:
name: api-service
port:
number: 80
- path: /v2
pathType: Prefix
backend:
service:
name: api-v2-service
port:
number: 80
ConfigMap и Secret — конфигурация
# ConfigMap for non-sensitive configuration
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
LOG_LEVEL: "info"
MAX_CONNECTIONS: "100"
FEATURE_FLAGS: |
{
"new_ui": true,
"beta_api": false
}
---
# Secret for sensitive data (base64-encoded)
apiVersion: v1
kind: Secret
metadata:
name: db-credentials
type: Opaque
data:
url: cG9zdGdyZXM6Ly91c2VyOnBhc3NAZGI6NTQzMi9teWFwcA==
password: c3VwZXJzZWNyZXQ=
# Using ConfigMap and Secret in a Pod
spec:
containers:
- name: api
envFrom:
- configMapRef:
name: app-config
env:
- name: DATABASE_URL
valueFrom:
secretKeyRef:
name: db-credentials
key: url
Важно: Kubernetes Secrets кодируются в base64, но не шифруются. Для production используйте Sealed Secrets, External Secrets Operator или HashiCorp Vault.
Scheduling — размещение Pod
Как работает Scheduler
Новый Pod без узла
│
▼
Filtering ─── Узлы, не удовлетворяющие constraints → отброшены
│
▼
Scoring ───── Оставшиеся узлы ранжируются по критериям
│
▼
Binding ───── Pod привязывается к лучшему узлу
Инструменты влияния на scheduling
| Инструмент | Описание | Пример |
|---|---|---|
| nodeSelector | Простой выбор по меткам | disktype: ssd |
| nodeAffinity | Гибкие правила размещения | Preferred / Required |
| podAffinity | Размещение рядом с другими Pod | Co-location |
| podAntiAffinity | Размещение далеко от других Pod | Spread across nodes |
| taints/tolerations | Запрет / разрешение на узлах | GPU-only nodes |
| topologySpreadConstraints | Равномерное распределение | Spread across zones |
# Spread pods across availability zones
spec:
topologySpreadConstraints:
- maxSkew: 1
topologyKey: topology.kubernetes.io/zone
whenUnsatisfiable: DoNotSchedule
labelSelector:
matchLabels:
app: api
Паттерны деплоя в Kubernetes
Rolling Update (по умолчанию)
Постепенная замена старых Pod новыми. Zero-downtime при правильной настройке.
Blue-Green
Два полных окружения. Переключение трафика мгновенно через Service selector.
# Switch traffic from blue to green
apiVersion: v1
kind: Service
metadata:
name: api-service
spec:
selector:
app: api
version: green # Change from "blue" to "green"
ports:
- port: 80
targetPort: 8080
Canary
Часть трафика направляется на новую версию для тестирования.
# Canary: 90% to stable, 10% to canary via replica count
# Stable: 9 replicas with version: v1
# Canary: 1 replica with version: v2
# Service selects both by app label (without version)
apiVersion: v1
kind: Service
metadata:
name: api-service
spec:
selector:
app: api # Matches both v1 and v2
Масштабирование
| Тип | Ресурс | Триггер |
|---|---|---|
| HPA | Горизонтальное (replicas) | CPU, memory, custom metrics |
| VPA | Вертикальное (resources) | Автоподбор requests/limits |
| Cluster Autoscaler | Узлы кластера | Pending pods без ресурсов |
| KEDA | Event-driven | Queue length, custom events |
# HPA with custom metrics
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: api-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: api
minReplicas: 2
maxReplicas: 50
behavior:
scaleUp:
stabilizationWindowSeconds: 30
scaleDown:
stabilizationWindowSeconds: 300 # Slow scale-down to avoid flapping
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
- type: Pods
pods:
metric:
name: http_requests_per_second
target:
type: AverageValue
averageValue: "1000"
Итоги
| Ресурс | Назначение |
|---|---|
| Pod | Минимальная единица, 1+ контейнеров |
| Deployment | Управление репликами и обновлениями |
| Service | Сетевая абстракция и load balancing |
| Ingress | HTTP-маршрутизация и TLS |
| ConfigMap | Несекретная конфигурация |
| Secret | Секретные данные (base64) |
| HPA | Автомасштабирование по метрикам |
На собеседовании: когда проектируете систему на Kubernetes, обязательно упомяните: resource limits, health checks, pod anti-affinity для HA, HPA для масштабирования, и ConfigMap/Secret для 12-Factor Config.