Kubernetes в продакшене: основные понятия и вопросы на собеседовании

В этой статье мы рассмотрим, что такое Kubernetes, в каких случаях его использование оправдано, и разберем вопросы, которые вы можете встретить на собеседованиях.

Что такое Kubernetes простыми словами?

Разберем на примере интернет-магазина с тремя серверами:

  1. Сервер №1 – основной (принимает заказы).
  2. Сервер №2 – база данных (хранит товары и пользователей).
  3. Сервер №3 – бекенд для API (обрабатывает платежи).

Проблема:

  • В Чёрную пятницу приходит в 10 раз больше покупателей. В результате, сервера №1 и №3 падают от нагрузки, магазин «висит».
  • Сервер №2 (база данных) ломается, а все заказы теряются.
  • Чтобы добавить новые сервера, админ вручную копирует настройки, что занимает часы.

Решение при помощи Kubernetes.

Те же 3 сервера, но теперь они управляются Kubernetes.

  1. Автомасштабирование
    • При наплыве покупателей Kubernetes автоматически запускает дополнительные копии серверов №1 и №3.
    • Когда нагрузка падает – лишние сервера отключаются.
  2. Отказоустойчивость
    • Если сервер №2 (база данных) упал, Kubernetes сразу переключает нагрузку на его резервную копию.
    • Покупатели даже не замечают проблемы.
  3. Гибкие обновления
    • Вы хотите обновить API (сервер №3).
    • Kubernetes делает это без downtime:
      • Запускает новые версии API, переключает трафик на них и останавливает старые.
  4. Экономия денег
    • Ночью, когда магазин почти не используют, Kubernetes отключает часть серверов.
    • Утром – снова включает.

Что это даёт бизнесу?

  • Магазин не «падает» в пиковые нагрузки (Чёрная пятница, распродажи).
  • Нет потери заказов – если что-то сломалось, система сама всё починит.
  • Быстрые обновления – можно выпускать новые фичи без остановки магазина.
  • Экономия на серверах – не нужно держать «лишние» мощности.

Kubernetes: мощный инструмент, но не серебряная пуля

Kubernetes — это система оркестрации контейнеров, которая помогает управлять масштабируемыми и отказоустойчивыми приложениями.

Термин k8s является синонимом Kubernetes и означает 8 букв между первой и последней буквой. Да, программисты любят сокращения 🙂

Примерно с 2018 года мы наблюдаем устойчивый тренд: Kubernetes стал синонимом «правильной» продакшн-инфраструктуры. И это не случайно. Он действительно решает множество проблем, связанных с управлением микросервисами, масштабированием, отказоустойчивостью и обновлением без простоев.

Когда Kubernetes оправдан:

  • Микросервисная архитектура с большим количеством сервисов.
  • Необходимость автоматического масштабирования под нагрузку.
  • Высокие требования к отказоустойчивости.
  • Гибкость деплоя (Canary, Blue-Green, A/B-тестирование).

Когда Kubernetes — избыточное решение:

  • Монолитное приложение с низкой нагрузкой.
  • Маленькие проекты без потребности в масштабировании.
  • Стартапы с ограниченным бюджетом.
  • Проект для демо или MVP, в которых планируется масштабирования только после получения инвестиций
  • Команда не готова к сложности k8s (обучение и поддержка требуют ресурсов).

В компании AppFox мы используем Kubernetes при построения кластеров для мультиплеерных игр и проектов со сложной микросервисной архитектурой. В частности, мы его использовали при разработке решений для СберБанка и Банка ВТБ.

Основные понятия Kubernetes

  • Pod — минимальная единица развертывания (может содержать один или несколько контейнеров).
  • Deployment — декларативное описание желаемого состояния приложения.
  • Service — абстракция для доступа к подам (ClusterIP, NodePort, LoadBalancer).
  • Ingress — управление внешним трафиком (роутинг, SSL).
  • ConfigMap & Secret — хранение конфигураций и чувствительных данных.
  • PersistentVolume (PV) & PersistentVolumeClaim (PVC) — работа с постоянным хранилищем.
  • Helm — менеджер пакетов для k8s (чарты).

Вопросы по Kubernetes на собеседовании

Теперь самое интересное — какие вопросы задают кандидатам в зависимости от их уровня.

Для backend-разработчика

Что такое контейнер и зачем нужен Docker?

  • Контейнер — это изолированное окружение для запуска приложений со всеми зависимостями. 
  • Docker — платформа для создания и управления контейнерами. 

Разница между Docker и Kubernetes

  • Docker создает контейнеры
  • Kubernetes управляет множеством контейнеров на разных серверах. 

Как работает kubectl get pods? Что выведет эта команда?

Команда показывает список подов (pods) — минимальных единиц развертывания в k8s. Вывод включает имя пода, статус, количество рестартов и возраст.

Что такое Deployment и зачем он нужен?

Это объект k8s для декларативного управления подами. Позволяет:

  • Разворачивать приложения
  • Обновлять их (rolling update)
  • Возвращаться к предыдущим версиям (rollback)
  • Масштабировать количество реплик

Как приложение в k8s получает конфигурацию (ConfigMap, Secrets)?

  • ConfigMap хранит конфигурации (например, настройки приложения)
  • Secrets — чувствительные данные (пароли, токены). Они монтируются в поды как файлы или переменные окружения.

Что такое Pod, Deployment и Service?

  • Pod — это минимальная единица в Kubernetes
  • Deployment управляет жизненным циклом Pod’ов
  • Service предоставляет сетевой доступ.

Как подать переменные окружения в Pod?

Через env, envFrom, ConfigMap, Secret.

Что произойдет, если Pod упал?

Kubernetes сам его перезапустит — важно понимать работу контроллеров.

Для Junior DevOps

Как создать под с помощью kubectl?

  • kubectl run nginx --image=nginx
  • Или через YAML-манифест:
    kubectl apply -f pod.yaml

Как посмотреть логи пода?

  • kubectl logs <pod-name>
  • Для пода с несколькими контейнерами:
    kubectl logs <pod-name> -c <container-name>

Как работает Service? Какие типы сервисов знаете?

Абстракция для доступа к набору подов. Типы:

  • ClusterIP (внутренний IP)
  • NodePort (порт на каждой ноде)
  • LoadBalancer (внешний балансировщик)
  • ExternalName (CNAME-запись)

Как обновить приложение в k8s (стратегии деплоя)?

  • RollingUpdate (постепенная замена подов)
  • Recreate (удаление всех старых перед созданием новых)

Что делает kubelet и kube-proxy?

  • kubelet — агент на нодах, запускает и контролирует контейнеры
  • kube-proxy — обеспечивает сетевую связность между сервисами

Как создать кластер Kubernetes?

  • Minikube – простой однодосковый кластер для разработки / тестирования

    minikube start --driver=docker  # Запуск с Docker-драйвером
    minikube kubectl -- get pods    # Доступ к kubectl
  • Kind (Kubernetes in Docker) – кластер внутри контейнеров Docker (не имеет облачных интеграций)kind create cluster --name my-cluster  # Создать кластер
    kubectl cluster-info --context kind-my-cluster  # Проверить
  • kubeadm – стандартный инструмент для развертывания
    продакшен-кластера (нужно управлять вручную)

    # На мастер-ноде:
    kubeadm init --pod-network-cidr=10.244.0.0/16
    mkdir -p $HOME/.kube
    sudo cp /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config


    # На worker-нодах:
    kubeadm join <MASTER_IP>:6443 --token <TOKEN>
    --discovery-token-ca-cert-hash <HASH>


    # Установка CNI (например, Calico):
    kubectl apply -f
    https://docs.projectcalico.org/manifests/calico.yaml
  • GKE (Google Kubernetes Engine) — управляемые облачные кластеры

    gcloud container clusters create my-cluster --num-nodes=3
    gcloud container clusters get-credentials my-cluster
  • EKS (Amazon Elastic Kubernetes Service)

    eksctl create cluster --name my-cluster --region us-west-2 --nodegroup-name workers --nodes 3
  • AKS (Azure Kubernetes Service)

    az aks create --resource-group my-group --name my-cluster --node-count 3
    az aks get-credentials --resource-group my-group --name my-cluster

Как подключить volume к Pod’у?

Volume (том) в Kubernetes позволяет сохранять данные между перезапусками Pod’ов. Есть несколько типов томов, но для постоянного хранения данных используются PersistentVolume (PV) и PersistentVolumeClaim (PVC).

  • PersistentVolume — это ресурс в кластере, представляющий физическое хранилище (например, диск в облаке или NFS-шару). PV создаётся администратором кластера и существует независимо от Pod’ов.
  • PersistentVolumeClaim — запрос Pod’а на выделение PV. PVC связывается с подходящим PV (или динамически создаёт его, если настроен StorageClass). PVC монтируется в Pod как volume. Если не хочется создавать PV вручную, можно использовать StorageClass для автоматического создания томов.

Чем отличается Horizontal Pod Autoscaler от Vertical Pod Autoscaler?

  • HPA масштабирует количество Pod’ов на основе метрик нагрузки (увеличивает или уменьшает число реплик (replicas) Deployment’а в зависимости от, например, CPU или памяти, т.е., нагрузка выросла — добавили ещё Pod’ов).
  • VPA изменяет ресурсы (CPU, память) у контейнеров внутри Pod’а

# Посмотреть PV и PVC

kubectl get pv

kubectl get pvc

# Проверить, что Pod видит данные

kubectl exec -it my-pod -- ls /usr/share/nginx/html

Для Middle DevOps

Как настроить Ingress для доступа к сервису?

Пример yaml-манифеста:

apiVersion: networking.k8s.io/v1

kind: Ingress

metadata:

  name: example-ingress

spec:

  rules:

  - host: example.com

    http:

      paths:

      - path: /

        pathType: Prefix

        backend:

          service:

            name: web-service

            port:

              number: 80

Как сделать Horizontal Pod Autoscaler (HPA)?

Пример yaml-манифеста:

apiVersion: autoscaling/v2

kind: HorizontalPodAutoscaler

metadata:

  name: php-apache

spec:

  scaleTargetRef:

    apiVersion: apps/v1

    kind: Deployment

    name: php-apache

  minReplicas: 1

  maxReplicas: 10

  metrics:

  - type: Resource

    resource:

      name: cpu

      target:

        type: Utilization

        averageUtilization: 50

Как управлять ресурсами (requests/limits)?

Пример yaml-манифеста пода:

resources:

  requests:

    memory: "64Mi"

    cpu: "250m"

  limits:

    memory: "128Mi"

    cpu: "500m"

Как настроить PersistentVolume для stateful-приложения?

Пример для stateful-приложения (yaml):

apiVersion: v1

kind: PersistentVolumeClaim

metadata:

  name: db-pvc

spec:

  accessModes:

    - ReadWriteOnce

  resources:

    requests:

      storage: 10Gi

Как диагностировать проблему с CrashLoopBackOff?

  1. Посмотреть логи пода
  2. Проверить readiness/liveness пробы
  3. Убедиться, что контейнеру хватает ресурсов
  4. Проверить монтирование томов
  5. Изучить события кластера:
    1. kubectl describe pod <pod-name>
    2. kubectl get events

Для Senior DevOps

Как настроить NetworkPolicy для изоляции подов?

Пример изоляции (yaml):

apiVersion: networking.k8s.io/v1

kind: NetworkPolicy

metadata:

  name: db-isolation

spec:

  podSelector:

    matchLabels:

      app: database

  policyTypes:

  - Ingress

  ingress:

  - from:

    - podSelector:

        matchLabels:

          app: backend

    ports:

    - protocol: TCP

      port: 5432

Как работает etcd и что делать при его проблемах?

Распределенное key-value хранилище — «мозг» Kubernetes. Проблемы и решения:

  • Недостаток места: регулярная дефрагментация
  • Высокая задержка: оптимизация сети
  • Потеря кворума: восстановление из бэкапа

Как настроить мониторинг (Prometheus + Grafana)?

  1. Установка Prometheus Operator
  2. Настройка ServiceMonitor для сбора метрик
  3. Создание Grafana дашбордов
  4. Настройка алертов через Alertmanager

Как организовать multi-cluster управление?

Варианты:

  • Kubefed (Federation v2)
  • Cluster API
  • Коммерческие решения (GKE Anthos, EKS Anywhere)
    Основные задачи: синхронизация ресурсов, единая аутентификация, централизованное логирование.

Как оптимизировать costs в облачном k8s (автоскейлинг нод)?

  • Использование spot-инстансов
  • Автомасштабирование нод (Cluster Autoscaler)
  • Вертикальное масштабирование подов (VPA)
  • Планирование подов на дешевые ноды (node affinity/taints)
  • Использование serverless-решений (AWS Fargate, GCP Cloud Run)

Заключение: Kubernetes — мощный инструмент, но не панацея

Kubernetes действительно стал стандартом для оркестрации контейнеров в современных облачных и гибридных средах. Он решает ключевые задачи: масштабируемость, отказоустойчивость и автоматизацию деплоя. Однако его внедрение требует взвешенного подхода — не каждый проект нуждается в такой сложности.

Главный совет:

  • Если у вас микросервисы, высокая нагрузка или требовательная инфраструктура — Kubernetes может стать вашим решением.
  • Если проект небольшой или монолитный — начните с простых решений (Docker Compose, managed-сервисов) и масштабируйтесь постепенно.

Попробуйте Kubernetes в действии:

  • Разверните локальный кластер через minikube или kind.
  • Поэкспериментируйте с Helm-чартами и автоскейлингом.
  • Изучите managed-решения (GKE/EKS/AKS), чтобы оценить их преимущества.