ELMA365 On-Premises > Подготовка инфраструктуры > Kubernetes / Kubernetes-кластер

Kubernetes-кластер

Для работы ELMA365 требуется установленный рабочий Kubernetes-кластер. Мы рекомендуем платформу Deckhouse на базе Open Source-компонентов. Эта платформа, кроме Kubernetes, включает дополнительные модули для мониторинга, балансировки трафика, автомасштабирования, безопасного доступа и не только. Модули преднастроены, интегрированы друг с другом и готовы к работе. Управление всеми компонентами кластера и платформы, а также их обновление полностью автоматизированы.

Deckhouse в реестре российского ПО и сертифицирован в CNCF.

В рамках статьи разворачивается Kubernetes-кластер, который состоит из единственного master-узла.

Установка состоит из пяти этапов:

  1. Подготовка инфраструктуры.
  2. Подготовка конфигурационного файла.
  3. Установка Kubernetes-кластера на базе Deckhouse.
  4. Настройка Deckhouse.
  5. Установка HELM.

Шаг 1: Подготовка инфраструктуры

Чтобы развернуть Kubernetes-кластер на базе платформы Deckhouse, вам потребуются:

  1. Персональный компьютер.

Компьютер, с которого будет производиться установка. Он нужен только для запуска инсталлятора Deckhouse и не будет частью кластера.

Системные требования:

  • ОС: Windows 10+, macOS 10.15+, Linux (Ubuntu 18.04+, Fedora 35+);
  • установленный docker для запуска инсталлятора Deckhouse;
  • доступ до проксирующего registry или до частного хранилища образов контейнеров с образами контейнеров Deckhouse;
  • SSH-доступ по ключу до узла, который будет master-узлом будущего кластера.
  1. Master-узел.

Сервер (физический сервер или виртуальная машина), который будет управляющим узлом (master-узлом) будущего кластера.

В процессе установки инсталлятор Deckhouse, запущенный на персональном компьютере, подключится к master-узлу по SSH, установит необходимые пакеты, настроит control plane Kubernetes и развернёт Deckhouse.

Системные требования:

  • не менее 12 ядер CPU;
  • не менее 16 ГБ RAM;
  • не менее 200 ГБ дискового пространства;
  • поддерживаемая ОС;
  • доступ до проксирующего registry или до частного хранилища образов контейнеров с образами контейнеров Deckhouse;

Начало внимание

Deckhouse поддерживает работу только с Bearer token схемой авторизации в registry.

Конец внимание

  • доступ до прокси-сервера для скачивания deb/rpm-пакетов ОС (при необходимости);
  • SSH-доступ от персонального компьютера по ключу;
  • на узле не должно быть установлено пакетов container runtime, например, containerd или docker.

Начало внимание

Установка непосредственно с master-узла в настоящий момент не поддерживается. Установщик в виде Docker-образа нельзя запускать на том же узле, на котором планируется развёртывание master-узла, так как на узле не должно быть установлено пакетов container runtime, например, containerd или docker. При отсутствии менеджмент узлов, установите docker на любой другой ноде будущего кластера, запустите Docker-образ установщика, установите Deckhouse и удалите Docker-образ установщика c ноды вместе с docker.

Конец внимание

  1. Загрузка образов Deckhouse в локальный реестр образов.

Кластер Kubernetes с помощью Deckhouse можно развернуть в закрытом окружении, из которого нет доступа в интернет. Для этого предварительно скачайте на компьютере с доступом в интернет образы платформы Deckhouse и загрузите их в локальный реестр образов. Подробнее об этом читайте в статье «Загрузка образов Deckhouse».

Шаг 2: Подготовка конфигурационного файла

Чтобы установить Deckhouse, подготовьте YAML-файл конфигурации установки. Для получения YAML-файла конфигурации воспользуйтесь сервисом Быстрый старт на сайте Deckhouse. Сервис сгенерирует актуальный YAML-файл для текущей версий платформы.

  1. Сгенерируйте YAML-файла сервисом Быстрый старт, выполнив следующие шаги:
  1. Выберите инфраструктуру — Bare Metal.
  2. Ознакомтесь с информацией об установке.
  3. Укажите шаблон для DNS-имен кластера. В нашем случае — %s.example.com.
  4. Сохраните config.yml.
  1. Внесите необходимые изменения в config.yml. Для этого выполните следующие действия:
  1. Задайте адресное пространство Pod’ов кластера в podSubnetCIDR.
  2. Задайте адресное пространство Service’ов кластера в serviceSubnetCIDR.
  3. Задайте нужную версию Kubernetes в kubernetesVersion.
  4. Проверьте канал обновления в releaseChannel (Stable).
  5. Проверьте шаблон доменного имени в publicDomainTemplate (%s.example.com).
    Используется для формирования доменов системных приложений в кластере. Например, Grafana для шаблона %s.example.com будет доступна, как grafana.example.com.
  6. Проверьте режим работы модуля cni-flannel в podNetworkMode.
    Режим работы flannel, допустимые значения VXLAN (если ваши сервера имеют связность L3) или HostGW (для L2-сетей).
  7. Укажите локальную сеть, которую будут использовать узлы кластера в internalNetworkCIDRs.
    Список внутренних сетей узлов кластера, например, '192.168.1.0/24', который используется для связи компонентов Kubernetes (kube-apiserver, kubelet и т. д.) между собой.

Пример файла первичной конфигурации кластера — config.yml.

Для установки через интернет:

apiVersion: deckhouse.io/v1
kind: ClusterConfiguration
clusterType: Static
podSubnetCIDR: 10.111.0.0/16
serviceSubnetCIDR: 10.222.0.0/16
kubernetesVersion: "1.23"
clusterDomain: "cluster.local"
---
apiVersion: deckhouse.io/v1
kind: InitConfiguration
deckhouse:
  releaseChannel: Stable
  configOverrides:
    global:
      modules:
        publicDomainTemplate: "%s.example.com"
    cniFlannelEnabled: true
    cniFlannel:
      podNetworkMode: VXLAN
---
apiVersion: deckhouse.io/v1
kind: StaticClusterConfiguration
internalNetworkCIDRs:
  - 192.168.1.0/24

Для офлайн-установки без доступа в интернет:

Шаг 3: Установка Kubernetes-кластера на базе Deckhouse

Установка Deckhouse Platform Community Edition сводится к установке кластера (установщиком на базе Docker-образа), который состоит из единственного master-узла. Инсталлятор Deckhouse доступен в виде образа контейнера, в который необходимо передать конфигурационные файлы и SSH-ключи доступа на master-узел. Далее подразумевается, что используется SSH-ключ ~/.ssh/id_rsa. В основе инсталлятора лежит утилита dhctl.

  1. Запустите установщик.

Начало внимание

Установка непосредственно с master-узла в настоящий момент не поддерживается. Установщик в виде Docker-образа нельзя запускать на том же узле, на котором планируется развёртывание master-узла, так как на узле не должно быть установлено пакетов container runtime, например, containerd или docker.

Конец внимание

Установщик запускается на персональном компьютере, подготовленном на этапе подготовка инфраструктуры. На ПК перейдите в директорию с файлом конфигурации config.yml, подготовленным на этапе подготовка конфигурационного файла.

Для запуска установщика через интернет:

sudo docker run --pull=always -it -v "$PWD/config.yml:/config.yml" -v "$HOME/.ssh/:/tmp/.ssh/" registry.deckhouse.io/deckhouse/ce/install:stable bash

Для офлайн-установки без доступа в интернет:

  1. Установите Deckhouse. Для этого внутри контейнера установщика выполните команду:

dhctl bootstrap --ssh-user=<username> --ssh-host=<master_ip> --ssh-agent-private-keys=/tmp/.ssh/id_rsa \
--config=/config.yml \
--ask-become-pass

где:

  • <username> — В параметре --ssh-user укажите имя пользователя, от которого генерировался SSH-ключ для установки;
  • <master_ip> — IP адрес master-узла подготовленного на этапе подготовка инфраструктуры.

Процесс установки может занять 15-30 минут при хорошем соединении.

Шаг 4: Настройка Deckhouse

Подключитесь по SSH на master-узел, подготовленный на этапе подготовка инфраструктуры. Для этого выполните следующие шаги:

  1. Снимите с master-узла ограничения taint.

В рамках статьи Kubernetes-кластер на базе Deckhouse состоит из одного узла. Разрешите компонентам Deckhouse работать на master-узле. Для этого выполните следующую команду:

kubectl patch nodegroup master --type json -p '[{"op": "remove", "path": "/spec/nodeTemplate/taints"}]'

  1. Увеличьте количества Pod'ов на master-ноде.

Увеличьте максимальное количество Pod’ов на узлах NodeGroup master, выполнив следующую команду:

kubectl patch nodegroup master --type=merge -p '{"spec":{"kubelet":{"maxPods":200}}}'

  1. Добавьте Local Path Provisioner.

По умолчанию storageclass отсутствует в Deckhouse. Создайте custom resource LocalPathProvisioner, позволяющий пользователям Kubernetes использовать локальное хранилище на узлах. Для этого выполните следующие действия:

  1. Создадайте на master-узле файл local-path-provisioner.yaml, содержащий конфигурацию для LocalPathProvisioner.
  1. Установите нужную Reclaim policy (по умолчанию устанавливается Retain). В рамках статьи для параметра reclaimPolicy установлено "Delete" (PV после удаления PVC удаляются).

Пример файла local-path-provisioner.yaml:

apiVersion: deckhouse.io/v1alpha1
kind: LocalPathProvisioner
metadata:
  name: localpath-deckhouse-system
spec:
  nodeGroups:
  - master
  path: "/opt/local-path-provisioner"
  reclaimPolicy: "Delete"

  1. Примените файл local-path-provisioner.yaml в Kubernetes. Для этого выполните команду:

kubectl apply -f local-path-provisioner.yaml

  1. Установите созданный LocalPathProvisioner, как storageclass по умолчанию (default-class), выполнив команду:

kubectl patch storageclass localpath-deckhouse-system -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'

  1. Добавьте Ingress Nginx Controller.

Deckhouse устанавливает и управляет NGINX Ingress Controller при помощи Custom Resources. Если узлов для размещения Ingress-контроллера больше одного, он устанавливается в отказоустойчивом режиме и учитывает все особенности реализации инфраструктуры облаков и bare metal, а также кластеров Kubernetes различных типов.

  1. Создайте на ноде master-узла файл ingress-nginx-controller.yml, содержащий конфигурацию Ingress-контроллера. Для этого выполните следующую команду:

# секция, описывающая параметры nginx ingress controller
# используемая версия API Deckhouse
apiVersion: deckhouse.io/v1
kind: IngressNginxController
metadata:
  name: nginx
spec:
  # имя Ingress-класса для обслуживания Ingress NGINX controller
  ingressClass: nginx
  # версия Ingress-контроллера (используйте версию 1.1 с Kubernetes 1.23+)
  controllerVersion: "1.1"
  # способ поступления трафика из внешнего мира
  inlet: HostPort
  hostPort:
    httpPort: 80
    httpsPort: 443
  # описывает, на каких узлах будет находиться компонент
  # возможно, захотите изменить
  nodeSelector:
    node-role.kubernetes.io/control-plane: ""
  tolerations:
  - operator: Exists

  1. Примените файл ingress-nginx-controller.yml в Kubernetes, выполнив команду:

kubectl create -f ingress-nginx-controller.yml

  1. Добавьте пользователя для доступа к веб-интерфейсу кластера.
  1. Добавьте на master-узле файл user.yml, содержащий описание учётной записи пользователя и прав доступа:

apiVersion: deckhouse.io/v1
kind: ClusterAuthorizationRule
metadata:
  name: admin
spec:
  # список учётных записей Kubernetes RBAC
  subjects:
  - kind: User
    name: admin@deckhouse.io
  # предустановленный шаблон уровня доступа
  accessLevel: SuperAdmin
  # разрешить пользователю делать kubectl port-forward
  portForwarding: true
---
# секция, описывающая параметры статического пользователя
# используемая версия API Deckhouse
apiVersion: deckhouse.io/v1
kind: User
metadata:
  name: admin
spec:
  # e-mail пользователя
  email: admin@deckhouse.io
  # это хэш пароля xgnv5gkggd, сгенерированного сейчас
  # сгенерируйте свой или используйте этот, но только для тестирования
  # echo "xgnv5gkggd" | htpasswd -BinC 10 "" | cut -d: -f2
  # возможно, захотите изменить
  password: '$2a$10$4j4cUeyonCfX7aDJyqSHXuAxycsf/sDK0T4n9ySQ7.owE34L1uXTm'

  1. Примените файл user.yml, выполнив на master-узле следующую команду:

kubectl create -f user.yml

Шаг 5: Установка HELM

  1. Перейдите на страницу релизов Helm и скачайте архив helm-vX.Y.Z-linux-amd64.tar.gz необходимой версии.

Для установки через интернет:

wget https://get.helm.sh/helm-vX.Y.Z-linux-amd64.tar.gz

Для офлайн-установки без доступа в интернет:

  1. Распакуйте архив и переместите бинарный файл helm:

tar -zxvf helm-vX.Y.Z-linux-amd64.tar.gz
mv linux-amd64/helm /usr/local/bin/helm