В данной статье приводятся общие принципы настройки кластера Kubernetes. Затронуто создание развёртывания (deployment), сервиса (service) и постоянного тома (persistent volume). В конце статьи приведена ссылка на исходный код конфигурации кластера Kubernetes с некоторыми часто используемыми сервисами.
Ключевые слова: виртуализация, контейнеризация, микросервисы, микросервисная архитектура оркестрация контейнеров, kubernetes, docker.
Введение.
Контейнеризация позволяет не затрачивать много ресурсов на запуск множества приложений, которые требуют различного окружения [1].
С ростом потребностей компании и увеличением количества предоставляемых услуг может усложняться система, которые обеспечивает эти потребности / предоставляет услуги.
В частности, может расти количество микросерисов (добавление на сайт умного калькулятора, появление мобильного приложения, которое должно работать с теми же базами данных, появляются дополнительные интерактивные разделы сайта, необходимость сбора большей аналитики о поведении пользователей, желание собирать информацию о состоянии самой системы, которая всё это обеспечивает и так далее). Увеличение количества микросервисов увеличивает количество различных контейнеров, в которых работают эти микросервисы, а также усложняет взаимосвязи между этими контейнерами. Нескольких команд для запуска контейнера становится недостаточно, чтобы управлять такой системой.
Для решения этой проблемы были придуманы так называемые системы оркестрации контейнеров — системы, способные самостоятельно управлять жизненным циклом контейнеров, распределять нагрузку между несколькими контейнерами, собирать и выводить информацию о системе в целом.
В статье будет рассмотрена запуск и настройка основных элементов очень популярного на сегодняшний день [2] оркестратора контейнеров kubernetes. В конце статьи будет дана ссылка на реальную реализацию нескольких сервисов (nginx, WordPress, phpMyAdmin, MySQL, Grafana, InfluxDB и ftps server) в одном кластере.
Перед началом
Для запуска kubernetes на локальной машине необходимо следующее программное обеспечение:
Docker — ПО для создания контейнеров [1], [3].
Minikube — инструмент для создания кластера (среды, в которой будут работать наши контейнеры) на локальном компьютере [4].
Kubectl — инструмент командной строки для управления кластером, с его помощью можно управлять ресурсами кластера, развёртывать (deploy) приложения и смотреть логи [5]. Название можно читать как kube control.
VirtualBox — ПО для виртуализации кластера на локальной машине [ссылка на скачивание ВБ].
Очевидно, что для создания кластера, управляющего контейнерами необходимо иметь образы этих контейнеров. Пример сборки контейнера с помощью docker можно найти тут [1], или тут [6].
Запуск кластера
Кластер создается и запускается очень просто:
minikube start --vm-driver=virtualbox
Здесь мы конкретно указываем, какую виртуальную машину мы используем для виртуализации кластера. Если опустить этот флаг, то по умолчанию виртуальной машиной будет docker. Это не плохо, однако, в этом случае дополнительно придется настраивать взаимодействие виртуальной машины докера с основной ОС. Для VirtualBox’a это делать не нужно.
Создание развёртывания
Кластер kubernetes оперирует подами (pod) — группой из одного или нескольких контейнеров. Развёртывание (deployment) — сущность, которая управляет жизненным циклом одного или нескольких подов.
Создание развёртывания:
kubectl create deployment node --image=image_name
Здесь image_name — имя контейнера, который мы хотим развернуть, node — имя развёртывания.
После создания развертывания внутри кластера появится под, который представляет наш контейнер. К этому поду нельзя подключиться «из вне», у него есть только внутренний IP адрес, доступный изнутри кластера. Для получения доступа к поду необходимо создать сервис (service).
Создание сервиса
Мы можем создать сервис прямо для нашего развёртывания:
kubectl expose deployment node --type=LoadBalancer --port=8080
—-type=LoadBalancer необходимо для того, чтобы кластер понимал, что к данному развертыванию (нашему поду) можно подключиться из вне. --port=8080 явно указывает порт, через который это можно сделать.
Для получения краткой информации о только что созданном сервисе можно воспользоваться командой:
kubectl get services
Использование конфигурационных файлов
В общем случае флагов настройки сервиса и развёртывания может быть очень много и может быть неудобно писать длинные команды чтобы сконфигурировать кластер. Для упрощения этой задачи используются конфигурационные файлы. Файлы используют синтаксис yaml и имеют соответствующее расширение.
Пример конфигурационного файла, который создаёт развёртывание и сервис аналогичные показанным выше, приведен ниже.
apiVersion: apps/v1
kind: Deployment
metadata:
name: node
spec:
template:
spec:
containers:
— name: node
image: image_name
ports:
— containerPort: 8080
—--
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
type: LoadBalancer
ports:
— port: 8080
Создание постоянного тома
Данные, которые хранятся в контейнере являются эфемерными. После смерти контейнера все хранящиеся на нём данные удаляются. Чтобы была возможность постоянно (независимо от жизненного цикла подов) хранить какие-либо данные, необходимо создать внутри кластера «хранилище» данных, так называемый постоянный том (persistent volume). Вообще говоря, типов «хранилищ» в kubernetes несколько [7], но для создания его на локальном компьютере подойдет persistent volume.
Пример конфигурационного файла persistent volume для mysql:
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-pv
labels:
type: local
spec:
storageClassName: mysql
capacity:
storage: 1Gi
accessModes:
— ReadWriteOnce
hostPath:
path: "/tmp/mysql»
Для использования постоянного тома при создании развертывания необходимо указать, что конкретный контейнер хранит свои данные в конкретном постоянном томе.
Заключение
Конкретные примеры создания и настройки сервисов: nginx, WordPress, phpMyAdmin, MySQL, Grafana, InfluxDB и ftps server, — можно посмотреть в github репозитории автора [https://github.com/vesord/ft_services]. Там же можно посмотреть скриншоты того, как выглядит панель управления кластером (запускается командой minikube dashboard).
Дополнительную информацию о kubernetes или о работе с minikube можно найти на официальном сайте www.kubernetes.io.
Литература:
- Евстратов В., Контейнеризация как современный способ виртуализации / В. В. Евстратов // Молодой учёный № 49 (339) декабрь 2020.
- Почему Kubernetes стал настолько популярен — Текст: электронный // Тараненко П. // URL: https://vc.ru/dev/107126-pochemu-kubernetes-stal-nastolko-populyaren (дата обращения 12.12.2020)
- Get Started with Docker. — Текст: электронный // Официальный сайт Docker — URL: https://www.docker.com/get-started (дата обращения 12.12.2020)
- Minikube start. — Текст: электронный // Официальный сайт minikube. — URL: https://minikube.sigs.k8s.io/docs/start/ (дата обращения 13.12.2020)
- Install and Set Up Kubectl. — Текст: электронный // Официальный сайт Kubernetes. — URL: https://kubernetes.io/docs/tasks/tools/install-kubectl/ (дата обращения 13.12.2020)
- Изучаем Docker. — Текст: электронный // Хабр. — URL: https://habr.com/ru/company/ruvds/blog/438796/ (дата обращения 13.12.2020)
- Volumes. — Текст: электронный // Официальный сайт Kubernetes. — URL: https://kubernetes.io/docs/concepts/storage/volumes/ (дата обращения 14.12.2020)