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 в нашей рабочей директории. Содержание данного файла привожу ниже.
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, а также различные дополнительные фишки по автоматизации я попробую рассмотреть в других статьях блога. Благо тема оркестрации контейнеров богатая и очень востребованная.