Зарегистрируйтесь, чтобы продолжить обучение

Первый деплой Kubernetes

Первый деплой

После изучения теории пришло время перейти к практике. В этом уроке вы создадите свой первый Pod, изучите базовые команды kubectl и познакомитесь с YAML-манифестами — основой конфигурации Kubernetes.

Что такое Pod

Pod — это минимальная единица развертывания в Kubernetes, группа из одного или нескольких контейнеров, которые работают как единое целое. Все контейнеры в Pod разделяют общее сетевое пространство имен, имеют один IP-адрес и порты, могут обмениваться данными через localhost и используют общие тома хранения.

Представьте Pod как корабль, а контейнеры — как команду на этом корабле. Все члены команды находятся в одном пространстве, могут общаться друг с другом и разделяют общие ресурсы корабля. Когда корабль отправляется в плавание, вся команда путешествует вместе, и если один член команды заболеет, корабль не может продолжить путь без него.

Подготовка к работе

Для работы с Kubernetes нам понадобится kubectl — командная строка для управления кластерами. Это основной инструмент, через который вы будете взаимодействовать с Kubernetes. Установите его согласно инструкциям для вашей операционной системы:

# Для macOS
brew install kubectl

# Для Linux
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
chmod +x kubectl
sudo mv kubectl /usr/local/bin/

Kubectl использует файл конфигурации ~/.kube/config для подключения к кластеру. Этот файл содержит адрес API-сервера кластера, сертификаты для аутентификации и контекст — информацию о том, с каким кластером и namespace вы работаете в данный момент.

Создание первого Pod

Давайте создадим простой Pod с веб-сервером Nginx. Для этого нам понадобится YAML-манифест — файл конфигурации, который описывает, как должен выглядеть наш Pod:

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    app: nginx
spec:
  containers:
    - name: nginx-container
      image: nginx:1.21
      ports:
        - containerPort: 80

Каждая строка этого манифеста имеет своё назначение. apiVersion: v1 указывает версию API Kubernetes для объектов типа Pod, а kind: Pod говорит системе, что мы создаём именно Pod. В секции metadata мы задаём имя Pod и метки для его идентификации, а в spec описываем содержимое: один контейнер с образом nginx:1.21, который слушает порт 80.

Сохраните этот манифест в файл nginx-pod.yaml и выполните команду:

kubectl apply -f nginx-pod.yaml

Команда kubectl apply применяет конфигурацию к кластеру. Kubernetes прочитает ваш манифест и создаст Pod точно согласно описанию.

Работа с kubectl

После создания Pod вам понадобятся команды для мониторинга и взаимодействия с ним. Основная команда для просмотра состояния — kubectl get pods. Она покажет все Pod в текущем namespace, их статус и время работы. Добавив флаг -o wide, вы получите дополнительную информацию, включая IP-адреса и узлы, на которых запущены Pod. Для отслеживания изменений в реальном времени используйте флаг -w — команда будет обновлять информацию каждые несколько секунд.

# Посмотреть все Pod в текущем namespace
kubectl get pods

# Посмотреть Pod с подробной информацией
kubectl get pods -o wide

# Посмотреть Pod в реальном времени
kubectl get pods -w

Когда нужно разобраться, что происходит с Pod, используйте kubectl describe. Эта команда покажет подробную информацию о Pod: его статус, события, переменные окружения и многое другое. Для просмотра логов контейнера применяйте kubectl logs, а с флагом -f логи будут обновляться в реальном времени, как tail -f в Linux.

# Подробная информация о Pod
kubectl describe pod nginx-pod

# Логи контейнера
kubectl logs nginx-pod

# Логи с отслеживанием изменений
kubectl logs -f nginx-pod

Иногда нужно выполнить команду внутри контейнера или скопировать файлы. Команда kubectl exec позволяет выполнять команды в запущенном контейнере, а с флагами -it вы получите интерактивную сессию с доступом к shell. Для копирования файлов используйте kubectl cp — она работает как обычная cp, но между вашим компьютером и контейнером.

# Выполнить команду в контейнере
kubectl exec nginx-pod -- ls /usr/share/nginx/html

# Открыть интерактивную сессию
kubectl exec -it nginx-pod -- /bin/bash

# Скопировать файл в/из контейнера
kubectl cp nginx-pod:/usr/share/nginx/html/index.html ./index.html

Жизненный цикл Pod

Pod проходит через несколько состояний в течение своей жизни. Когда вы создаёте Pod, он сначала попадает в состояние Pending — система приняла ваш запрос, но контейнеры ещё не запущены. Это может происходить из-за загрузки образа или недостатка ресурсов на узлах.

Когда все условия выполнены, Pod переходит в состояние Running — он привязан к узлу, и все контейнеры запущены и работают. Это нормальное состояние для большинства приложений.

Если приложение завершает свою работу успешно, Pod переходит в состояние Succeeded. Если хотя бы один контейнер завершился с ошибкой, Pod получает статус Failed. В редких случаях, когда система не может определить состояние Pod, он помечается как Unknown.

Для отслеживания изменений состояния используйте команды мониторинга. kubectl get events покажет все события в кластере, отсортированные по времени, а kubectl describe pod отобразит детальную информацию о конкретном Pod, включая события, связанные с ним.

# Посмотреть события, связанные с Pod
kubectl get events --sort-by=.metadata.creationTimestamp

# Посмотреть события для конкретного Pod
kubectl describe pod nginx-pod

Практический пример: веб-приложение

Давайте создадим более сложный Pod с веб-приложением, который демонстрирует работу с переменными окружения. Этот пример покажет, как передавать конфигурацию в контейнер:

apiVersion: v1
kind: Pod
metadata:
  name: web-app
  labels:
    app: web-app
    version: v1.0
spec:
  containers:
    - name: web-container
      image: httpd:2.4
      ports:
        - containerPort: 80
      env:
        - name: MESSAGE
          value: "Hello from Kubernetes!"

В этом манифесте мы добавили переменную окружения MESSAGE, которая будет доступна внутри контейнера. Kubernetes предоставляет несколько способов передачи конфигурации: переменные можно задавать напрямую в манифесте, использовать ConfigMap для сложной конфигурации или Secret для чувствительных данных, таких как пароли и ключи API.

После создания этого Pod вы сможете проверить его работу с помощью знакомых команд:

# Создать Pod
kubectl apply -f web-app.yaml

# Проверить статус
kubectl get pods

# Посмотреть логи
kubectl logs web-app

# Проверить переменные окружения
kubectl exec web-app -- env | grep MESSAGE

Управление Pod

Важно понимать, что Pod в Kubernetes неизменяемы — после создания их нельзя изменить напрямую. Если вам нужно обновить конфигурацию, измените манифест, удалите старый Pod и создайте новый. Это может показаться неудобным, но такая модель обеспечивает предсказуемость и надёжность системы.

Для удаления Pod используйте команду kubectl delete с именем Pod или с манифестом:

# Удалить Pod
kubectl delete pod nginx-pod

# Или удалить по манифесту
kubectl delete -f nginx-pod.yaml

Pod не масштабируются напрямую — вы не можете создать несколько копий одного Pod. Для масштабирования используются более высокоуровневые объекты: ReplicaSet создаёт и поддерживает набор идентичных Pod, а Deployment управляет ReplicaSet и обеспечивает плавные обновления. Эти объекты мы изучим в следующих уроках.

Отладка и решение проблем

При работе с Pod вы неизбежно столкнётесь с проблемами. Наиболее частые ситуации — Pod застревает в состоянии Pending или постоянно перезапускается в состоянии CrashLoopBackOff.

Pod в состоянии Pending обычно означает, что Kubernetes не может разместить его на узле. Это происходит из-за недостатка ресурсов (CPU, памяти), проблем с загрузкой образа или неправильных требований к ресурсам в манифесте.

CrashLoopBackOff указывает на то, что контейнер запускается, но сразу же завершается с ошибкой. Причины могут быть разные: ошибка в коде приложения, неправильная конфигурация или проблемы с зависимостями.

Для диагностики проблем используйте команды, которые мы уже изучили. kubectl describe pod покажет подробную информацию о Pod и событиях, связанных с ним. kubectl logs с флагом --previous покажет логи предыдущего контейнера, если текущий не запустился. События кластера помогут понять, что происходит на системном уровне.

# Посмотреть подробную информацию
kubectl describe pod <pod-name>

# Посмотреть логи предыдущего контейнера
kubectl logs <pod-name> --previous

# Посмотреть события
kubectl get events --field-selector involvedObject.name=<pod-name>

Лучшие практики

При работе с Pod важно следовать определённым правилам, которые помогут избежать проблем в будущем. Используйте описательные имена для Pod и добавляйте метки для группировки и поиска — это упростит управление множеством объектов в кластере.

Всегда указывайте лимиты ресурсов в манифестах. Без них Kubernetes не сможет правильно планировать размещение Pod на узлах, и один "прожорливый" контейнер может заставить весь узел работать медленно. Используйте requests для планирования и limits для ограничения максимального потребления ресурсов.

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

Заключение

В этом уроке вы создали свой первый Pod, изучили базовые команды kubectl, познакомились с YAML-манифестами и научились отлаживать проблемы. Pod — это основа работы с Kubernetes, но в реальных приложениях вы будете использовать более высокоуровневые объекты, такие как Deployment и Service, которые мы изучим в следующих уроках.

Важно помнить: Pod — это временные объекты. Kubernetes может перезапустить их в любой момент, поэтому не храните важные данные в файловой системе контейнера. Используйте постоянные тома для данных, которые должны сохраняться между перезапусками.

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff