logo

Урок 2 из 6

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

Далее необходимо выбрать версию Deckhouse (мы будем устанавливать Community Edition) и сформировать файлы config.yml и resources.yml.

icon

Файл resources.yml необязателен, однако мы всё же создадим его для удобства: сразу укажем в нём узлы, которые нужно добавить в кластер, и ресурсы для работы веб-интерфейсов.

Подготовка config.yml

Файл config.yml состоит из трёх частей (ресурсов): ClusterConfiguration, InitConfiguration и YandexClusterConfiguration.

ClusterConfiguration

В ресурсе ClusterConfiguration содержатся базовые параметры кластера.

# https://deckhouse.ru/documentation/v1/installing/configuration.html#clusterconfiguration
apiVersion: deckhouse.io/v1
kind: ClusterConfiguration
clusterType: Cloud
cloud:
  provider: Yandex
  # Префикс объектов, создаваемых в облаке при установке.
  # Возможно, захотите изменить.
  prefix: cloud-demo
# Адресное пространство подов кластера.
podSubnetCIDR: 10.111.0.0/16
# Адресное пространство для service’ов кластера.
serviceSubnetCIDR: 10.222.0.0/16
kubernetesVersion: "Automatic"
clusterDomain: "cluster.local"
  • clusterType: Cloud. Для этого типа кластера необходимо указать провайдера и префикс. Провайдер в нашем примере — Yandex. Префикс можно выбрать любой: он будет добавляться к именам всех ресурсов, которые создаются в облаке. Префикс в нашем примере — cloud-demo.
  • podSubnetCIDR, serviceSubnetCIDR. Адресные пространства подов и service’ов — оставим здесь значения по умолчанию.
  • kubernetesVersion: "Automatic". Такое значение параметра говорит о том, что будет установлена стабильная версия Kubernetes, которая соответствует устанавливаемому релизу Deckhouse. В этом случае версия control plane кластера Kubernetes будет автоматически обновляться при изменении релиза Deckhouse. При желании в этом параметре можно явно задать любую из актуальных версий Kubernetes — Deckhouse поддерживает пять последних версий.
  • clusterDomain. DNS-зона, которая будет использоваться в кластере.

InitConfiguration

В ресурсе InitConfiguration задаются параметры для первичной конфигурации кластера Deckhouse.

# https://deckhouse.ru/documentation/v1/installing/configuration.html#initconfiguration
apiVersion: deckhouse.io/v1
kind: InitConfiguration
deckhouse:
  releaseChannel: Stable
  configOverrides:
    global:
      modules:
        # Шаблон, который будет использоваться для составления адресов системных приложений в кластере.
        # Например, Grafana для %s.example.com будет доступна на домене 'grafana.example.com'.
        # Можете изменить на свой сразу либо следовать шагам руководства и сменить его после установки.
        publicDomainTemplate: "%s.example.com"
    userAuthn:
      controlPlaneConfigurator:
        dexCAMode: DoNotNeed
      publishAPI:
        enable: true
        https:
          mode: Global
          global:
            kubeconfigGeneratorMasterCA: ""
  • deckhouse.releaseChannel. Канал обновлений Deckhouse. Stable подходит для большинства случаев.
  • configOverrides.global.modules.publicDomainTemplate. Шаблон DNS-имён, с учётом которого некоторые модули Deckhouse создают Ingress-ресурсы. Мы изменим значение этого параметра позже.
  • userAuthn. Часть с настройками одноимённого модуля. Модуль будет публиковать API Kubernetes через Ingress-контроллер и использовать глобальные настройки HTTPS.

YandexClusterConfiguration

В ресурсе YandexClusterConfiguration настраиваются доступ к облаку и схема размещения.

# https://deckhouse.io/documentation/v1/modules/030-cloud-provider-yandex/cluster_configuration.html
apiVersion: deckhouse.io/v1
kind: YandexClusterConfiguration
layout: Standard
# Параметры доступа к облаку Yandex Cloud.
provider:
  # ID облака.
  cloudID: *!CHANGE_CloudID*
  # ID каталога.
  folderID: *!CHANGE_FolderID*
  # JSON-ключ, сгенерированный с помощью `yc iam key create` на предыдущем шаге.
  # Пример заполнения serviceAccountJSON:
  # serviceAccountJSON: |
  #    {
  #      "id": "...",
  #      "service_account_id": "...",
  #      "created_at": "2022-08-04T05:38:34.756137618Z",
  #      "key_algorithm": "RSA_2048",
  #      "public_key": "-----BEGIN PUBLIC KEY-----...-----END PUBLIC KEY-----\n",
  #      "private_key": "-----BEGIN PRIVATE KEY-----...-----END PRIVATE KEY-----\n"
  #    }
  serviceAccountJSON: *!CHANGE_ServiceAccountJSON*
masterNodeGroup:
  replicas: 1
  instanceClass:
    cores: 4
    memory: 8192
    # ID образа в Yandex Cloud. Рекомендуется использовать актуальную сборку Ubuntu 22.04 LTS.
    # Для получения можете воспользоваться командой:
    # yc compute image list --folder-id standard-images --format json | jq -r '[.[] | select(.family == "ubuntu-2204-lts")] | sort_by(.created_at)[-1].id'
    # Возможно, захотите изменить.
    imageID: fd864gbboths76r8gm5f
    externalIPAddresses:
    - "Auto"
# Данная подсеть будет разделена на три равные части и использована для создания подсетей в трёх зонах Yandex Cloud.
nodeNetworkCIDR: "10.241.32.0/20"
# Публичная часть SSH-ключа для доступа к узлам облака.
# Этот ключ будет добавлен пользователю на созданных узлах (имя пользователя зависит от используемого образа).
sshPublicKey: *!CHANGE_SSH_KEY*
  • layout: Standard. Стандартная схема размещения. Схемы размещения определяют, какие ресурсы Deckhouse будет заказывать в облаке и как он будет настраивать их взаимодействие.

Согласно этой схеме, Deckhouse закажет три подсети (A, B и C) и настроит между ними маршрутизацию. Через Route Table будет настроен маршрут в интернет (0.0.0.0/0), который будет смотреть в NAT Gateway. Через NAT Gateway кластер будет выходить в интернет. Запросы из интернета будут проходить через LoadBalancer. Также в кластере всегда будет master-узел — он устанавливается один раз и остаётся неизменным на протяжении жизни кластера.

icon

Другие варианты схем размещения. У каждого облачного провайдера свой набор схем размещения.

  • provider. Настройки подключения к API провайдера и ещё ряд необходимых параметров. Для Yandex необходимо указать cloudID, folderID и serviceAccountJSON, который мы получили при создании сервисного аккаунта Deckhouse.
  • masterNodeGroup. Количество мастеров и их характеристики: число ядер, объём памяти, ID образа (можно посмотреть в веб-интерфейсе Yandex Cloud). В externalIPAddresses можно как самостоятельно задать внешние IP (по отдельному адресу для каждого master-узла), так и выставить их автоматическое назначение (значение параметра — "Auto").
  • nodeNetworkCIDR. Локальная сеть для взаимодействия всех узлов кластера.
  • sshPublicKey. Публичная часть SSH-ключа, который будет добавлен на все виртуальные машины кластера для доступа администратора.
icon

Получить значения cloudID и folderID можно командой yc config list, а содержимое публичной части вашего SSH-ключа — командой cat ~/.ssh/id_rsa.pub.

Полный код файла config.yml:

# Секция с общими параметрами кластера.
# https://deckhouse.ru/documentation/v1/installing/configuration.html#clusterconfiguration
apiVersion: deckhouse.io/v1
kind: ClusterConfiguration
clusterType: Cloud
cloud:
  provider: Yandex
  # Префикс объектов, создаваемых в облаке при установке.
  # Возможно, захотите изменить.
  prefix: cloud-demo
# Адресное пространство подов кластера.
podSubnetCIDR: 10.111.0.0/16
# Адресное пространство для service’ов кластера.
serviceSubnetCIDR: 10.222.0.0/16
kubernetesVersion: "Automatic"
clusterDomain: "cluster.local"
---
# Секция первичной инициализации кластера Deckhouse.
# https://deckhouse.ru/documentation/v1/installing/configuration.html#initconfiguration
apiVersion: deckhouse.io/v1
kind: InitConfiguration
deckhouse:
  releaseChannel: Stable
  configOverrides:
    global:
      modules:
        # Шаблон, который будет использоваться для составления адресов системных приложений в кластере.
        # Например, Grafana для %s.example.com будет доступна на домене 'grafana.example.com'.
        # Можете изменить на свой сразу либо следовать шагам руководства и сменить его после установки.
        publicDomainTemplate: "%s.example.com"
    userAuthn:
      controlPlaneConfigurator:
        dexCAMode: DoNotNeed
      publishAPI:
        enable: true
        https:
          mode: Global
          global:
            kubeconfigGeneratorMasterCA: ""
---
# Секция, описывающая параметры облачного провайдера.
# https://deckhouse.io/documentation/v1/modules/030-cloud-provider-yandex/cluster_configuration.html
apiVersion: deckhouse.io/v1
kind: YandexClusterConfiguration
layout: Standard
# Параметры доступа к облаку Yandex Cloud.
provider:
  # ID облака.
  cloudID: *!CHANGE_CloudID*
  # ID каталога.
  folderID: *!CHANGE_FolderID*
  # JSON-ключ, сгенерированный с помощью `yc iam key create` на предыдущем шаге.
  # Пример заполнения serviceAccountJSON:
  # serviceAccountJSON: |
  #    {
  #      "id": "...",
  #      "service_account_id": "...",
  #      "created_at": "2022-08-04T05:38:34.756137618Z",
  #      "key_algorithm": "RSA_2048",
  #      "public_key": "-----BEGIN PUBLIC KEY-----...-----END PUBLIC KEY-----\n",
  #      "private_key": "-----BEGIN PRIVATE KEY-----...-----END PRIVATE KEY-----\n"
  #    }
  serviceAccountJSON: *!CHANGE_ServiceAccountJSON*
masterNodeGroup:
  replicas: 1
  instanceClass:
    cores: 4
    memory: 8192
    # ID образа в Yandex Cloud. Рекомендуется использовать актуальную сборку Ubuntu 22.04 LTS.
    # Для получения можете воспользоваться командой:
    # yc compute image list --folder-id standard-images --format json | jq -r '[.[] | select(.family == "ubuntu-2204-lts")] | sort_by(.created_at)[-1].id'
    # Возможно, захотите изменить.
    imageID: fd864gbboths76r8gm5f
    externalIPAddresses:
    - "Auto"
# Данная подсеть будет разделена на три равные части и использована для создания подсетей в трёх зонах Yandex Cloud.
nodeNetworkCIDR: "10.241.32.0/20"
# Публичная часть SSH-ключа для доступа к узлам облака.
# Этот ключ будет добавлен пользователю на созданных узлах (имя пользователя зависит от используемого образа).
sshPublicKey: *!CHANGE_SSH_KEY*

Файл config.yml готов. С ним мы уже могли бы установить Deckhouse. В этом случае он установился бы с одним master-узлом и без дополнительных ресурсов. Однако мы хотим сразу добавить в кластер ресурсы, поэтому также создадим файл resources.yml.

Подготовка resources.yml

Скопируем содержимое файла resources.yml со страницы с шагом 4 в разделе «Быстрый старт»: и изменим значения некоторых параметров.

YandexInstanceClass

Это ресурс, который создаёт классы виртуальных машин. Назовём InstanceClass в нашем примере system.

# https://deckhouse.ru/documentation/v1/modules/030-cloud-provider-yandex/cr.html
apiVersion: deckhouse.io/v1
kind: YandexInstanceClass
metadata:
  name: system
spec:
  # Возможно, захотите изменить.
  cores: 4
  # Возможно, захотите изменить.
  memory: 8192
  # Возможно, захотите изменить.
  diskSizeGB: 30

NodeGroup

Это группа узлов, в которой мы ссылаемся на InstanceClass и указываем максимальное и минимальное количество машин на зону. Если maxPerZone > minPerZone, будет работать cluster autoscaler: при увеличении потребности в ресурсах будет увеличиваться и количество машин.

# https://deckhouse.ru/documentation/v1/modules/040-node-manager/cr.html#nodegroup
apiVersion: deckhouse.io/v1
kind: NodeGroup
metadata:
  name: system
spec:
  cloudInstances:
    classReference:
      kind: YandexInstanceClass
      name: system
    # Максимальное количество инстансов в каждой зоне (используется при масштабировании).
    # Возможно, захотите изменить.
    maxPerZone: 2
    # Минимальное количество инстансов в каждой зоне.
    minPerZone: 1
    # Список зон, в которых создаются инстансы.
    # Возможно, захотите изменить.
    zones:
    - ru-central1-a
    - ru-central1-b
  disruptions:
    approvalMode: Automatic
  nodeTemplate:
    labels:
      node.deckhouse.io/group: worker
  nodeType: CloudEphemeral
  • cloudInstances.zones. В качестве значений укажем ru-central1-a, ru-central1-b. На каждую зону будет создано минимум minPerZone и максимум maxPerZone машин.
  • disruptions.approvalMode: Automatic. Способ применения изменений, которые могут прервать работу машин. Значение Automatic говорит о том, что такие изменения будут применяться автоматически.
  • nodeTemplate.labels. Лейблы, с помощью которых можно будет распределять компоненты по узлам.
  • nodeType: cloudEphemeral. Виртуальная машина облачная, а потому не будет перманентно существовать в кластере на протяжении его жизни.

IngressNginxController

Чтобы в кластер мог поступать HTTP-трафик, необходим Ingress-контроллер. В Deckhouse их можно создавать сколько угодно.

# https://deckhouse.ru/documentation/v1/modules/402-ingress-nginx/cr.html
apiVersion: deckhouse.io/v1
kind: IngressNginxController
metadata:
  name: nginx
spec:
  ingressClass: nginx
  inlet: LoadBalancer
  # Описывает, на каких узлах будет находиться Ingress-контроллер. Лейбл node.deckhouse.io/group: <NODE_GROUP_NAME> устанавливается автоматически.
  nodeSelector:
    node.deckhouse.io/group: worker
  • inlet: LoadBalancer. В кластере поддерживается тип сервисов LoadBalancer. Ingress-контроллер создаст этот сервис и будет принимать на него трафик.

ClusterAuthorizationRule

Теперь необходимо создать пользователя — администратора кластера, чтобы получить доступ во все веб-интерфейсы и работать в API кластера через kubectl. Этой учётной записи мы выдаём права уровня SuperAdmin.

# https://deckhouse.ru/documentation/v1/modules/140-user-authz/cr.html#clusterauthorizationrule
apiVersion: deckhouse.io/v1
kind: ClusterAuthorizationRule
metadata:
  name: admin
spec:
  subjects:
  - kind: User
    name: admin@deckhouse.io
  accessLevel: SuperAdmin
  portForwarding: true

User

Для учётной записи пользователя необходимо придумать пароль и сгенерировать его хэш-сумму — это можно сделать с помощью команды:

echo "<ваш пароль>" | htpasswd -BinC 10 "" | cut -d: -f2
# https://deckhouse.ru/documentation/v1/modules/150-user-authn/cr.html#user
apiVersion: deckhouse.io/v1
kind: User
metadata:
  name: admin
spec:
  # Email пользователя.
  email: admin@deckhouse.io
  # Это хэш пароля zlsc0z3zvn, сгенерированного при загрузке страницы "Быстрого старта".
  # Сгенерируйте свой или используйте этот, но только для тестирования
  # echo "zlsc0z3zvn" | htpasswd -BinC 10 "" | cut -d: -f2
  # Возможно, захотите изменить.
  password: '$2a$10$C9RBs0F54pIX7CM46iS2WeOjTQNNUwZ5Y38XJP.kft5et17ebBm.2'

Полный код resources.yml:

# Секция, описывающая параметры инстанс-класса для узлов c компонентами, обеспечивающими рабочую нагрузку.
# https://deckhouse.ru/documentation/v1/modules/030-cloud-provider-yandex/cr.html
apiVersion: deckhouse.io/v1
kind: YandexInstanceClass
metadata:
  name: system
spec:
  # Возможно, захотите изменить.
  cores: 4
  # Возможно, захотите изменить.
  memory: 8192
  # Возможно, захотите изменить.
  diskSizeGB: 30
---
# Секция, описывающая параметры группы узлов c компонентами, обеспечивающими рабочую нагрузку.
# https://deckhouse.ru/documentation/v1/modules/040-node-manager/cr.html#nodegroup
apiVersion: deckhouse.io/v1
kind: NodeGroup
metadata:
  name: system
spec:
  cloudInstances:
    classReference:
      kind: YandexInstanceClass
      name: system
    # Максимальное количество инстансов в каждой зоне (используется при масштабировании).
    # Возможно, захотите изменить.
    maxPerZone: 2
    # Минимальное количество инстансов в каждой зоне.
    minPerZone: 1
    # Список зон, в которых создаются инстансы.
    # Возможно, захотите изменить.
    zones:
    - ru-central1-a
    - ru-central1-b

  disruptions:
    approvalMode: Automatic
  nodeTemplate:
    labels:
      node.deckhouse.io/group: worker
  nodeType: CloudEphemeral
---
# Секция, описывающая параметры NGINX Ingress controller.
# https://deckhouse.ru/documentation/v1/modules/402-ingress-nginx/cr.html
apiVersion: deckhouse.io/v1
kind: IngressNginxController
metadata:
  name: nginx
spec:
  ingressClass: nginx
  inlet: LoadBalancer
  # Описывает, на каких узлах будет находиться Ingress-контроллер. Лейбл node.deckhouse.io/group: <NODE_GROUP_NAME> устанавливается автоматически.
  nodeSelector:
    node.deckhouse.io/group: worker
---
# Настройки RBAC и авторизации.
# https://deckhouse.ru/documentation/v1/modules/140-user-authz/cr.html#clusterauthorizationrule
apiVersion: deckhouse.io/v1
kind: ClusterAuthorizationRule
metadata:
  name: admin
spec:
  subjects:
  - kind: User
    name: admin@deckhouse.io
  accessLevel: SuperAdmin
  portForwarding: true
---
# Данные статического пользователя.
# https://deckhouse.ru/documentation/v1/modules/150-user-authn/cr.html#user
apiVersion: deckhouse.io/v1
kind: User
metadata:
  name: admin
spec:
  # Email пользователя.
  email: admin@deckhouse.io
  # Это хэш пароля zlsc0z3zvn, сгенерированного при загрузке страницы "Быстрого старта".
  # Сгенерируйте свой или используйте этот, но только для тестирования
  # echo "zlsc0z3zvn" | htpasswd -BinC 10 "" | cut -d: -f2
  # Возможно, захотите изменить.
  password: '$2a$10$C9RBs0F54pIX7CM46iS2WeOjTQNNUwZ5Y38XJP.kft5et17ebBm.2'

Файл resources.yml готов. Теперь можно переходить к установке Deckhouse.