Олег Марков
Kubernetes io что это и как использовать на практике
Введение
Kubernetes.io — это официальный сайт и документация по Kubernetes, одному из наиболее популярных инструментов для автоматизации развертывания, масштабирования и управления контейнеризированными приложениями. Kubernetes, или как его часто называют «K8s», предоставляет мощные возможности для работы с микросервисами и сложными инфраструктурами. С помощью Kubernetes вы можете управлять кластерами серверов, запускать приложения в контейнерах, автоматически масштабировать ресурсы, а также реализовывать zero-downtime обновления.
В этой статье я подробно расскажу, что такое Kubernetes, для чего он нужен, его основные компоненты и принципы работы. Мы рассмотрим примеры развертывания, управления и типовые сценарии использования, чтобы вы могли начать применять Kubernetes на практике.
Что такое Kubernetes и зачем он нужен
Контейнеризация: краткое объяснение
Kubernetes работает с контейнерами — это специальный способ упаковки приложений вместе со всеми зависимостями и настройками. Например, сервисы в интернет-магазине, веб-приложении или любом другом IT-продукте можно изолировать в контейнеры (чаще всего с помощью Docker), чтобы гарантировать одинаковую работу приложения независимо от окружения.
Контейнеры позволяют запускать микросервисы быстро, эффективно использовать ресурсы и легко переносить приложения между серверами, облаками и средами разработки.
В чем преимущества Kubernetes
Без Kubernetes вам придется вручную запускать, масштабировать, обновлять и контролировать множество контейнеров, а также управлять их взаимодействием. Kubernetes автоматизирует эти задачи:
- Автоматическое развертывание и оркестрация контейнеров
- Самовосстановление сервисов (перезапуск, если что-то пошло не так)
- Балансировка нагрузки между контейнерами
- Автоматическое масштабирование
- Простой способ обновления приложений (rolling updates)
- Хранение и управление конфигурацией (секретами, переменными окружения)
Давайте подробнее рассмотрим, как это выглядит на практике и что именно предоставляет Kubernetes пользователю.
Основные компоненты Kubernetes
Kubernetes состоит из нескольких ключевых компонентов. Вот краткое, но понятное объяснение каждого из них:
Кластер и Node
Кластер Kubernetes — это группа компьютеров (нод), на которых развернуты контейнеры ваших приложений. Сам кластер управляется специальным сервером — control plane.
- Control Plane (управляющая плоскость) отвечает за принятие решений: где запускать контейнеры, как их масштабировать, как реагировать на фейлы.
- Node (нода) — это отдельная физическая или виртуальная машина (обычно сервер), которая работает внутри кластера. На каждом Node запущены необходимые агенты и контейнеры ваших приложений.
Pod
Pod – минимальная и наименьшая единица развертывания в Kubernetes. Каждый Pod содержит один или несколько контейнеров, которые запускаются на одной и той же ноде и имеют общий IP-адрес и локальное хранилище.
Давайте посмотрим на пример YAML-файла для Pod:
# mypod.yaml
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
spec:
containers:
- name: myapp-container
image: nginx
ports:
- containerPort: 80
Здесь мы определяем Pod с контейнером на основе образа nginx и настраиваем порт. Такой YAML-файл — основной инструмент описания объектов в Kubernetes.
Deployment
Deployment управляет созданием и обновлением множества Pod-ов. Это удобное средство для масштабирования и автоматических обновлений.
Пример Deployment, который создает 3 экземпляра Pod с приложением nginx:
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.21
ports:
- containerPort: 80
С помощью Deployment вы не только развернёте несколько копий сервиса, но и сможете обновлять приложение без простоя (rolling update).
Service
Service обеспечивает постоянный доступ к Pod-ам вне зависимости от того, сколько их и на каких нодах они запущены. Service создает стабильную точку доступа (например, IP или DNS), а Kubernetes сам направит сетевой трафик на нужные Pod-ы.
Пример Service для открытия доступа к приложению:
# service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: ClusterIP
В этом примере Service автоматически направляет запросы на все Pod-ы с меткой app: nginx
.
ConfigMap и Secret
Для управления настройками и секретами используйте объекты ConfigMap и Secret:
- ConfigMap хранит неконфиденциальные данные: переменные окружения, настройки конфигурационных файлов.
- Secret — хранит чувствительные данные, такие как пароли и токены.
Примеры:
# configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
APP_MODE: "production"
LOG_LEVEL: "warning"
# secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: db-password
type: Opaque
data:
# Пароль закодирован в base64 (например, password -> cGFzc3dvcmQ=)
password: cGFzc3dvcmQ=
Ингресс (Ingress)
Ingress — специальный объект, который управляет внешним доступом к сервисам в кластере Kubernetes, в основном HTTP и HTTPS-трафиком. Ingress позволяет определять правила маршрутизации запросов, SSL-терминацию и другие параметры.
Пример простого Ingress:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
spec:
rules:
- host: my-app.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-service
port:
number: 80
Установка и запуск Kubernetes
Существует несколько способов развернуть Kubernetes-кластер. Вот ключевые варианты:
Minikube для локальной работы
Minikube — инструмент для запуска Kubernetes на одном локальном компьютере/ноутбуке для тестирования и изучения.
- Установите Minikube, следуя официальной инструкции.
- Запустите кластер:
minikube start
# После этого кластер готов к работе
- Проверьте статус:
kubectl get nodes
# Отобразит список нод (у Minikube будет одна локальная нода)
Kubeadm для серверов
Если нужен кластер на выделенном сервере или в облаке, удобно использовать Kubeadm. Инструкция зависит от конкретной ОС и инфраструктуры.
Облачные сервисы (GKE, EKS, AKS и др.)
Облако, такое как Google Kubernetes Engine (GKE), Amazon Elastic Kubernetes Service (EKS) или Azure Kubernetes Service (AKS), предоставляет полностью управляемые кластеры Kubernetes «под ключ» — вам не нужно самостоятельно настраивать сервера, обновлять ПО и управлять надежностью.
Рассмотрим наиболее распространенный вариант — работу с Minikube для старта.
Разворачивание вашего первого приложения
Давайте развернем приложение на Kubernetes с помощью Minikube. Сценарий подойдет и для любых других кластеров — разница лишь в способе подключения.
1. Определяем манифест Deployment
Создайте файл deployment.yaml
с содержимым (как выше):
см. выше секцию Deployment
2. Применяем манифест
Примените манифест командой:
kubectl apply -f deployment.yaml
Посмотрите статус развёрнутых объектов:
kubectl get deployments
kubectl get pods
3. Определяем Service для доступа
Создайте файл service.yaml
(см. выше Service) и примените:
kubectl apply -f service.yaml
kubectl get services
Для Minikube открываем доступ локально:
minikube service nginx-service
# Эта команда автоматически откроет браузер с вашим приложением
4. Просмотр логов и управление
Посмотреть логи приложения:
kubectl logs pod/<имя-пода>
Перезапустить Pod или Deployment (например, для обновления):
kubectl rollout restart deployment/nginx-deployment
Удалить объект:
kubectl delete -f deployment.yaml
или
sh
kubectl delete deployment nginx-deployment
Масштабирование и обновление приложений
Kubernetes позволяет легко масштабировать ваши приложения в зависимости от нагрузки.
Масштабирование вручную
Вы можете увеличить или уменьшить число Pod-ов с помощью команды:
kubectl scale deployment nginx-deployment --replicas=5
Это мгновенно создаст или удалит нужное количество реплик.
Автоматическое масштабирование (Horizontal Pod Autoscaler)
Можно включить автомасштабирование по нагрузке на CPU или памяти:
kubectl autoscale deployment nginx-deployment --cpu-percent=80 --min=2 --max=10
Kubernetes будет самостоятельно увеличивать или уменьшать количество Pod-ов, если нагрузка выйдет за допустимые пределы.
Безопасные обновления (Rolling updates)
Kubernetes Deployment по умолчанию обновляет ваше приложение постепенно (rolling update): поочередно перезапускает Pod-ы, избегая простоя.
Если новое обновление оказалось неудачным, вы легко можете откатиться назад:
kubectl rollout undo deployment/nginx-deployment
Мониторинг и диагностика
Для управления и мониторинга кластера доступны встроенные и внешние инструменты:
- kubectl get, describe, logs — просмотр состояния объектов и логов
- Kubernetes Dashboard – визуальный интерфейс для мониторинга кластера
- Prometheus и Grafana — мощная система мониторинга и построения графиков метрик
Установить Dashboard очень просто:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml
Доступ к Dashboard с помощью:
kubectl proxy
Перейдите по адресу http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/
Как организовать хранение данных
Контейнеры обычно работают с временным хранилищем, но реальные приложения часто нуждаются в постоянных данных.
Persistent Volumes и Persistent Volume Claims
- PersistentVolume (PV) – разделяемое хранилище, предоставленное кластером (например, диск в облаке).
- PersistentVolumeClaim (PVC) – запрос на хранилище определенного размера или типа.
Как пример, вот как можно создать PVC:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mypvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
В Pod вы подключаете этот PVC к приложению:
spec:
containers:
- name: app
image: my-app
volumeMounts:
- mountPath: "/data"
name: mydata
volumes:
- name: mydata
persistentVolumeClaim:
claimName: mypvc
Теперь ваше приложение будет сохранять данные на внешнем постоянном диске.
Секреты, настройки и безопасность
Kubernetes заботится о безопасности:
- Секреты обычно передаются как переменные окружения или файлы только для конкретного приложения.
- Вы можете ограничивать доступ к ресурсам и нодам с помощью ролей (RBAC).
- С помощью Network Policies и Ingress Controls управления сетевым доступом.
Заключение
Kubernetes — это не просто способ запускать контейнеры: это комплексная экосистема, которая автоматизирует развертывание, масштабирование, обновление и восстановление приложений в продакшене. Независимо от того, запускаете ли вы микросервисы в облаке или разворачиваете CI/CD для современного стартапа, инструменты Kubernetes значительно упрощают управление инфраструктурой и увеличивают отказоустойчивость сервисов.
Вы познакомились с основными компонентами Kubernetes и увидели примеры, как развернуть первое приложение, масштабировать его и организовать надежное хранение данных. Знание основ Kubernetes откроет для вас путь к грамотному управлению современными IT-системами.
Частозадаваемые технические вопросы и ответы
Как удалить ошибочно созданный ресурс в Kubernetes?
Используйте команду: ```sh kubectl delete <тип> <имя>
Например: kubectl delete pod mypod
или
sh
kubectl delete -f <yaml-файл```
Как подключиться к базе данных, которая находится в другом Pod?
Внутри кластера используйте имя сервиса как hostname. Например, если у вас есть Service с именем postgres
, то в приложении укажите postgres:5432
как адрес подключения.
Как ограничить потребление памяти и CPU для Pod?
Добавьте в манифест контейнера секцию resources
:
yaml
resources:
requests:
memory: "128Mi"
cpu: "250m"
limits:
memory: "256Mi"
cpu: "500m"
Это ограничит ресурсы для контейнера, предотвращая перегрузку кластера.
Почему Pod постоянно перезапускается?
Проверьте логи с помощью:
sh
kubectl logs <pod>
Чаще всего причиной являются ошибки приложения или неверные настройки переменных окружения.
Как узнать внешний IP-адрес для доступа к сервису вне кластера?
Для Service с типом LoadBalancer
используйте:
sh
kubectl get services
В столбце EXTERNAL-IP
будет нужный адрес (или используйте настройки облачного провайдера). Для Minikube – команду:
sh
minikube service <service-name>
Постройте личный план изучения Kubernetes до уровня Middle — бесплатно!
Kubernetes — часть карты развития DevOps
100+ шагов развития
30 бесплатных лекций
300 бонусных рублей на счет
Бесплатные лекции
Все гайды по Kubernetes
Лучшие курсы по теме

Kubernetes и Helm
Антон Ларичев
Docker и Ansible
Антон Ларичев