← [Раздел](README.md) · [Главная](../README.md)

# Kubernetes — базовый уровень

## Цель

Освоить **ключевые объекты Kubernetes** для архитектора: Pod, Deployment, Service, Ingress, ConfigMap/Secret, HPA — и понять, как они реализуют отказоустойчивость и выкат без простоя.

## Предварительно

- [Контейнеры и Docker](kontejnery-i-docker.md)
- `kubectl` установлен, доступ к учебному кластеру (minikube, kind, k3s)

## Время

~90 минут

---

## Зачем Kubernetes

Оркестратор решает:

- на какой ноде запустить контейнер;
- перезапуск при падении;
- rolling update образа;
- service discovery и балансировка;
- горизонтальное масштабирование.

Вы описываете **желаемое состояние** (YAML), control plane приводит кластер к нему.

---

## Pod

Минимальная единица: один или несколько контейнеров с общей сетью/volume.

```yaml
apiVersion: v1
kind: Pod
metadata:
  name: shop-api-debug
spec:
  containers:
    - name: api
      image: registry.example.com/shop-api:1.0.0
      ports:
        - containerPort: 8080
```

В проде Pod **не создают вручную** — используйте Deployment.

---

## Deployment

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: shop-api
spec:
  replicas: 3
  selector:
    matchLabels:
      app: shop-api
  template:
    metadata:
      labels:
        app: shop-api
    spec:
      containers:
        - name: api
          image: registry.example.com/shop-api:1.0.0
          resources:
            requests:
              cpu: 100m
              memory: 128Mi
            limits:
              cpu: 500m
              memory: 512Mi
          readinessProbe:
            httpGet:
              path: /health/ready
              port: 8080
          livenessProbe:
            httpGet:
              path: /health/live
              port: 8080
```

| Поле | Роль |
|------|------|
| `replicas` | Сколько pod |
| `readinessProbe` | Готов принимать трафик |
| `livenessProbe` | Жив ли процесс |

---

## Service

Стабильный DNS и IP для набора pod:

```yaml
apiVersion: v1
kind: Service
metadata:
  name: shop-api
spec:
  selector:
    app: shop-api
  ports:
    - port: 80
      targetPort: 8080
```

Типы: **ClusterIP** (внутри кластера), **LoadBalancer** (внешний LB облака), **NodePort** (учебный).

---

## Ingress

HTTP-маршрутизация снаружи:

```yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: shop
spec:
  rules:
    - host: shop.staging.example.com
      http:
        paths:
          - path: /api
            pathType: Prefix
            backend:
              service:
                name: shop-api
                port:
                  number: 80
```

TLS — cert-manager + Let's Encrypt (обзорно в инфра-курсе).

---

## ConfigMap и Secret

```yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: shop-config
data:
  LOG_LEVEL: info
---
apiVersion: v1
kind: Secret
metadata:
  name: shop-db
type: Opaque
stringData:
  DATABASE_URL: postgres://user:PLACEHOLDER@db:5432/shop
```

Монтируйте как env или volume. **Sealed Secrets** / External Secrets — для GitOps без plaintext в repo.

---

## Horizontal Pod Autoscaler (HPA)

```yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: shop-api
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: shop-api
  minReplicas: 2
  maxReplicas: 10
  metrics:
    - type: Resource
      resource:
        name: cpu
        target:
          type: Utilization
          averageUtilization: 70
```

HPA нужны **requests** у контейнеров. Для масштаба по RPS — custom metrics из Prometheus.

---

## Namespace и изоляция

```text
ns: shop-staging
ns: shop-production
```

RBAC, NetworkPolicy, квоты — по namespace. Архитектор задаёт границы; детали безопасности — с платформенной командой.

---

## Rolling update и rollback

```bash
kubectl rollout status deployment/shop-api
kubectl rollout undo deployment/shop-api
```

Стратегии: **RollingUpdate** (по умолчанию), **Blue/Green**, **Canary** (Argo Rollouts, Istio).

---

## Антипаттерны

| Плохо | Лучше |
|-------|-------|
| `latest` образ | Версионный тег |
| Один replica в prod | Минимум 2 + PDB |
| Без probes | readiness/liveness |
| Giant YAML в одном файле | Kustomize / Helm chart |

---

## Самопроверка

1. Чем Pod отличается от Deployment?
2. Зачем Service, если есть pod IP?
3. Что проверяет readiness probe?
4. При каком условии HPA по CPU работает корректно?

---

## Дальше

→ [CI/CD и GitOps](ci-cd-i-gitops.md)  
← [Контейнеры и Docker](kontejnery-i-docker.md)
