Инструкция по использованию Kubernetes на платформе PS Cloud
1.1 Используемые термины
Pod — под, модуль — наименьшая вычислительная единица, доступная для создания и управления в Kubernetes. Pod представляет собой группу из одного или нескольких контейнеров с общими хранилищем, сетевыми ресурсами и спецификацией для запуска.
Node — нода, узел — виртуальная или физическая машина, содержащая службы, необходимые для оркестрации контейнеров. Обычно в кластере есть несколько узлов. На мастер-узле (master-node, также известном как Control Plane) выполняются основные задачи по управлению и администрированию кластера. Рабочие узлы (worker-node) отвечают за выполнение пользовательской нагрузки.
Кластер — совокупность master-node и worker-node. Кластер создается на основе шаблона кластера.
Шаблон кластера — набор параметров, с которыми будет создаваться кластер.
Механизм оркестровки контейнеров (COE) — оркестратор контейнеров. В нашем случае это kubernetes (еще есть docker swarm, apache mesos, hashicorp nomad).
Метки — общий метод указания дополнительных параметров, специфичных для определенных COE или связанных с определенными опциями. Формат меток представляет собой пару ключ/значение, и их значение интерпретируется драйверами кластера.
Драйвер кластера — это набор инструкций на python, шаблонов heat, скриптов, снимков и документов для конкретного COE в конкретном дистрибутиве.
1.2 Создание кластера Kubernetes в Консоли.
Шаг 0
- Зайдите в свой аккаунт: https://console.ps.kz/account
- Выберите услугу «Облачная платформа PS»
- Нажмите на название вашего проекта
- В главном меню слева выберите раздел «Кластеры Kubernetes»
- Нажмите на кнопку «Создать кластер»
Шаг 1 - Укажите в поле ввода название кластера (допустимы латинские буквы, цифры, дефис, нижнее подчеркивание и точка) и выберите из выпадающего списка регион размещения.
- Если вы предварительно создали необходимый шаблон, нажмите на переключатель «Использовать шаблон»
- Выберите версию Kubernetes (на данный момент доступна v1.23.8)
- Выберите тип системного диска — быстрый, универсальный или NVME.
- Обратите внимание, что при выборе диска NVME кластер будет создаваться на несколько минут дольше из-за копирования образов в NVME-хранилище.
- Выберите размер системного диска. Если вам необходимо расширить диск, нажмите на кнопку «Другой». Откроется боковое меню. В поле ввода укажите значение и нажмите на кнопку «Применить»
- Нажмите на кнопку «Продолжить»
Шаг 2 - Подберите необходимую конфигурацию master-node
- Если вы хотите создать несколько master-node, нажмите на переключатель «Включить балансировщик» и выберите ниже количество master-node.
- Обратите внимание, что для отказоустойчивости оптимально выбирать нечетное (1, 3, 5, 7) количество master-node. На практике принято конфигурировать 3 master-node для мелких кластеров, 5 — для больших (от 1000 worker-nodes). Чем больше количество master-nodes, тем выше задержки.
- Если вам необходимо увеличить количество master-nodes, нажмите на кнопку «Другое количество». Откроется боковое меню. В поле ввода укажите значение и нажмите на кнопку «Применить»
- По умолчанию мы рекомендуем нажать на переключатель «Включить плавающий IP для Kubernetes API», иначе ваш кластер будет доступен только во внутренней сети вашего облачного проекта.
- Нажмите на кнопку «Продолжить»
Шаг 3 - Подберите необходимую конфигурацию worker-node
- Выберите количество worker-node. Если вам необходимо увеличить количество worker-nodes, нажмите на кнопку «Другое количество». Откроется боковое меню. В поле ввода укажите значение и нажмите на кнопку «Применить»
- Выберите тип диска для раздела Docker — быстрый или NVME-диск.
- Выберите размер диска для Docker. Если вам необходимо расширить диск, нажмите на кнопку «Другой размер». Откроется боковое меню. В поле ввода укажите значение и нажмите на кнопку «Применить»
- Нажмите на кнопку «Продолжить»
Шаг 4 - Подключите кластер к сети.
- Вы можете не создавать сеть и не выбирать ни одну из сетей, и тогда при создании кластера появится новая сеть, подключенная к новому маршрутизатору.
- Нажмите на кнопку «Добавить сеть». Откроется боковое меню. Если вы предварительно создали сеть, выберите ее по названию из списка.
- Обратите внимание, что при создании новой сети вам понадобится также создать новый маршрутизатор.
- Для создания новой сети нажмите на кнопку «Создать сеть». Откроется боковое меню
- Введите в соответствующее поле название сети
- Введите в поле «Подсеть» адрес подсети в формате CIDR
- Введите через запятую в поле «Пул адресов» диапазон IP-адресов для пользователей
- Введите через запятую в поле «Серверы DNS» адреса серверов DNS
- Введите через запятую в поле «Маршруты» правила маршрутизации адресов из одной подсети в другую
- По необходимости нажмите на переключатель «Включить DHCP» для автоматического получения IP-адресов и других параметров, необходимых для работы в сети TCP/IP
- Нажмите на кнопку «Создать»
- Для расширенной настройки сети нажмите на кнопку «DNS». Вы можете использовать DNS-серверы по умолчанию, для этого нажмите на соответствующую кнопку.
- Вы можете не создавать новый DNS-сервер и не выбирать значение по умолчанию, тогда вашей сети будет присвоен DNS-сервер от Google: 8.8.8.8.
- По необходимости нажмите на кнопку «Добавить новый DNS-сервер» и в поле ввода укажите через запятую IP-адреса DNS-сервера
- Нажмите на кнопку «Добавить сервер»
- Выберите сетевой драйвер — Calico или Flannel.
- Flannel обеспечивает полную сетевую связность между всеми nodes кластера с помощью поднятия мостов на каждом node, но не умеет конфигурировать сетевые политики. Calico позволяет настраивать и применять политики к отдельным pods, контейнерам, nodes, портам, протоколам, подсетям и т.д.
- Если вы предварительно создали SSH-ключ выберите его по названию из списка. По необходимости вы можете создать новый SSH-ключ. Нажмите на кнопку «Добавить SSH-ключ». Откроется боковое меню.
- Вы можете загрузить свой SSH-ключ. Нажмите на кнопку «Импортировать»
- Введите в соответствующее поле имя SSH-ключа
- Введите в поле «Публичный ключ» значение публичной части SSH-ключа
- Нажмите на кнопку «Импортировать»
- Также вы можете сгенерировать новый SSH-ключ. Нажмите на кнопку «Сгенерировать»
- Введите в соответствующее поле имя SSH-ключа
- Нажмите на кнопку «Сгенерировать». Приватная часть SSH-ключа загрузится автоматически на ваш компьютер.
- Нажмите на кнопку «Продолжить»
Шаг 5 - Настройте дополнительные параметры кластера.
- Нажмите на кнопку настроек справа от надписи «Включить автохилер». Выберите из списка необходимый вариант.
- Это решение выполняет периодические проверки работоспособности nodes Kubernetes, поиск неработоспособных экземпляров и запуск замен при необходимости.
- Нажмите на кнопку «Сохранить»
- Нажмите на кнопку настроек справа от надписи «Тип автохилера». Выберите из списка необходимый вариант.
- Magnum-auto-healer — это служба самовосстановления кластеров, которая автоматически восстанавливает неисправный главный или worker-node в кластере Magnum. Draino автоматически опустошает worker-node Kubernetes на основе меток и условий nodes. Draino предназначен для использования вместе с детектором проблем nodes Kubernetes и автоскейлером кластера. Детектор обнаруживает проблемы, Draino перемещает все pods из node, автоскейлер уничтожает пустой node.
- Нажмите на кнопку «Сохранить»
- Нажмите на кнопку настроек справа от надписи «Тип системного диска». Выберите из списка необходимый вариант. Нажмите на кнопку «Сохранить»
- Нажмите на кнопку настроек справа от надписи «Тип ингресс-контроллера». Выберите из списка необходимый вариант.
- Ingress — объект API, управляющий внешним доступом к службам в кластере — обычно HTTP. Ingress может обеспечить балансировку нагрузки и маршрутизацию на основе имен. Результат работы Ingress-контроллера — сборка файла конфигурации. Если вы выбрали тип «traefik», то после создания кластера необходимо добавить метку role=ingress на nodes, где должен работать контроллер.
- Нажмите на кнопку «Сохранить»
- Нажмите на кнопку настроек справа от надписи «Включить auto-scale». Выберите из списка необходимый вариант.
- Autoscale автоматически масштабирует рабочую нагрузку, увеличивая и уменьшая количество worker-nodes.
- Нажмите на кнопку «Сохранить»
- Нажмите на кнопку настроек справа от надписи «Минимальное количество worker-nodes». Выберите из списка необходимый вариант.
- Если создать кластер на несколько worker-nodes со включенным автоскейлером, то при отсутствии нагрузки автоскейлер сократит количество worker-nodes до минимума.
- Нажмите на кнопку «Сохранить»
- Нажмите на кнопку настроек справа от надписи «Максимальное количество worker-nodes». Выберите из списка необходимый вариант. Нажмите на кнопку «Сохранить»
- Для добавления прочих параметров, не предусмотренных в интерфейсе, нажмите на кнопку «Добавить расширенные параметры» и введите через запятую параметры в форме: ключ=значение,ключ2=значение2. Нажмите на кнопку «Добавить»
- Нажмите на кнопку «Продолжить»
- Проверьте настройки кластера — по необходимости вернитесь для редактирования, нажав на кнопку «Назад».
- Нажмите на кнопку «Создать кластер». Вместе с кластером автоматически создается одноименный шаблон.
Шаблоны кластеров создаются аналогичным образом во вкладке «Шаблоны кластера».
Действия с шаблоном кластера:
- Перейдите во вкладку «Шаблоны кластера» и нажмите на название шаблона. На этой странице вы можете просмотреть параметры шаблона — по умолчанию и расширенные. Во вкладке «Подключенные кластеры» вы можете просмотреть список всех кластеров, созданных по выбранному шаблону
- Нажмите на три точки справа от названия шаблона кластера. Откроется боковое меню.
- Для создания кластера по шаблону нажмите на кнопку «Создать кластер на основе шаблона». При создании введите название нового кластера. Вы можете изменить количество master-nodes и worker-nodes, все остальные параметры будут соответствовать созданному шаблону.
- Вы можете создать копию шаблона. При создании копии можно изменить все параметры, перечисленные выше, в разделе «Создание кластера»
1.3 Создание кластера Kubernetes в Terraform
Для создания кластера необходимо создать в Terraform два ресурса: шаблон и кластер по этому шаблону. Параметры, которые можно применить к шаблону, перечислены здесь, и аналогичны возможностям openstack-cli и разделу «Добавить расширенные параметры» в Консоли PS.
Инструкция по созданию или импортированию шаблона кластера, список допустимых аргументов и атрибутов описаны тут.
Инструкция по созданию или импортированию кластера список допустимых аргументов и атрибутов описаны тут.
Инструкция по созданию или импортированию группы nodes, список допустимых аргументов и атрибутов описаны тут.
Ознакомьтесь со списком версий компонентов, поддерживаемых нашим облаком. Обратите внимание, что не все версии совместимы друг с другом. Матрицу совместимостей версий вы можете посмотреть в документации каждого конкретного компонента.
Обратите внимание на метки container_infra_prefix и hyperkube_prefix — они позволяют вам использовать пользовательские префиксы для скачивания и установки компонентов кластера из пользовательских источников (например, из вашего собственного реестра контейнеров). Если вы хотите использовать версии 1.19.x и выше, используйте неофициальные источники, такие как https://www.docker.io/rancher/, https://www.ghcr.io/openstackmagnum/ или наш registry. Если метка container_infra_prefix определена, то она имеет приоритет над меткой hyperkube_prefix.
Обратите внимание, что действующая версия Magnum Xena поддерживает версии kube_tag не выше v1.23.3. в связи с устареванием dockershim и удалением его из версии 1.24, а также изменением политик управления ресурсами. При необходимости вы можете заменить какой-либо компонент в уже существующем кластере, или же полагайтесь на протестированные нами версии, указанные в Консоли.
Рабочий пример представлен ниже:
resource "openstack_containerinfra_clustertemplate_v1" "simple_k8s" {
name = "simple_k8s"
image = "Fedora-Coreos-31-20200323"
coe = "kubernetes"
flavor = "d1.ram8cpu4"
master_flavor = "d1.ram8cpu4"
dns_nameserver = "195.210.46.195"
docker_storage_driver = "overlay2"
docker_volume_size = 100
volume_driver = "cinder"
network_driver = "calico"
server_type = "vm"
master_lb_enabled = true
floating_ip_enabled = false
apiserver_port = 6443
cluster_distro = "fedora-coreos"
external_network_id = "83554642-6df5-4c7a-bf55-21bc74496109"
keypair_id = ""
labels = {
boot_volume_size = 30
boot_volume_type = "ceph-ssd"
docker_volume_type = "ceph-ssd"
container_infra_prefix = "registry.pscloud.io/pscloudmagnum/"
hyperkube_prefix = "registry.pscloud.io/pscloudmagnum/"
kube_version = "v1.23.8"
kube_tag = "v1.23.8"
kube_dashboard_enabled = "true"
coredns_tag = "1.9.3"
etcd_tag = "v3.5.4"
cinder_csi_plugin_tag = "v1.23.4"
csi_attacher_tag = "v3.1.0"
csi_provisioner_tag = "v2.1.2"
csi_snapshotter_tag = "v4.0.0"
csi_resizer_tag = "v1.1.0"
csi_node_driver_registrar_tag = "v2.1.0"
k8s_keystone_auth_tag = "v1.23.0"
autoscaler_tag = "v1.22.0"
ingress_controller = "nginx"
helm_client_url = "https://get.helm.sh/helm-v3.3.0-linux-amd64.tar.gz"
helm_client_sha256 = "ff4ac230b73a15d66770a65a037b07e08ccbce6833fbd03a5b84f06464efea45"
helm_client_tag = "v3.3.0"
container_runtime = "containerd"
containerd_version = "1.5.3"
containerd_tarball_sha256 = "32a9bf1b7ab2adbd9d2a16b17bf1aa6e61592938655adfb5114c40d527aa9be7"
auto_healing_enabled = "true"
auto_healing_controller = "draino"
npd_enabled = "true"
auto_scaling_enabled = "true"
cgroup_driver = "systemd"
master_lb_enabled = "true"
master_lb_floating_ip_enabled = "true"
}
}
resource "openstack_containerinfra_cluster_v1" "terraform_cluster_1" {
name = "terraform_cluster_1"
cluster_template_id = openstack_containerinfra_clustertemplate_v1.simple_k8s.id
master_count = 3
node_count = 5
keypair = ""
}