MidТеория4 min

Kubernetes

Архитектура Kubernetes, ключевые компоненты (Pod, Service, Deployment, Ingress, ConfigMap, Secret), scheduling и паттерны деплоя

Что такое 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.


Проверь себя

Для чего используется podAntiAffinity?

Что произойдёт, если livenessProbe контейнера постоянно возвращает ошибку?

Какой инструмент масштабирования Kubernetes реагирует на события из внешних систем (очереди, стримы)?

Какой тип Service обеспечивает доступ только внутри кластера?

Какой компонент Control Plane отвечает за хранение состояния кластера?