Поделиться через


Краткое руководство. Развертывание узла контейнеров Linux Azure для кластера AKS с помощью Terraform

Начало работы с узлом контейнеров Linux Azure с помощью Terraform для развертывания кластера узла контейнеров Linux Azure. После установки необходимых компонентов вы реализуете код Terraform, инициализируете Terraform и создаете и применяете план выполнения Terraform.

Terraform поддерживает определение, предварительный просмотр и развертывание облачной инфраструктуры. С помощью Terraform вы создаете файлы конфигурации с помощью синтаксиса HCL. Синтаксис HCL позволяет указать поставщика облачных служб и элементы, составляющие облачную инфраструктуру. После создания файлов конфигурации создается план выполнения, который позволяет предварительно просматривать изменения инфраструктуры до их развертывания. После проверки изменений примените план выполнения для развертывания инфраструктуры.

Примечание.

Пример кода, приведенный в этой статье, находится в репозитории Майкрософт для Terraform на GitHub.

Необходимые компоненты

Создание пары ключей SSH

Подключение к узлам AKS выполняется с парой ключей SSH (открытого и закрытого), которые создаются с помощью команды ssh-keygen. По умолчанию эти файлы хранятся в каталоге ~/.ssh. При выполнении ssh-keygen команды выполняется перезапись любой пары ключей SSH с тем же именем, что и в указанном расположении.

  1. Перейдите по адресу https://shell.azure.com, чтобы открыть Cloud Shell в браузере.

  2. Выполните команду 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

  1. Создайте каталог для тестирования примера кода Terraform и сделайте его текущим каталогом.

  2. Создайте файл с именем 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 {}
        }
    
  3. Создайте файл с именем 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.

  4. Создайте файл с именем 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"
        }
    
  5. Создайте файл с именем 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
        }
    
  6. Создайте файл с именем terraform.tfvars и вставьте следующий код:

        aks_service_principal_app_id = "<service_principal_app_id>"
        aks_service_principal_client_secret = "<service_principal_password>"
    

Инициализация Terraform и создание плана выполнения

  1. Инициализировать Terraform и скачать модули Azure, необходимые для управления ресурсами Azure с помощью terraform init команды.

    terraform init
    
  2. Создайте план выполнения Terraform с помощью terraform plan команды.

    terraform plan -out main.tfplan
    

    Команда terraform plan создает план выполнения, но не выполняет его. Вместо этого она определяет, какие действия необходимы для создания конфигурации, заданной в файлах конфигурации. Этот шаблон позволяет проверить, соответствует ли план выполнения вашим ожиданиям, прежде чем вы начнете вносить изменения в фактические ресурсы.

    Необязательный параметр -out позволяет указать выходной файл для плана. Использование параметра -out гарантирует, что проверяемый план полностью соответствует применяемому.

    Дополнительные сведения о сохранении планов выполнения и безопасности см. в предупреждениях системы безопасности.

  3. Примените план выполнения Terraform с помощью terraform apply команды.

    terraform apply main.tfplan
    

    Командой terraform apply выше предполагается, что вы уже выполнили команду terraform plan -out main.tfplan. Если вы указали другое имя файла для -out параметра, используйте то же имя файла в вызове terraform apply. Если вы не использовали параметр -out, вызовите terraform apply без параметров.

Проверка результатов

  1. Получите имя группы ресурсов с помощью следующей echo команды.

    echo "$(terraform output resource_group_name)"
    
  2. Перейдите на портал Azure.

  3. В службах Azure выберите группы ресурсов и найдите новую группу ресурсов, чтобы просмотреть следующие ресурсы, созданные в этой демонстрации:

    • Решение. По умолчанию демонстрационные имена этого решения ContainerInsights. На портале отображается имя рабочей области решения в скобках.
    • Служба Kubernetes: по умолчанию демонстрационные имена этой службы k8stest. (Управляемый кластер Kubernetes также называется AKS/Служба Azure Kubernetes.)
    • Рабочая область Log Analytics: по умолчанию демонстрационные имена этой рабочей области с префиксом TestLogAnalyticsWorkspaceName, за которым следует случайное число.
  4. Получите конфигурацию Kubernetes из состояния Terraform и сохраните ее в файле, который kubectl может прочитать с помощью следующей echo команды.

    echo "$(terraform output kube_config)" > ./azurek8s
    
  5. Убедитесь, что предыдущая команда не добавила символ EOT ASCII, используя следующую cat команду.

    cat ./azurek8s
    

    Если вы видите << EOT в начале и EOT конце, удалите эти символы из файла. В противном случае может появиться следующее сообщение об ошибке: error: error loading config file "./azurek8s": yaml: line 2: mapping values are not allowed in this context

  6. Задайте переменную среды, чтобы kubectl взял правильную конфигурацию с помощью следующей export команды.

    export KUBECONFIG=./azurek8s
    
  7. Проверьте работоспособность кластера с помощью 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, больше не нужны, их можно удалить, выполнив следующие действия.

  1. terraform plan Выполните команду и укажите destroy флаг.

    terraform plan -destroy -out main.destroy.tfplan
    
  2. Удалите план выполнения с помощью terraform apply команды.

    terraform apply main.destroy.tfplan
    

Удаление субъектов-служб.

Внимание

Удалите субъект-службу, используемый в этой демонстрации, только если вы не используете его для других действий.

  1. Получение идентификатора объекта субъекта-службы с помощью az ad sp list команды

    az ad sp list --display-name "<display_name>" --query "[].{\"Object ID\":id}" --output table
    
  2. Удалите субъект-службу с помощью az ad sp delete команды.

    az ad sp delete --id <service_principal_object_id>
    

Устранение неполадок с Terraform в Azure

Устранение распространенных проблем при использовании Terraform в Azure.

Следующие шаги

В этом кратком руководстве вы развернули кластер узла контейнеров Azure Linux. Чтобы узнать больше о узле контейнера Azure Linux и ознакомиться с полным примером развертывания кластера и управления, перейдите к руководству по узлу контейнеров Azure Linux.