Перейти к содержимому

21. Введение в Kubernetes

Kubernetes (K8s) — система оркестрации контейнеров с открытым исходным кодом от Google. Если Docker управляет контейнерами на одном хосте, то Kubernetes управляет тысячами контейнеров на кластере из множества серверов.

Docker Compose отлично работает для одного сервера. Но в продакшене возникают вопросы:

  • Что делать, если сервер упадёт?
  • Как запустить приложение на 10 серверах?
  • Как обновить приложение без простоя?
  • Как автоматически масштабироваться под нагрузкой?

Kubernetes отвечает на все эти вопросы.

Pod — это один или несколько контейнеров, которые всегда запускаются вместе на одном узле.

pod.yml
apiVersion: v1
kind: Pod
metadata:
name: my-api
spec:
containers:
- name: api
image: myapp:v1.2.3
ports:
- containerPort: 3000
env:
- name: NODE_ENV
value: production
resources:
requests:
memory: "128Mi"
cpu: "100m"
limits:
memory: "256Mi"
cpu: "500m"

Deployment управляет несколькими копиями (репликами) Pod-а и обеспечивает rolling updates.

apiVersion: apps/v1
kind: Deployment
metadata:
name: api-deployment
spec:
replicas: 3 # 3 экземпляра Pod
selector:
matchLabels:
app: api
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1 # максимум 1 Pod недоступен при обновлении
maxSurge: 1 # максимум 1 дополнительный Pod при обновлении
template:
metadata:
labels:
app: api
spec:
containers:
- name: api
image: myapp:v1.2.3
ports:
- containerPort: 3000

Service предоставляет стабильный IP-адрес и DNS-имя для набора Pod-ов.

apiVersion: v1
kind: Service
metadata:
name: api-service
spec:
selector:
app: api
ports:
- protocol: TCP
port: 80
targetPort: 3000
type: ClusterIP # только внутри кластера
# type: NodePort # доступ снаружи через порт узла
# type: LoadBalancer # через облачный балансировщик
# Разные окружения в одном кластере
kubectl create namespace production
kubectl create namespace staging
kubectl apply -f deployment.yml -n production
kubectl apply -f deployment.yml -n staging
Окно терминала
# Кластер и контексты
kubectl cluster-info
kubectl config get-contexts
kubectl config use-context mycontext
# Pod-ы
kubectl get pods
kubectl get pods -n production
kubectl describe pod my-api-abc123
kubectl logs my-api-abc123 -f
kubectl exec -it my-api-abc123 -- bash
# Деплой
kubectl apply -f deployment.yml
kubectl rollout status deployment/api-deployment
kubectl rollout history deployment/api-deployment
kubectl rollout undo deployment/api-deployment # откат
# Масштабирование
kubectl scale deployment api-deployment --replicas=5
# Удаление
kubectl delete deployment api-deployment
kubectl delete pod my-api-abc123
Окно терминала
# Установить Redis через Helm
helm repo add bitnami https://charts.bitnami.com/bitnami
helm install my-redis bitnami/redis
# Установить с кастомными значениями
helm install my-app ./my-chart \
--set image.tag=v1.2.3 \
--set replicas=3 \
-f production-values.yaml