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 Platform — GKE. При этом развертывание платформы сводится к заполнению одной формы и нажатия кнопки для запуска визарда. В случае с физическими серверами придется поработать ручками в linux и утилитой kubeadm. Мы же перейдем сразу к вопросу создания нашего сервиса в контейнерной среде.
Для данного пример выберем запуск веб сервера nginx в конфигурации из 2 реплик. То есть, так называемый под, будет содержать по 1 контейнеру Docker с сервисом nginx. Таких подов мы для примера запустим 2. Вся конфигурация для работы сервисов в Kubernetes делается через yaml файлы. Это касается и запуска подов, приложений, а также различных дополнительных сервисов. Мы создадим новый файл kube_nginx.yaml в нашей рабочей директории. Содержание данного файла привожу ниже.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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 порт.
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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, а также различные дополнительные фишки по автоматизации я попробую рассмотреть в других статьях блога. Благо тема оркестрации контейнеров богатая и очень востребованная.