Заполнить private.auto.tfvars на базе шаблона private.auto.tfvars.example.
Запустить установку:
k8s_install.sh
Разберем подробнее.
Заводим DNS домен на reg.ru — mycompany.ru или mycompany.org.ru. В настройках домена на вкладке "DNS-серверы и управление зоной" указываем DNS Yandex Cloud:
ns1.yandexcloud.net
ns2.yandexcloud.net
resource "yandex_dns_zone" "dns_domain" {
name = replace(var.dns_domain, ".", "-")
zone = join("", [var.dns_domain, "."])
public = true
}
Так как у zone на конце должна быть точка, то используем метод join для соединения нашего домена и точки.
Создание DNS записи.
В имени DNS записи на конце необходима точка, поэтому используем метод join для соединения DNS записи и точки. Код:
resource "yandex_dns_recordset" "jenkins_dns_domain" {
zone_id = yandex_dns_zone.dns_domain.id
name = join("", [var.jenkins_dns_name, "."])
type = "A"
ttl = 200
data = [yandex_vpc_address.addr.external_ipv4_address[0].address]
}
Поле data — список IP адресов, на которые должны резолвиться эта DNS запись.
Создание сервисного аккаунта.
Перед созданием Kubernetes кластера необходимо рассказать о создание сервисного аккаунта. Название сервисного аккаунта — sa-k8s-admin.
resource "yandex_iam_service_account" "sa-k8s-admin" {
folder_id = var.yc_folder_id
name = "sa-k8s-admin"
}
resource "yandex_resourcemanager_folder_iam_member" "sa-k8s-admin-permissions" {
folder_id = var.yc_folder_id
role = "admin"
member = "serviceAccount:${yandex_iam_service_account.sa-k8s-admin.id}"
}
"Binding for role "mdb.dataproc.agent" not found in policy"
Создание kubernetes кластера в Yandex Cloud.
Для создание kubernetes кластера в Yandex Cloud используется уже обычный terraform код:
В configScripts каждый блок EOT это отдельный файл в контейнере jenkins. systemMessage системное сообщение.
"configScripts" = {
"jenkins-configuration" = <<-EOT
jenkins:
systemMessage: This Jenkins is configured and managed 'as code' by Managed Cloud team.
EOT
Если мы будем добавлять kind: ClusterIssuer как resource "kubernetes_manifest" и добавим как подключатся к Kubernetes используя provider "kubernetes", то получим ошибку:
cannot create REST client: no client config
Поэтому создадим файл ClusterIssuer.yaml.tpl и будем формировать его через templatefile передав всего 1 переменную email_letsencrypt.
Вот мы с вами и прошли то, что напланировали в самом начале.
DNS зона управляется с помощью terraform кода. Документация — .
Лучше использовать yandex_resourcemanager_folder_iam_member вместо yandex_resourcemanager_folder_iam_binding, так как не всегда работает корректно. У меня на другом коде вызывает ошибку. Issue — и .
В role указываем какие права имеет сервисный аккаунт. Более подробно в документации .
Если кластер тестовый, то можно снизить стоимость используя 50% ядра и
Для настройка jenkins из кода используются , . Примеры jcasc
Более подробно —
Мы не можем развернуть resource "kubernetes_manifest" в котором ссылаемся на другой ресрус —