Далее необходимо выбрать версию Deckhouse (мы будем устанавливать Community Edition) и сформировать файлы config.yml
и resources.yml
.
Файл resources.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-узел — он устанавливается один раз и остаётся неизменным на протяжении жизни кластера.
Другие варианты схем размещения. У каждого облачного провайдера свой набор схем размещения.
provider
. Настройки подключения к API провайдера и ещё ряд необходимых параметров. Для Yandex необходимо указатьcloudID
,folderID
иserviceAccountJSON
, который мы получили при создании сервисного аккаунта Deckhouse.masterNodeGroup
. Количество мастеров и их характеристики: число ядер, объём памяти, ID образа (можно посмотреть в веб-интерфейсе Yandex Cloud). ВexternalIPAddresses
можно как самостоятельно задать внешние IP (по отдельному адресу для каждого master-узла), так и выставить их автоматическое назначение (значение параметра —"Auto"
).nodeNetworkCIDR
. Локальная сеть для взаимодействия всех узлов кластера.sshPublicKey
. Публичная часть SSH-ключа, который будет добавлен на все виртуальные машины кластера для доступа администратора.
Получить значения 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
со страницы с шагом 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.