Разворачиваем контейнеры в Kubernetes

26/02/2020


Как работать с Kubernetes — вопрос, который волнует многих. Система оркестрации контейнеров Docker под названием Kubernetes прочно вошла в инфраструктуру серьезных приложений. Именно с помощью нее можно максимально автоматизировать процесс развертывания и обновления приложений. Родившаяся в недрах компании Google, данная система управления стала де-факто стандартом по всему миру. Да есть и другие варианты менеджмента и создания кластера работающих контейнеров Docker. Но именно Kubernetes справляется с этой задачей лучше всего. Его многие сравнивают с системой виртуализации VMware и ее системой управления vCenter. То, что делает VMware для виртуализации операционных систем, делает Kubernetes для контейнеров Docker. Как запустить нужные контейнеры в кубере и сделать их доступными снаружи кластера попробую осветить в данной статье.

Ранее в своем блоге уже не раз затрагивал тематику работы с контейнерами Docker. В частности, в статьях — Используем Docker для python приложения, Docker-сompose на практике. Как Вы понимаете с контейнерами Docker можно работать напрямую через утилиту docker, или через дополнительные различные сторонние графические интерфейсы. Но также можно задействовать и тяжелую артиллерию, каковой в данном контексте является Kubernetes. Порог входа при этом для начала использования кубера довольно высокий. Нужно не просто знать и понимать, как работают контейнеры, но также и вникнуть во множество специфичных фишек кубера. Это и поды, и ReplicaSet, и различные виды балансировки нагрузки, и многое другое. Сейчас хотелось бы не заморачиваясь во все нюансы, показать как развернуть Docker контейнер в кубере.

Манипуляции с kubectl

Мы будем считать, что у нас уже есть готовый кластер Kubernetes. Для целей тестирования можно воспользоваться сервисом Google Cloud PlatformGKE. При этом развертывание платформы сводится к заполнению одной формы и нажатия кнопки для запуска визарда. В случае с физическими серверами придется поработать ручками в linux и утилитой kubeadm. Мы же перейдем сразу к вопросу создания нашего сервиса в контейнерной среде.

Для данного пример выберем запуск веб сервера nginx в конфигурации из 2 реплик. То есть, так называемый под, будет содержать по 1 контейнеру Docker с сервисом nginx. Таких подов мы для примера запустим 2. Вся конфигурация для работы сервисов в Kubernetes делается через yaml файлы. Это касается и запуска подов, приложений, а также различных дополнительных сервисов. Мы создадим новый файл kube_nginx.yaml в нашей рабочей директории. Содержание данного файла привожу ниже.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.15.9-alpine
        ports:
        - containerPort: 80
          protocol: TCP

Очень важный параметр, который определяет назначение данного конфигурационного файла — это kind. Здесь в данном конкретном примере мы будем использовать — Deployment. Это наиболее популярный способ развертывания приложения, который позволяет легко менять его параметры, а также количество подов в работе. Также возможно выбрать в качестве типа kind — Pod. По большому счету конфигурационный файл будет аналогичным, однако обслуживание в продакшен среде может усложниться.

Для запуска наших контейнеров выполняем команду kubectl apply. С помощью нее мы можем как запустить поды, сервисы и т.д. в первый раз, так и внести изменения в их работу.

$ kubectl apply -f ./kube_nginx.yaml

Буквально через небольшой промежуток времени можем смотреть результат ее выполнения с помощью команды kubectl get pods. Пример представлен ниже.

$ kubectl get pods
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-546bf458b5-2kqlz   1/1     Running   0          3m
nginx-deployment-546bf458b5-kbhql   1/1     Running   0          3m 

Как мы видим 2 пода развернуты и находятся в состоянии Running. Теперь создадим сервис, который будет заниматься организацией доступа снаружи к нашим контейнерам. В даном примере мы прокинем 80 TCP порт на внешний IP адрес. Вообще это можно сделать разными способами взависимости от типа Kubernetes кластера. В случае с GKE проще всего создать Service с типом LoadBalancer. Мы пишем следующий файл kube_loadbalancer.yaml, в котором описываем балансировку на наше приложение nginx с внешнего TCP/80 порта на внутренний TCP/80 порт.

apiVersion: v1
kind: Service
metadata:
  name: nginx-load-balancer
spec:
  type: LoadBalancer
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
      name: http

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

$ kubectl apply -f ./kube_loadbalancer.yaml

После небольшого промежутка времени можем проверить то, что наш сервис балансировки удачно запустился и работает, с помощью kubectl get service. По указанному EXTERNAL-IP в выводе сервиса LoadBalancer по TCP/80 порту можем удостовериться в работе нашего nginx сервиса.

$ kubectl get service
NAME                  TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
kubernetes            ClusterIP      10.12.0.1     <none>        443/TCP        5m
nginx-load-balancer   LoadBalancer   10.12.1.240   x.x.x.x    80:32267/TCP      5m

Напоследок хочется поделиться командой, с помощью которой можно удалить из кластера сервисы, приложения или поды, которые перестали быть нужны. Так, чтобы убрать запущенные в данной статье поды из кубера, мы должны выполнитью следующую команду kubectl delete.

$ kubectl delete -f ./kube_nginx.yaml

Заключение

Небольшая заметка о том, как запустить свои контейнеры в среде Kubernetes. Понимание как создавать yaml файлы, а также знакомство с работой утилиты kubectl позволит легко взаимодействовать с кластером Kubernetes. Создание самого кластера с помощью kubeadm, а также различные дополнительные фишки по автоматизации я попробую рассмотреть в других статьях блога. Благо тема оркестрации контейнеров богатая и очень востребованная.

Добавить комментарий

Ваш адрес email не будет опубликован.