логотип PurpleSchool
логотип PurpleSchool

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 на одном локальном компьютере/ноутбуке для тестирования и изучения.

  1. Установите Minikube, следуя официальной инструкции.
  2. Запустите кластер:
minikube start
# После этого кластер готов к работе
  1. Проверьте статус:
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>

Стрелочка влевоКак выбрать подходящую версию KubernetesKubernetes что это и как работаетСтрелочка вправо

Постройте личный план изучения Kubernetes до уровня Middle — бесплатно!

Kubernetes — часть карты развития DevOps

  • step100+ шагов развития
  • lessons30 бесплатных лекций
  • lessons300 бонусных рублей на счет

Бесплатные лекции

Все гайды по Kubernetes

Terraform и Kubernetes инфраструктура как кодНастройка и использование Runners в KubernetesНастройка и деплой PostgreSQL в KubernetesСравнение и интеграция Openshift и KubernetesПримеры интеграции GitHub Actions и KubernetesDeploy приложений в Kubernetes - пошаговое руководство для начинающих и не толькоИнтеграция Ansible в KubernetesКак настроить CD в KubernetesИнтеграция CI/CD с Jenkins и KubernetesИнтеграция Kubernetes с GitLab - Автоматизация CI CD в облачной инфраструктуреГайд по DevOps инструментам в KubernetesОсобенности платформы Deckhouse в Kubernetes
Открыть базу знаний

Лучшие курсы по теме

изображение курса

Kubernetes и Helm

Антон Ларичев
AI-тренажеры
Гарантия
Бонусы
иконка звёздочки рейтинга4.9
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

Docker и Ansible

Антон Ларичев
AI-тренажеры
Гарантия
Бонусы
иконка звёздочки рейтинга4.8
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

Микросервисы

Антон Ларичев
Гарантия
Бонусы
иконка звёздочки рейтинга4.8
3 999 ₽ 6 990 ₽
Подробнее

Отправить комментарий