Меня зовут Александр, я CTO компании AppFox. Мы более 10 лет занимаемся заказной разработкой и также имеем собственные продукты.

В этой статье мы рассмотрим, что такое 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), чтобы оценить их преимущества.

Комментарии (3)


  1. Angry_Bel
    15.05.2025 15:25

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

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

    Разворачивать приложения

    Обновлять их (rolling update)

    Возвращаться к предыдущим версиям (rollback)

    Масштабировать количество реплик

    Штэ? Вы сейчас надеюсь шутите, а не на серьезных щах? А реплика сет, что по вашему делает, и почему она в деплойменте?

    Все что делает деплой, по факту управляет RS, которая развлекается с подами

    Дальше не читал, но осуждаю


    1. VladA1982
      15.05.2025 15:25

      Асболютно верное описание.

      Реплика сет описывает сколько подов должно работать одновременно. Реплика сеты позволяют масштабировать количество реплик и... Всё, собственно. Они не поддерживают обновления подов, не то, что определения стратегии их обновления, не поддерживают откаты на предыдущие версии. Так что replica set не развлекается с подами никак. Всё, что она делает - удостоверятся, что количество подов, подходящий под прописанный селектор, равно прописанному и удаляет лишние или поднимает недостающие. С весьма "забавными" побочными эффектами. Это никак не управление подами, это управление количеством подов подходящих под предикат.

      Деплоймент же действительно позволяет декларативно разворачивать приложения (состоящие из множества реплика сетов и подов с различными селекторами), определять стратегию обновления, возвращаться к предыдущим версиям и масштабировать количество реплик. Деплоймент является рекомендованной альтернативой для реплик сетов и использует их как внутренний механизм для оркестрации подов (т.е. управления ими).


  1. Brain2Life
    15.05.2025 15:25

    Такое чувство что просто на скорую руку сделано. Никогда не видел чтоб на собеседований спрашивали наизусть команды join через kubeadm для мастер ноды или yaml файлы ингресса и сетевых политик. Все эти вещи можно посмотреть в документации