Краткое руководство. Развертывание узла контейнеров Linux Azure для кластера AKS с помощью Terraform
Начало работы с узлом контейнеров Linux Azure с помощью Terraform для развертывания кластера узла контейнеров Linux Azure. После установки необходимых компонентов вы реализуете код Terraform, инициализируете Terraform и создаете и применяете план выполнения Terraform.
Terraform поддерживает определение, предварительный просмотр и развертывание облачной инфраструктуры. С помощью Terraform вы создаете файлы конфигурации с помощью синтаксиса HCL. Синтаксис HCL позволяет указать поставщика облачных служб и элементы, составляющие облачную инфраструктуру. После создания файлов конфигурации создается план выполнения, который позволяет предварительно просматривать изменения инфраструктуры до их развертывания. После проверки изменений примените план выполнения для развертывания инфраструктуры.
Примечание.
Пример кода, приведенный в этой статье, находится в репозитории Майкрософт для Terraform на GitHub.
Необходимые компоненты
-
Если у вас еще нет подписки Azure, создайте бесплатную учетную запись Azure, прежде чем начинать работу.
Если вы еще не настроили Terraform, это можно сделать с помощью одного из следующих вариантов:
Если у вас нет субъекта-службы Azure, создайте субъект-службу. Запишите
appId
,display_name
password
иtenant
.Вам потребуется средство
kubectl
командной строки Kubernetes. Если у вас его нет, скачайте kubectl.
Создание пары ключей SSH
Подключение к узлам AKS выполняется с парой ключей SSH (открытого и закрытого), которые создаются с помощью команды ssh-keygen
. По умолчанию эти файлы хранятся в каталоге ~/.ssh. При выполнении ssh-keygen
команды выполняется перезапись любой пары ключей SSH с тем же именем, что и в указанном расположении.
Перейдите по адресу https://shell.azure.com, чтобы открыть Cloud Shell в браузере.
Выполните команду
ssh-keygen
. Следующий пример создает пару 4096-разрядных ключей SSH с шифрованием RSA:ssh-keygen -t rsa -b 4096
Дополнительные сведения о создании ключей SSH см. в статье Detailed steps: Create and manage SSH keys for authentication to a Linux VM in Azure (Подробные инструкции. Создание ключей SSH для проверки подлинности на виртуальной машине Linux в Azure и управление этими ключами).
Реализация кода Terraform
Создайте каталог для тестирования примера кода Terraform и сделайте его текущим каталогом.
Создайте файл с именем
providers.tf
и вставьте следующий код:terraform { required_version = ">=1.0" required_providers { azurerm = { source = "hashicorp/azurerm" version = "~>3.0" } random = { source = "hashicorp/random" version = "~>3.0" } } } provider "azurerm" { features {} }
Создайте файл с именем
main.tf
и вставьте следующий код:# Generate random resource group name resource "random_pet" "rg_name" { prefix = var.resource_group_name_prefix } resource "azurerm_resource_group" "rg" { location = var.resource_group_location name = random_pet.rg_name.id } resource "random_id" "log_analytics_workspace_name_suffix" { byte_length = 8 } resource "azurerm_log_analytics_workspace" "test" { location = var.log_analytics_workspace_location # The WorkSpace name has to be unique across the whole of azure; # not just the current subscription/tenant. name = "${var.log_analytics_workspace_name}-${random_id.log_analytics_workspace_name_suffix.dec}" resource_group_name = azurerm_resource_group.rg.name sku = var.log_analytics_workspace_sku } resource "azurerm_log_analytics_solution" "test" { location = azurerm_log_analytics_workspace.test.location resource_group_name = azurerm_resource_group.rg.name solution_name = "ContainerInsights" workspace_name = azurerm_log_analytics_workspace.test.name workspace_resource_id = azurerm_log_analytics_workspace.test.id plan { product = "OMSGallery/ContainerInsights" publisher = "Microsoft" } } resource "azurerm_kubernetes_cluster" "k8s" { location = azurerm_resource_group.rg.location name = var.cluster_name resource_group_name = azurerm_resource_group.rg.name dns_prefix = var.dns_prefix tags = { Environment = "Development" } default_node_pool { name = "azurelinuxpool" vm_size = "Standard_D2_v2" node_count = var.agent_count os_sku = "AzureLinux" } linux_profile { admin_username = "azurelinux" ssh_key { key_data = file(var.ssh_public_key) } } network_profile { network_plugin = "kubenet" load_balancer_sku = "standard" } service_principal { client_id = var.aks_service_principal_app_id client_secret = var.aks_service_principal_client_secret } }
Аналогичным образом можно указать Azure Linux
os_sku
в azurerm_kubernetes_cluster_node_pool.Создайте файл с именем
variables.tf
и вставьте следующий код:variable "agent_count" { default = 3 } # The following two variable declarations are placeholder references. # Set the values for these variable in terraform.tfvars variable "aks_service_principal_app_id" { default = "" } variable "aks_service_principal_client_secret" { default = "" } variable "cluster_name" { default = "k8stest" } variable "dns_prefix" { default = "k8stest" } # Refer to https://azure.microsoft.com/global-infrastructure/services/?products=monitor for available Log Analytics regions. variable "log_analytics_workspace_location" { default = "eastus" } variable "log_analytics_workspace_name" { default = "testLogAnalyticsWorkspaceName" } # Refer to https://azure.microsoft.com/pricing/details/monitor/ for Log Analytics pricing variable "log_analytics_workspace_sku" { default = "PerGB2018" } variable "resource_group_location" { default = "eastus" description = "Location of the resource group." } variable "resource_group_name_prefix" { default = "rg" description = "Prefix of the resource group name that's combined with a random ID so name is unique in your Azure subscription." } variable "ssh_public_key" { default = "~/.ssh/id_rsa.pub" }
Создайте файл с именем
outputs.tf
и вставьте следующий код:output "client_certificate" { value = azurerm_kubernetes_cluster.k8s.kube_config[0].client_certificate sensitive = true } output "client_key" { value = azurerm_kubernetes_cluster.k8s.kube_config[0].client_key sensitive = true } output "cluster_ca_certificate" { value = azurerm_kubernetes_cluster.k8s.kube_config[0].cluster_ca_certificate sensitive = true } output "cluster_password" { value = azurerm_kubernetes_cluster.k8s.kube_config[0].password sensitive = true } output "cluster_username" { value = azurerm_kubernetes_cluster.k8s.kube_config[0].username sensitive = true } output "host" { value = azurerm_kubernetes_cluster.k8s.kube_config[0].host sensitive = true } output "kube_config" { value = azurerm_kubernetes_cluster.k8s.kube_config_raw sensitive = true } output "resource_group_name" { value = azurerm_resource_group.rg.name }
Создайте файл с именем
terraform.tfvars
и вставьте следующий код:aks_service_principal_app_id = "<service_principal_app_id>" aks_service_principal_client_secret = "<service_principal_password>"
Инициализация Terraform и создание плана выполнения
Инициализировать Terraform и скачать модули Azure, необходимые для управления ресурсами Azure с помощью
terraform init
команды.terraform init
Создайте план выполнения Terraform с помощью
terraform plan
команды.terraform plan -out main.tfplan
Команда
terraform plan
создает план выполнения, но не выполняет его. Вместо этого она определяет, какие действия необходимы для создания конфигурации, заданной в файлах конфигурации. Этот шаблон позволяет проверить, соответствует ли план выполнения вашим ожиданиям, прежде чем вы начнете вносить изменения в фактические ресурсы.Необязательный параметр
-out
позволяет указать выходной файл для плана. Использование параметра-out
гарантирует, что проверяемый план полностью соответствует применяемому.Дополнительные сведения о сохранении планов выполнения и безопасности см. в предупреждениях системы безопасности.
Примените план выполнения Terraform с помощью
terraform apply
команды.terraform apply main.tfplan
Командой
terraform apply
выше предполагается, что вы уже выполнили командуterraform plan -out main.tfplan
. Если вы указали другое имя файла для-out
параметра, используйте то же имя файла в вызовеterraform apply
. Если вы не использовали параметр-out
, вызовитеterraform apply
без параметров.
Проверка результатов
Получите имя группы ресурсов с помощью следующей
echo
команды.echo "$(terraform output resource_group_name)"
Перейдите на портал Azure.
В службах Azure выберите группы ресурсов и найдите новую группу ресурсов, чтобы просмотреть следующие ресурсы, созданные в этой демонстрации:
- Решение. По умолчанию демонстрационные имена этого решения ContainerInsights. На портале отображается имя рабочей области решения в скобках.
- Служба Kubernetes: по умолчанию демонстрационные имена этой службы k8stest. (Управляемый кластер Kubernetes также называется AKS/Служба Azure Kubernetes.)
- Рабочая область Log Analytics: по умолчанию демонстрационные имена этой рабочей области с префиксом TestLogAnalyticsWorkspaceName, за которым следует случайное число.
Получите конфигурацию Kubernetes из состояния Terraform и сохраните ее в файле, который kubectl может прочитать с помощью следующей
echo
команды.echo "$(terraform output kube_config)" > ./azurek8s
Убедитесь, что предыдущая команда не добавила символ EOT ASCII, используя следующую
cat
команду.cat ./azurek8s
Если вы видите
<< EOT
в начале иEOT
конце, удалите эти символы из файла. В противном случае может появиться следующее сообщение об ошибке:error: error loading config file "./azurek8s": yaml: line 2: mapping values are not allowed in this context
Задайте переменную среды, чтобы kubectl взял правильную конфигурацию с помощью следующей
export
команды.export KUBECONFIG=./azurek8s
Проверьте работоспособность кластера с помощью
kubectl get nodes
команды.kubectl get nodes
Когда был создан кластер узла контейнеров Linux Azure, мониторинг был включен для записи метрик работоспособности для узлов кластера и модулей pod. Эти метрики работоспособности доступны на портале Azure. Дополнительные сведения о мониторинге работоспособности контейнеров см. в разделе Включение мониторинга для существующих управляемых кластеров.
При применении плана выполнения Terraform было выведено несколько ключевых значений. Например, адрес узла, имя пользователя кластера узла контейнеров Azure Linux и пароль кластера узла контейнеров Azure Linux выходные данные.
Чтобы просмотреть все выходные значения, выполните команду
terraform output
. Чтобы просмотреть определенное выходное значение, выполните командуecho "$(terraform output <output_value_name>)"
.
Очистка ресурсов
Удаление ресурсов AKS
Если ресурсы, созданные с помощью Terraform, больше не нужны, их можно удалить, выполнив следующие действия.
terraform plan
Выполните команду и укажитеdestroy
флаг.terraform plan -destroy -out main.destroy.tfplan
Удалите план выполнения с помощью
terraform apply
команды.terraform apply main.destroy.tfplan
Удаление субъектов-служб.
Внимание
Удалите субъект-службу, используемый в этой демонстрации, только если вы не используете его для других действий.
Получение идентификатора объекта субъекта-службы с помощью
az ad sp list
командыaz ad sp list --display-name "<display_name>" --query "[].{\"Object ID\":id}" --output table
Удалите субъект-службу с помощью
az ad sp delete
команды.az ad sp delete --id <service_principal_object_id>
Устранение неполадок с Terraform в Azure
Устранение распространенных проблем при использовании Terraform в Azure.
Следующие шаги
В этом кратком руководстве вы развернули кластер узла контейнеров Azure Linux. Чтобы узнать больше о узле контейнера Azure Linux и ознакомиться с полным примером развертывания кластера и управления, перейдите к руководству по узлу контейнеров Azure Linux.