# Kubernetes — введение

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

## Цель

Понять **базовую модель Kubernetes**: pod, deployment, service, ingress, config — enough для деплоя учебного app и понимания security context (RBAC, policies).

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

- [Docker и образы](docker-i-obrazy.md)

## Время

**10–15 часов**

---

## Зачем Kubernetes

Когда контейнеров **много** и нужны:

- автоматический **restart** при падении
- **масштабирование** (replicas)
- **rolling updates** без downtime
- **service discovery** и балансировка
- **declarative** config (YAML в Git)

**K8s** — **оркестратор**, не замена Docker.

---

## Архитектура (упрощённо)

```
Control Plane (API server, scheduler, etcd)
        │
   Worker Nodes (kubelet, container runtime)
        │
   Pods (1+ containers)
```

Вы чаще работаете через **`kubectl`** → API server.

---

## Pod — минимальная единица

**Pod** — один или несколько контейнеров с **общим network namespace**.

```yaml
apiVersion: v1
kind: Pod
metadata:
  name: demo-pod
spec:
  containers:
    - name: app
      image: nginx:1.25-alpine
      ports:
        - containerPort: 80
```

В prod pod создают через **Deployment**, не напрямую.

---

## Deployment

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      securityContext:
        runAsNonRoot: true
      containers:
        - name: web
          image: nginx:1.25-alpine@sha256:EXAMPLE_DIGEST
          resources:
            limits:
              memory: "128Mi"
              cpu: "200m"
```

| Поле | SecOps |
|------|--------|
| `replicas` | HA |
| `runAsNonRoot` | Hardening |
| digest `@sha256` | Immutable image |
| `resources.limits` | DoS mitigation |

---

## Service и Ingress

**Service** — stable IP/DNS для pods:

```yaml
apiVersion: v1
kind: Service
metadata:
  name: web-svc
spec:
  selector:
    app: web
  ports:
    - port: 80
      targetPort: 80
```

**Ingress** — HTTP routing + TLS termination (с ingress controller).

---

## ConfigMap и Secret

```yaml
apiVersion: v1
kind: Secret
metadata:
  name: app-db
type: Opaque
stringData:
  password: "YOUR_PASSWORD"
```

| | ConfigMap | Secret |
|---|-----------|--------|
| Данные | Нечувствительные | Пароли, tokens |
| Хранение | plain in etcd* | base64 (не encryption by default!) |

\*В prod: **encryption at rest** для etcd, external secrets (Vault).

**Не** коммитьте Secret YAML с реальными значениями в Git.

---

## kubectl — базовые команды

```bash
kubectl get nodes
kubectl get pods -A
kubectl apply -f deployment.yaml
kubectl describe pod web-xxxxx
kubectl logs web-xxxxx
kubectl exec -it web-xxxxx -- sh
kubectl delete deployment web
```

---

## Namespace и RBAC

```bash
kubectl create namespace lab
kubectl get role,rolebinding -n lab
```

**RBAC** — кто может `get/list/create/delete` ресурсы.

DevSecOps: audit **cluster-admin** bindings, default SA tokens.

---

## Security hooks (preview)

| Механизм | Зачем |
|----------|-------|
| Pod Security Admission | no privileged pods |
| NetworkPolicy | east-west firewall |
| OPA / Kyverno | policy as code |
| Admission webhooks | scan on deploy |

Подробнее — разделы 05–07.

---

## Практика (minikube/kind)

1. `minikube start`
2. Deploy nginx Deployment + Service
3. `kubectl port-forward` или `minikube service`
4. Добавьте `runAsNonRoot` и убедитесь, что root image падает

---

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

1. Чем Pod отличается от Deployment?
2. Зачем Service, если pods ephemeral?
3. Почему Secret в K8s ≠ «зашифровано навсегда»?
4. Что делает `kubectl apply -f`?

---

## Дальше

→ [CI/CD pipeline](ci-cd-pipeline.md)
