Как развернуть приложение на Kubernetes

Пошаговая инструкция
3 минуты8912

Если вы ещё не сталкивались с платформой Kubernetes, но уже работали с Docker, то эта инструкция вам точно пригодится. Мы кратко поговорим о развёртывании кластера для разработки и рассмотрим набор сущностей Kubernetes, необходимых для развёртывания приложения: deployment и service. 

Главное преимущество Kubernetes — однородность среды, где запускается приложение. Поэтому инструкцию можно будет использовать для развёртывания в локальном или production-кластере. А ещё вы сможете повторить это в своих кластерах, используя те же конфиг-файлы.

Утилита для управления Kubernetes

Для управления Kubernetes используется утилита kubectl. Перед началом всех следующих операций необходимо установить её на компьютер. Как это сделать, смотрите здесь.

Варианты развёртывания Kubernetes

Развёртывание нового production-кластера Kubernetes — трудоёмкий процесс, который может занять несколько дней. А его обслуживание требует от системных администраторов и DevOps’ов определённых компетенций. Сегодня многие облачные провайдеры предоставляют Kubernetes как сервис, позволяющий за считаные минуты развернуть «боевой» кластер. Кроме того, сообщество Kubernetes подготовило ряд решений для упрощённого развёртывания кластера вне облачной инфраструктуры. Самым популярным является Kubespray

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

Настройка Minikube

Для работы Minikube ваш компьютер должен поддерживать виртуализацию. Не переживайте — у большинства современных машин с этим всё в порядке.

Подробно о том, как установить Minikube, можно узнать на официальном сайте Kubernetes.

Создание пространства имён (Namespace)

Процесс развёртывания приложения представляет собой настройку конфигурационных файлов Kubernetes. У них единый стандарт и формат Yaml. 

У Kubernetes есть встроенный механизм для разделения доступов и удобного управления множеством приложений — namespace. Это пространство имён. Каждому такому пространству принадлежит набор приложений с их зависимостями (хранилище, секреты, настройки сети и другое).

Перед развёртыванием приложения нужно создать namespace, которое описывается следующей конфигурацией:

kind: Namespace

apiVersion: v1

metadata:

  name: test

Сохраните её в файл с каким-нибудь простым названием. Например, 01-namespace.yaml.

Для применения конфигурации нужно выполнить команду kubectl apply -f 01-namespace.yaml. После этого будет создано namespace с названием test. Это название нужно будет использовать в конфигурациях ниже. А чтобы посмотреть список namespace, можно использовать команду kubectl get ns.

Разворачиваем первое приложение

Чтобы развернуть приложение в Kubernetes, у него должен быть собранный и загруженный в репозиторий Docker-контейнер. 

Базовой единицей приложения в Kubernetes служит Pod (под), который представляет собой набор из одного и более контейнеров Docker. Развернуть один под можно, используя такую конфигурацию:

kind: Pod

apiVersion: v1

metadata:

  name: mypod

  namespace: test

spec:

  containers:

  - name: mypod

    image: someimage:1.0.0

После применения конфигурации будет создан под с одним контейнером (с образом someimage:1.0.0) в пространстве имён test. Вывести список всех подов можно командой kubectl get pods -n test.

Настраиваем управление подами

В Kubernetes поды редко используются сами по себе. Дело в том, что после остановки под не будет перезапущен. А это не подходит для серверов и других приложений.

В Kubernetes существует несколько систем управления подами. Самая популярная из них — Deployment. Её можно настроить через Yaml-конфиг:

apiVersion: apps/v1

kind: Deployment

metadata:

  name: mydeployment

  namespace: test

spec:

  selector:

    matchLabels:

      app: myapp

  replicas: 3

  template:

    metadata:

      labels:

        app: myapp

    spec:

      containers:

        - name: mypod

          image: someimage:1.0.0

После применения будет создан deployment, который автоматически развернёт и поддержит три реплики нашего контейнера.

Чтобы Kubernetes понимал, как соотносятся поды и deployment, используется система меток (label). Для этого в секции spec указывается селектор, а в template.metadata прописываются метки самого пода. Секция template при этом содержит ту же информацию, что и ранее настроенный под. 

Настройка сервисов

Для многих приложений требуется доступ извне. Чтобы настроить его, нужно создать новую сущность Kubernetes — сервис.

Сервис помогает Kubernetes определить, к каким подам перенаправить запросы клиентов, и определяет доступность портов контейнеров. При этом сам он не является балансировщиком запросов, а лишь позволяет балансировщику определять, куда их направить.

Есть несколько типов сервисов Kubernetes, но нам лучше всех подойдёт Nodeport. Для его развёртывания можно использовать такую конфигурацию:

apiVersion: v1

kind: Service

metadata:

  name: myservice

  namespace: test

spec:

  type: NodePort

  selector:

    app: myapp

  ports:

    - protocol: TCP

      port: 80

      targetPort: 80

После этого будет создан сервис с названием myserivce, который указывает 80 порт подов с метками app: myapp. В секции ports есть поля port и targetPort. Первый служит для назначения порта в сети Kubernetes, а второй — для указания порта, на который контейнер получает входящие запросы.

Особенность сервиса Nodeport в том, что после его создания Kubernetes открывает определённый порт на всех машинах, на которых он развёрнут. Приложение становится доступным по этому порту.

Если кластер развёрнут в Minikube, он находится на виртуальных машинах. Чтобы открыть порт, там требуются дополнительные действия. В Minikube есть специальная команда, которая выполняет их и открывает приложение в браузере, автоматически подставляя назначенный порт:

minikube service myservice -n test

Итог и за кадром

Если вы следовали инструкции и всё сделали правильно, теперь у вас развёрнуто приложение на Kubernetes с несколькими репликами. 

Но есть ещё много полезных настроек и важных деталей платформы. Чтобы описать их, потребуется не одна статья, а целый учебник. Среди них:

  • настройка постоянного хранилища;

  • настройка хранения секретов Kubernetes (паролей, ключей API и другого);

  • обеспечение надёжности в критических ситуациях (например, при выходе из строя физической машины);

  • мониторинг;

  • межконтейнерное взаимодействие внутри сети Kubernetes (например, коммуникации приложения с базой);

  • настройка сертификатов SSL и доступ к приложению по стандартным портам 80 и 443.

Узнайте больше о тонкостях платформы на нашем курсе Kubernetes для разработчиков.

программированиеразработкаkubernetesdocker
Нашли ошибку в тексте? Напишите нам.
Спасибо,
что читаете наш блог!