Kubernetes это система оркестрации и управления контейнеризованными приложениями в кластере из физических или виртуальных серверов.
Кластер Kubernetes состоит из одной или нескольких управляющих узлов (control plane) и узлов-исполнителей.
На управляющем узле запущен API-сервер, предоставляющий доступ ко всем ресурсам кластера, etcd - база данных, хранящая текущее состояние ресурсов и controller-manager, который выполняет задачи по созданию новых ресурсов на основе имеющихся, например Подов (Pod) на основе Deployment. API сервер является основной точкой входа в кластер, именно к нему обращаются как утилита управления кластером kubectl, так и рабочие узлы.
Кроме этого можно устанавливать дополнительные контроллеры, которые добавляют поддержку новых типов манифестов и позволяют управлять другими ресурсами, например сертификатами, базами данных, бакетами S3 и т.п., превращая Kubernetes из средства оркестрации контейнеров в систему управления инфраструктурой.
Рабочими узлами узлами являются все остальные узлы, на которых не запущены сервисы управления. Именно на этих узлах запускаются поды. На каждом узле запускается два компонента kubernetes - kubelet, который отвечает за создание подов и контейнеров, назначенных на этот узел и kube-proxy, который отвечает за настройку сети и создание соединений между подами с помощью модификации правил маршрутизации и файервола.
Управление кластером осуществляется с помощью утилиты kubectl
и заключается в создании и изменении ресурсов кластера, которые описываются в специальном формате манифестов. Пример манифеста, создающего под:
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
Создание некоторых ресурсов (например Deployment и ReplicaSet), может приводит к тому, что на их основе будут созданы дочерние ресурсы. Кратко рассмотрим некоторые виды ресурсов:
Ingress - представляет собой обратный прокси, который позволяет предоставить доступ к сервисам, находящимся в кластере, снаружи кластера по протокалам HTTP и HTTPS.'
Для облегчения управления кластером, а также для автоматизации процесса администрирования используются дополнительные инструменты. Приведем здесь те, которые используются в рамках данного проекта:
Kustomize позволяет определять группу ресурсов полученных из разных источников (например удаленный URL-адрес или файлы в текущей папке) и применять к ним изменения с помощью патчей. Например, можно подключить набор манифестов от разработчика какого-то сервиса и внести изменение в Deployment, увеличив количество реплик и таким образом осуществить необходимое масштабирование. Подробнее см. официальную доументацию
Helm представляет собой "пакетный менеджер" для Kubernetes. Он позволяет описывать шаблоны манифестов, в которые при применении подставятся соответствующие параметры. Таким образом можно создавать переиспользуемые пакеты, называемые чартами. Подробнее см. официальную доументацию
Flux представляет собой инструмент, позволяющий применить подход IaC к Kubernetes. Он осуществляет автоматическую синхронизацию ресурсов из системы контроля версий (например GitLab и GitHub). Кроме этого он позволяет более удобным способом осуществлять управление Kustomize и Helm путем добавления новых видов манифестов. Таким образом, например для установки helm-чарта администратору не нужно делать это вручную из командной строки, достаточно создать в кластере манифест типа HelmRelease и Flux автоматически выполнит установку чарта с параметрами, заданными в этом манифесте, а затем будет автоматически получать новые версии чарта из репозитория.
В проекте используются два Kubernetes-кластера: