В этой статье мы рассмотрим, что такое Kubernetes, в каких случаях его использование оправдано, и разберем вопросы, которые вы можете встретить на собеседованиях.
Что такое Kubernetes простыми словами?
Разберем на примере интернет-магазина с тремя серверами:
- Сервер №1 – основной (принимает заказы).
- Сервер №2 – база данных (хранит товары и пользователей).
- Сервер №3 – бекенд для API (обрабатывает платежи).
Проблема:
- В Чёрную пятницу приходит в 10 раз больше покупателей. В результате, сервера №1 и №3 падают от нагрузки, магазин «висит».
- Сервер №2 (база данных) ломается, а все заказы теряются.
- Чтобы добавить новые сервера, админ вручную копирует настройки, что занимает часы.
Решение при помощи Kubernetes.
Те же 3 сервера, но теперь они управляются Kubernetes.
- Автомасштабирование
- При наплыве покупателей Kubernetes автоматически запускает дополнительные копии серверов №1 и №3.
- Когда нагрузка падает – лишние сервера отключаются.
- Отказоустойчивость
- Если сервер №2 (база данных) упал, Kubernetes сразу переключает нагрузку на его резервную копию.
- Покупатели даже не замечают проблемы.
- Гибкие обновления
- Вы хотите обновить API (сервер №3).
- Kubernetes делает это без downtime:
- Запускает новые версии API, переключает трафик на них и останавливает старые.
- Экономия денег
- Ночью, когда магазин почти не используют, 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 -fhttps://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?
- Посмотреть логи пода
- Проверить readiness/liveness пробы
- Убедиться, что контейнеру хватает ресурсов
- Проверить монтирование томов
- Изучить события кластера:
- kubectl describe pod <
pod-name
> - kubectl get events
- kubectl describe pod <
Для 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)?
- Установка Prometheus Operator
- Настройка ServiceMonitor для сбора метрик
- Создание Grafana дашбордов
- Настройка алертов через 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), чтобы оценить их преимущества.