21. Введение в Kubernetes
Kubernetes (K8s) — система оркестрации контейнеров с открытым исходным кодом от Google. Если Docker управляет контейнерами на одном хосте, то Kubernetes управляет тысячами контейнеров на кластере из множества серверов.
Почему Kubernetes?
Заголовок раздела «Почему Kubernetes?»Docker Compose отлично работает для одного сервера. Но в продакшене возникают вопросы:
- Что делать, если сервер упадёт?
- Как запустить приложение на 10 серверах?
- Как обновить приложение без простоя?
- Как автоматически масштабироваться под нагрузкой?
Kubernetes отвечает на все эти вопросы.
Основные концепции Kubernetes
Заголовок раздела «Основные концепции Kubernetes»Pod — минимальная единица
Заголовок раздела «Pod — минимальная единица»Pod — это один или несколько контейнеров, которые всегда запускаются вместе на одном узле.
apiVersion: v1kind: Podmetadata: name: my-apispec: 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 — управление репликами
Заголовок раздела «Deployment — управление репликами»Deployment управляет несколькими копиями (репликами) Pod-а и обеспечивает rolling updates.
apiVersion: apps/v1kind: Deploymentmetadata: name: api-deploymentspec: 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: 3000Service — доступ к Pod-ам
Заголовок раздела «Service — доступ к Pod-ам»Service предоставляет стабильный IP-адрес и DNS-имя для набора Pod-ов.
apiVersion: v1kind: Servicemetadata: name: api-servicespec: selector: app: api ports: - protocol: TCP port: 80 targetPort: 3000 type: ClusterIP # только внутри кластера # type: NodePort # доступ снаружи через порт узла # type: LoadBalancer # через облачный балансировщикNamespace — изоляция
Заголовок раздела «Namespace — изоляция»# Разные окружения в одном кластереkubectl create namespace productionkubectl create namespace staging
kubectl apply -f deployment.yml -n productionkubectl apply -f deployment.yml -n stagingОсновные команды kubectl
Заголовок раздела «Основные команды kubectl»# Кластер и контекстыkubectl cluster-infokubectl config get-contextskubectl config use-context mycontext
# Pod-ыkubectl get podskubectl get pods -n productionkubectl describe pod my-api-abc123kubectl logs my-api-abc123 -fkubectl exec -it my-api-abc123 -- bash
# Деплойkubectl apply -f deployment.ymlkubectl rollout status deployment/api-deploymentkubectl rollout history deployment/api-deploymentkubectl rollout undo deployment/api-deployment # откат
# Масштабированиеkubectl scale deployment api-deployment --replicas=5
# Удалениеkubectl delete deployment api-deploymentkubectl delete pod my-api-abc123Helm: менеджер пакетов для Kubernetes
Заголовок раздела «Helm: менеджер пакетов для Kubernetes»# Установить Redis через Helmhelm repo add bitnami https://charts.bitnami.com/bitnamihelm install my-redis bitnami/redis
# Установить с кастомными значениямиhelm install my-app ./my-chart \ --set image.tag=v1.2.3 \ --set replicas=3 \ -f production-values.yaml