Модуль 10 — Kubernetes ⭐⭐⭐⭐
Король DevOps. Освой глубоко — и до пенсии без работы не останешься. 96% компаний с контейнерами используют K8s.
Понимаешь архитектуру в деталях. Поднимаешь кластер kubeadm-ом. Дебажишь упавшие pod-ы по events/logs/describe. Пишешь Helm chart. Понимаешь Operator pattern. Знаешь когда service mesh нужен. Сдан CKA.
Архитектура — must understand
Control plane
- kube-apiserver — единственный путь к etcd. Все остальные компоненты общаются через него.
- etcd — distributed KV store с Raft consensus. Хранит ВСЁ состояние кластера.
- kube-scheduler — решает на какую ноду поставить pod. Учитывает requests, taints, affinity.
- kube-controller-manager — replication, endpoint, namespace, и десятки других controllers.
- cloud-controller-manager — для облачных интеграций (LB, volumes).
Worker components
- kubelet — агент на каждой ноде. Получает PodSpecs, общается с runtime.
- kube-proxy — сетевые правила (iptables / IPVS / eBPF).
- Container runtime — containerd (default), CRI-O. Docker уже не runtime.
Объекты Kubernetes
Workloads
| Объект | Что делает |
|---|---|
| Pod | Наименьшая единица. 1+ контейнеров с общим net/storage |
| ReplicaSet | Поддерживает желаемое число pod (через Deployment) |
| Deployment | Декларативный апгрейд stateless приложений |
| StatefulSet | Для БД: stable network ID, persistent volumes |
| DaemonSet | Pod на каждой ноде (логи, мониторинг агенты) |
| Job | Выполнить и завершиться |
| CronJob | Job по расписанию |
Pod в production
apiVersion: apps/v1
kind: Deployment
metadata:
name: api
labels: {app: api}
spec:
replicas: 3
selector: {matchLabels: {app: api}}
template:
metadata:
labels: {app: api}
spec:
# Безопасность
securityContext:
runAsNonRoot: true
runAsUser: 10000
fsGroup: 10000
seccompProfile: {type: RuntimeDefault}
# Анти-аффинити: не два pod-а на одной ноде
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchLabels: {app: api}
topologyKey: kubernetes.io/hostname
containers:
- name: api
image: ghcr.io/me/api@sha256:abc123 # pin to digest!
imagePullPolicy: IfNotPresent
securityContext:
readOnlyRootFilesystem: true
allowPrivilegeEscalation: false
capabilities: {drop: [ALL]}
ports:
- containerPort: 8000
resources:
requests: {cpu: 100m, memory: 128Mi}
limits: {cpu: 500m, memory: 256Mi}
livenessProbe:
httpGet: {path: /healthz, port: 8000}
initialDelaySeconds: 10
periodSeconds: 10
readinessProbe:
httpGet: {path: /ready, port: 8000}
periodSeconds: 5
env:
- name: DATABASE_URL
valueFrom:
secretKeyRef: {name: api-secrets, key: db-url}
Networking
- Service:
ClusterIP(default) — внутреннийNodePort— через ноду (порт 30000-32767)LoadBalancer— облачный LBExternalName— CNAME alias
- EndpointSlice — современная замена Endpoints (масштабируемая)
- Ingress — L7 routing для HTTP/HTTPS
- Gateway API ⭐ — новый стандарт, заменяет Ingress. Учи его!
- NetworkPolicy — firewall на уровне pod (default deny — best practice)
- DNS: CoreDNS, format
service.namespace.svc.cluster.local
Storage
- Volume types: emptyDir, hostPath, configMap, secret, projected
- PersistentVolume (PV) + PersistentVolumeClaim (PVC)
- StorageClass — динамическое provisioning
- CSI (Container Storage Interface) — драйверы (EBS, Ceph, NFS)
- VolumeSnapshot — бэкапы
Configuration
- ConfigMap — конфиги, env vars, файлы
- Secret — base64, не шифрование! Используй Vault + ESO (модуль 13)
Безопасность и доступ
- Namespace — логическая изоляция
- ServiceAccount — identity для pod
- RBAC: Role / ClusterRole + RoleBinding / ClusterRoleBinding
- Pod Security Standards: Privileged / Baseline / Restricted (стремись к Restricted)
Resource management
- requests — гарантированные ресурсы (для scheduler)
- limits — потолок (CPU throttle, OOM kill при превышении memory)
- QoS classes: Guaranteed / Burstable / BestEffort
- LimitRange, ResourceQuota — лимиты на namespace
В отличие от memory, CPU limits часто вредят latency. Throttling может убивать tail latency. Многие компании (Netflix, Uber) рекомендуют ставить requests без limits для CPU. Memory limits — обязательны.
Helm и Kustomize
Helm
- Charts с Go-templates:
{{ .Values.replicas }} - values.yaml — кастомизация
- Releases — версионирование
helm install / upgrade / rollback / history- Когда: для apps с шаблонизацией, переменными, версионированием
Kustomize
- Base + overlays (dev/stg/prod)
- Без шаблонов, чистый YAML с патчами
- Встроен в kubectl:
kubectl apply -k - Когда: для GitOps, своих приложений с минимальными вариациями
Истина: используй оба, для разного.
Auto-scaling
| Тип | Что |
|---|---|
| HPA | Horizontal — добавляет pod-ы по CPU/memory/custom metrics |
| VPA | Vertical — рекомендует/применяет requests/limits |
| Cluster Autoscaler | Добавляет/удаляет ноды (классический) |
| Karpenter ⭐ | Замена CA на AWS — быстрее, гибче. Стандарт сейчас |
| KEDA | Event-driven scaling: Kafka, RabbitMQ, Prometheus, etc. |
Продвинутые темы
CRDs и Operators ⭐
Operator pattern: контроллер для CRD = автоматизированное знание SRE.
Примеры: cert-manager, external-secrets, prometheus-operator, postgres-operator, argo-cd.
Фреймворки: Operator SDK, kubebuilder.
CNI (Container Network Interface)
- Calico — мощный, BGP, NetworkPolicies
- Cilium ⭐ — eBPF-based, будущее. Service mesh без sidecars
- AWS VPC CNI — стандарт для EKS
Service Mesh
- Istio — мощный (Envoy sidecars). Ambient mode без sidecars — будущее.
- Linkerd — лёгкий, простой, Rust micro-proxy
- Cilium Service Mesh — sidecarless, eBPF
Когда service mesh: 10+ микросервисов, нужен mTLS, advanced traffic management.
Когда НЕ нужен: 5 сервисов, монолит — overkill.
Backups
Velero ⭐ — стандарт. Backups объектов K8s + volumes. Можно мигрировать кластер.
Multi-cluster
- Cluster API ⭐ — провизионинг кластеров как код через CRDs
- Karmada, Liqo — federation
- Submariner — multi-cluster networking
Managed K8s
- EKS (AWS) ⭐ — самый широкий рынок:
- IRSA (IAM Roles for Service Accounts) — must
- EKS Pod Identity — новая альтернатива IRSA
- Karpenter для auto-scaling
- AWS Load Balancer Controller для ALB/NLB Ingress
- EBS CSI Driver, EFS CSI
- GKE (GCP) — Autopilot mode, Workload Identity
- AKS (Azure) — managed
Дебаг — алгоритм для упавшего pod
kubectl get pod— состояниеkubectl describe pod <name>— events, причиныkubectl logs <name>(-pпредыдущий,-ffollow,-cконтейнер)kubectl exec -it <name> -- shkubectl debug— ephemeral debug containerskubectl get events --sort-by='.lastTimestamp'kubectl top pod / node(нужен metrics-server)
Частые причины
- CrashLoopBackOff — приложение падает, проверь logs
- ImagePullBackOff — нет доступа к registry, неправильный тег
- Pending — нет ресурсов, taint без toleration, проверь events
- OOMKilled — превышен memory limit, увеличь
- Evicted — нода под давлением (CPU/memory/disk pressure)
Best practices
- Везде ставь
requests - Probes liveness и readiness — обязательно
- Pod Disruption Budget для важных сервисов
- Anti-affinity для HA
- Namespace per env / per team
- NetworkPolicy «default deny», потом разрешай
- Pod Security Standards Restricted
- Минимизируй RBAC — точечно, не cluster-admin всем
- Limits на namespace через ResourceQuota
- Labels систематически: app, version, env, owner
Сертификации
| Сертификация | Когда | Ценность |
|---|---|---|
| CKA ⭐ | После фазы фундамента | Очень высокая. Практический экзамен 2 ч. |
| CKAD | После CKA | Хорошая |
| CKS ⭐⭐ | После DevSecOps модуля | Топ для DevSecOps |
| KCNA | Для уверенности | Низкая |
Чек-лист
- ☐ Понимаю архитектуру и могу нарисовать
- ☐ Запустил kubeadm-кластер с нуля
- ☐ Деплою stateful app с StatefulSet и StorageClass
- ☐ Пишу свой Helm chart
- ☐ Понимаю IRSA / Workload Identity
- ☐ Использую Karpenter
- ☐ Дебажу упавший pod без гугла
- ☐ CKA сдан (или близко)
Источники
- Курс: Mumshad Mannambeth (Udemy) — золотой стандарт CKA
- Книга: «Kubernetes in Action» — Marko Lukša (2-е изд., 2023)
- Книга: «Kubernetes Patterns» — Bilgin Ibryam, Roland Huß
- Документация: kubernetes.io/docs
- Лабы: killercoda.com, killer.sh
- YouTube: TechWorld with Nana, Just me and Opensource (Venkat)
Kubernetes — самый сложный модуль — освоен. Теперь — observability.