Управление ресурсами Kubernetes в кластере Managed Service for Kubernetes с помощью провайдера Terraform
Вы можете создать ресурсы Kubernetes с помощью манифестов Terraform. Для этого подключите Terraform-провайдер kubernetes
. Он поддерживает Terraform-ресурсы, которые соответствуют конфигурационным файлам YAML для различных Kubernetes-ресурсов.
Использовать Terraform для создания Kubernetes-ресурсов удобно, если через Terraform вы поддерживаете инфраструктуру для кластера Yandex Managed Service for Kubernetes. Так вы можете описывать все ресурсы на одном языке разметки.
Кроме того, Terraform отслеживает зависимости между ресурсами и предотвращает создание, изменение или удаление ресурса, если для него не готовы зависимости. Допустим, вы создаете ресурс PersistentVolumeClaim
. Ему нужно определенное пространство в хранилище для ресурса PersistentVolume
, но места не хватает. Terraform отследит нехватку места и не позволит создать ресурс PersistentVolumeClaim
.
Ниже рассматривается пример, как создать стандартные ресурсы Kubernetes с помощью Terraform.
Чтобы с помощью Terraform создать ресурсы Kubernetes:
- Подготовьте инфраструктуру.
- Подключите провайдер
kubernetes
. - Создайте ресурсы Kubernetes.
- Убедитесь, что приложение кластера доступно из интернета.
Если созданные ресурсы вам больше не нужны, удалите их.
Необходимые платные ресурсы
В стоимость поддержки описываемого решения входят:
- Плата за кластер Managed Service for Kubernetes: использование мастера и исходящий трафик (см. тарифы Managed Service for Kubernetes).
- Плата за узлы кластера (ВМ): использование вычислительных ресурсов, операционной системы и хранилища (см. тарифы Compute Cloud).
- Плата за сетевой балансировщик нагрузки (см. тарифы Network Load Balancer).
- Плата за использование публичных IP-адресов для ВМ и сетевого балансировщика нагрузки (см. тарифы Virtual Private Cloud).
Подготовьте инфраструктуру для Managed Service for Kubernetes
-
Если у вас еще нет Terraform, установите его.
-
Получите данные для аутентификации. Вы можете добавить их в переменные окружения или указать далее в файле с настройками провайдера.
-
Настройте и инициализируйте провайдер. Чтобы не создавать конфигурационный файл с настройками провайдера вручную, скачайте его
.На этом шаге файл не должен содержать настройки провайдера
kubernetes
. Они будут добавлены позднее. -
Поместите конфигурационный файл в отдельную рабочую директорию и укажите значения параметров. Если данные для аутентификации не были добавлены в переменные окружения, укажите их в конфигурационном файле.
-
Скачайте в ту же рабочую директорию файл конфигурации managed-k8s-infrastructure.tf
.В этом файле описаны:
- сеть;
- подсеть;
- две группы безопасности — для кластера и группы узлов;
- облачный сервисный аккаунт с ролями
k8s.clusters.agent
,vpc.publicAdmin
,load-balancer.admin
иcontainer-registry.images.puller
; - кластер Managed Service for Kubernetes;
- группа узлов Kubernetes.
-
Укажите значения переменных в файле
managed-k8s-infrastructure.tf
. -
Проверьте корректность файлов конфигурации Terraform с помощью команды:
terraform validate
Если в файлах конфигурации есть ошибки, Terraform на них укажет.
-
Создайте инфраструктуру:
-
Выполните команду для просмотра планируемых изменений:
terraform plan
Если конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.
-
Если вас устраивают планируемые изменения, внесите их:
-
Выполните команду:
terraform apply
-
Подтвердите изменение ресурсов.
-
Дождитесь завершения операции.
-
В указанном каталоге будут созданы все требуемые ресурсы. Проверить появление ресурсов и их настройки можно в консоли управления
. -
-
Установите kubectl
и настройте его на работу с созданным кластером.
Подключите провайдер kubernetes
-
В рабочей директории откройте файл с настройками провайдера
yandex
. У него должна быть следующая структура:terraform { required_providers { yandex = { source = "yandex-cloud/yandex" } } required_version = ">= 0.13" } provider "yandex" { token = "<IAM-токен>" cloud_id = "<идентификатор_облака>" folder_id = "<идентификатор_каталога>" zone = "<зона_доступности_по_умолчанию>" }
-
Укажите в файле параметры, необходимые для работы провайдера
kubernetes
:-
В блок
required_providers
добавьте:kubernetes = { source = "hashicorp/kubernetes" }
-
В блоке
required_providers
измените значениеrequired_version
на">= 0.14.8"
. -
В конце файла разместите новый блок:
data "yandex_client_config" "client" {} provider "kubernetes" { host = yandex_kubernetes_cluster.k8s-cluster.master[0].external_v4_endpoint cluster_ca_certificate = yandex_kubernetes_cluster.k8s-cluster.master[0].cluster_ca_certificate token = data.yandex_client_config.client.iam_token }
-
-
Убедитесь, что в результате файл выглядит так:
terraform { required_providers { yandex = { source = "yandex-cloud/yandex" } kubernetes = { source = "hashicorp/kubernetes" } } required_version = ">= 0.14.8" } provider "yandex" { token = "<IAM-токен>" cloud_id = "<идентификатор_облака>" folder_id = "<идентификатор_каталога>" zone = "<зона_доступности_по_умолчанию>" } data "yandex_client_config" "client" {} provider "kubernetes" { host = yandex_kubernetes_cluster.k8s-cluster.master[0].external_v4_endpoint cluster_ca_certificate = yandex_kubernetes_cluster.k8s-cluster.master[0].cluster_ca_certificate token = data.yandex_client_config.client.iam_token }
-
Инициализируйте провайдер
kubernetes
:terraform init
Создайте ресурсы Kubernetes
Создайте тестовое приложение и сервис типа LoadBalancer
:
-
В рабочей директории создайте файл
deployment.tf
, описывающий ресурсDeployment
:resource "kubernetes_deployment" "demo-app-deployment" { metadata { name = "hello" labels = { app = "hello" version = "v1" } } spec { replicas = 2 selector { match_labels = { app = "hello" } } template { metadata { labels = { app = "hello" version = "v1" } } spec { container { name = "hello-app" image = "cr.yandex/crpjd37scfv653nl11i9/hello:1.1" } } } } }
-
В рабочей директории создайте файл
service.tf
, описывающий ресурсService
:resource "kubernetes_service" "demo-lb-service" { metadata { name = "hello" } spec { selector = { app = kubernetes_deployment.demo-app-deployment.spec.0.template.0.metadata[0].labels.app } type = "LoadBalancer" port { port = 80 target_port = 8080 } } }
-
Создайте ресурсы Kubernetes:
-
Посмотрите планируемые изменения:
terraform plan
-
Если изменения устраивают, примените их:
terraform apply
После команды
terraform apply
может возникнуть ошибка:Error: Waiting for rollout to finish: 2 replicas wanted; 0 replicas Ready │ │ with kubernetes_deployment.demo-app-deployment, │ on deployment.tf line 1, in resource "kubernetes_deployment" "demo-app-deployment": │ 1: resource "kubernetes_deployment" "demo-app-deployment" { │
Она означает, что ресурсы
Deployment
еще не готовы. Проверьте их готовность с помощью командыkubectl get deployment
, она вернет результат:NAME READY UP-TO-DATE AVAILABLE AGE hello 0/2 2 0 12m
Когда в столбце
READY
будет указано значение2/2
, выполните командуterraform apply
снова. -
Вы также можете создавать другие стандартные ресурсы Kubernetes с помощью манифестов Terraform. В качестве основы используйте конфигурацию YAML для нужного ресурса (пример для подаcontainerPort
в YAML замените на параметр container_port
в Terraform. Полный список Terraform-ресурсов для Kubernetes приведен в документации провайдера
О создании пользовательских ресурсов
Убедитесь, что приложение кластера доступно из интернета
-
Посмотрите информацию о созданном балансировщике нагрузки:
kubectl describe service hello
Результат:
Name: hello Namespace: default Labels: <none> Annotations: <none> Selector: app=hello Type: LoadBalancer IP Family Policy: SingleStack IP Families: IPv4 IP: 10.96.228.81 IPs: 10.96.228.81 LoadBalancer Ingress: 84.201.148.8 Port: <unset> 80/TCP TargetPort: 8080/TCP NodePort: <unset> 32532/TCP Endpoints: 10.112.128.7:8080,10.112.128.8:8080 Session Affinity: None External Traffic Policy: Cluster Internal Traffic Policy: Cluster Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal EnsuringLoadBalancer 5m32s service-controller Ensuring load balancer Normal EnsuredLoadBalancer 5m25s service-controller Ensured load balancer
-
Скопируйте IP-адрес из поля
LoadBalancer Ingress
. -
Откройте в браузере URL приложения:
http://<скопированный_IP_адрес>
Результат:
Hello, world! Running in 'hello-5c46b*****-nc**'
Примечание
Если ресурс недоступен по указанному URL, то убедитесь, что группы безопасности для кластера Managed Service for Kubernetes и его групп узлов настроены корректно. Если отсутствует какое-либо из правил — добавьте его.
Удалите созданные ресурсы
-
В терминале перейдите в директорию с планом инфраструктуры.
-
Выполните команду:
terraform destroy
Terraform удалит все ресурсы, созданные в текущей конфигурации.