Краткое руководство. Развертывание кластера Служба Azure Kubernetes (AKS) с помощью Terraform

Служба Azure Kubernetes (AKS) — это управляемая служба Kubernetes, которая позволяет быстро развертывать кластеры и управлять ими. В этом кратком руководстве вы:

  • Разверните кластер AKS с помощью Terraform.
  • Запустите пример мультиконтейнерного приложения с группой микрослужб и веб-интерфейсов с имитацией сценария розничной торговли.

Примечание.

Чтобы приступить к быстрой подготовке кластера AKS, в этой статье содержатся действия по развертыванию кластера с параметрами по умолчанию только для оценки. Прежде чем развертывать готовый к работе кластер, рекомендуется ознакомиться с базовой эталонной архитектурой , чтобы понять, как она соответствует вашим бизнес-требованиям.

Подготовка к работе

Примечание.

Пул узлов Linux Azure теперь доступен в общем режиме доступности. Дополнительные сведения о преимуществах и действиях по развертыванию см. в статье "Общие сведения о узле контейнеров Linux Azure для AKS".

Вход в учетную запись Azure.

Сначала войдите в учетную запись Azure и выполните проверку подлинности с помощью одного из методов, описанных в следующем разделе.

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

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

В этой статье объясняется, как выполнить проверку подлинности Terraform в Azure в следующих сценариях. Дополнительные сведения о вариантах проверки подлинности Terraform в Azure см. в статье Проверка подлинности с помощью Azure CLI.

Проверка подлинности в Azure с помощью учетной записи Майкрософт

Учетная запись Майкрософт — это имя пользователя (связанное с электронной почтой и его учетными данными), которое используется для входа в службы Майкрософт , например Azure. Учетную запись Майкрософт можно связать с одной или несколькими подписками Azure, при этом по умолчанию используется одна из этих подписок.

Ниже показано, как:

  • Войдите в Azure в интерактивном режиме с помощью учетной записи Майкрософт
  • Вывод списка связанных подписок Azure учетной записи (включая подписку по умолчанию)
  • Задайте текущую подписку.
  1. Откройте командную строку, которая имеет доступ к Azure CLI.

  2. Запустите az login без параметров и следуйте инструкциям для входа в Azure.

    az login
    

    Основные моменты:

    • После успешного входа отображается список подписок Azure, az login связанных с учетной записью Майкрософт, вошедшего в систему, включая подписку по умолчанию.
  3. Чтобы подтвердить текущую подписку Azure, выполните команду az account show.

    az account show
    
  4. Чтобы просмотреть все имена и идентификаторы подписок Azure для конкретной учетной записи Майкрософт, выполните команду az account list.

    az account list --query "[?user.name=='<microsoft_account_email>'].{Name:name, ID:id, Default:isDefault}" --output Table
    

    Основные моменты:

    • Замените заполнитель <microsoft_account_email> адресом электронной почты учетной записи Майкрософт, список подписок Azure которой нужно получить.
    • С помощью учетной записи live ( например, Hotmail или Outlook) может потребоваться указать полный адрес электронной почты. Например, если ваш адрес электронной почты — admin@hotmail.com, может потребоваться заменить заполнитель адресом live.com#admin@hotmail.com.
  5. Чтобы использовать определенную подписку Azure, выполните команду az account set.

    az account set --subscription "<subscription_id_or_subscription_name>"
    

    Основные моменты:

    • Замените заполнитель <subscription_id_or_subscription_name> идентификатором или именем подписки, которую вы хотите использовать.
    • При вызове az account set не отобразятся результаты переключения на указанную подписку Azure. Однако с помощью az account show можно убедиться, что текущая подписка Azure изменилась.
    • Если выполнить команду az account list из предыдущего шага, вы увидите, что подписка Azure по умолчанию была изменена на подписку, указанную в az account set.

Создание субъекта-службы

Разрешения для автоматизированных средств, которые развертывают или используют службы Azure (такие как Terraform), всегда должны быть ограничены. Вместо того, чтобы приложения входили в систему как полностью привилегированный пользователь, Azure предлагает субъекты-службы.

Наиболее распространенным шаблоном является интерактивный вход в Azure, создание субъекта-службы, тестирование субъекта-службы, а затем использование этого субъекта-службы для последующей проверки подлинности (интерактивно или из скриптов).

  1. Чтобы создать субъект-службу, войдите в Azure. После проверки подлинности в Azure с помощью учетной записи Майкрософт вернитесь сюда.

  2. Если вы создаете субъект-службу из Git Bash, задайте переменную среды MSYS_NO_PATHCONV. (Этот шаг не нужен, если вы используете Cloud Shell.)

    export MSYS_NO_PATHCONV=1    
    

    Основные моменты:

    • Переменную среды MSYS_NO_PATHCONV можно задать глобально (для всех сеансов терминала) или локально (только для текущего сеанса). Так как создание субъекта-службы часто не является тем, что вы делаете, пример задает значение для текущего сеанса. Чтобы задать эту переменную среды глобально, добавьте параметр в файл ~/.bashrc.
  3. Чтобы создать субъект-службу, выполните команду az ad sp create-for-rbac.

    az ad sp create-for-rbac --name <service_principal_name> --role Contributor --scopes /subscriptions/<subscription_id>
    

    Основные моменты:

    • <service-principal-name> можно заменить пользовательским именем среды или полностью опустить параметр. Если параметр не задан, имя субъекта-службы создается на основе текущей даты и времени.
    • После успешного выполнения az ad sp create-for-rbac отображает несколько значений. Значения appId, password и tenant используются на следующем шаге.
    • Пароль невозможно извлечь, если он утерян. Следовательно, пароль нужно хранить в надежном месте. Если вы забыли пароль, можно сбросить учетные данные субъекта-службы.
    • В рамках этой статьи используется субъект-служба с ролью Участник. Дополнительные сведения о ролях контроль доступа на основе ролей (RBAC) см. в статье RBAC: встроенные роли.
    • Выходные данные, полученные в результате создания субъекта-службы, включают конфиденциальные учетные данные. Убедитесь, что эти учетные данные не включены в код, или проверьте учетные данные в системе управления версиями.
    • Дополнительные сведения о параметрах при создании субъекта-службы с помощью Azure CLI см. в статье "Создание субъекта-службы Azure с помощью Azure CLI".

указывать учетные данные субъекта-службы в переменных среды;

После создания субъекта-службы можно указать его учетные данные в Terraform с помощью переменных среды.

  1. Измените файл ~/.bashrc, добавив следующие переменные среды.

    export ARM_SUBSCRIPTION_ID="<azure_subscription_id>"
    export ARM_TENANT_ID="<azure_subscription_tenant_id>"
    export ARM_CLIENT_ID="<service_principal_appid>"
    export ARM_CLIENT_SECRET="<service_principal_password>"
    
  2. Чтобы выполнить скрипт ~/.bashrc, выполните команду source ~/.bashrc (или ее сокращенный эквивалент . ~/.bashrc). Можно также выйти и повторно открыть Cloud Shell для автоматического запуска скрипта.

    . ~/.bashrc
    
  3. После установки переменных среды можно проверить их значения следующим образом:

    printenv | grep ^ARM*
    

Основные моменты:

  • Как и в случае с любой переменной среды, для доступа к значению подписки Azure из скрипта Terraform используйте следующий синтаксис: ${env.<environment_variable>}. Например, чтобы получить доступ к значению ARM_SUBSCRIPTION_ID, укажите ${env.ARM_SUBSCRIPTION_ID}.
  • Создание и применение планов выполнения Terraform вносит изменения в подписку Azure, связанную с субъектом-службой. Этот факт иногда может вводить в заблуждение, если вы выполнили вход в одну подписку Azure, а переменные среды указывают на вторую подписку Azure. Рассмотрим следующий пример. Предположим, у вас есть две подписки Azure: SubA и SubB. Если текущая подписка Azure — SubA (определена через az account show), а переменные среды указывают на SubB, любые внесенные Terraform изменения будут применены в SubB. Поэтому вам нужно войти в подписку SubB, чтобы выполнить команды Azure CLI или Azure PowerShell для просмотра изменений.

указывать учетные данные субъекта-службы в блоке поставщика Terraform.

Блок поставщика Azure определяет синтаксис, позволяющий указать сведения о проверке подлинности в подписке Azure.

terraform {
  required_providers {
    azurerm = {
      source = "hashicorp/azurerm"
      version = "~>2.0"
    }
  }
}

provider "azurerm" {
  features {}

  subscription_id   = "<azure_subscription_id>"
  tenant_id         = "<azure_subscription_tenant_id>"
  client_id         = "<service_principal_appid>"
  client_secret     = "<service_principal_password>"
}

# Your code goes here

Внимание

Возможность указывать учетные данные подписки Azure в файле конфигурации Terraform может пригодиться, особенно при тестировании. Однако не рекомендуется хранить учетные данные в виде текстового файла, который может просматриваться ненадежными лицами.

Реализация кода Terraform

Примечание.

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

См. другие статьи и примеры кода, в которых показано, как использовать Terraform для управления ресурсами Azure.

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

  2. Создайте файл с именем providers.tf и вставьте следующий код:

    terraform {
      required_version = ">=1.0"
    
      required_providers {
        azapi = {
          source  = "azure/azapi"
          version = "~>1.5"
        }
        azurerm = {
          source  = "hashicorp/azurerm"
          version = "~>3.0"
        }
        random = {
          source  = "hashicorp/random"
          version = "~>3.0"
        }
        time = {
          source  = "hashicorp/time"
          version = "0.9.1"
        }
      }
    }
    
    provider "azurerm" {
      features {}
    }
    
  3. Создайте файл с именем ssh.tf и вставьте следующий код:

    resource "random_pet" "ssh_key_name" {
      prefix    = "ssh"
      separator = ""
    }
    
    resource "azapi_resource_action" "ssh_public_key_gen" {
      type        = "Microsoft.Compute/sshPublicKeys@2022-11-01"
      resource_id = azapi_resource.ssh_public_key.id
      action      = "generateKeyPair"
      method      = "POST"
    
      response_export_values = ["publicKey", "privateKey"]
    }
    
    resource "azapi_resource" "ssh_public_key" {
      type      = "Microsoft.Compute/sshPublicKeys@2022-11-01"
      name      = random_pet.ssh_key_name.id
      location  = azurerm_resource_group.rg.location
      parent_id = azurerm_resource_group.rg.id
    }
    
    output "key_data" {
      value = jsondecode(azapi_resource_action.ssh_public_key_gen.output).publicKey
    }
    
  4. Создайте файл с именем 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_pet" "azurerm_kubernetes_cluster_name" {
      prefix = "cluster"
    }
    
    resource "random_pet" "azurerm_kubernetes_cluster_dns_prefix" {
      prefix = "dns"
    }
    
    resource "azurerm_kubernetes_cluster" "k8s" {
      location            = azurerm_resource_group.rg.location
      name                = random_pet.azurerm_kubernetes_cluster_name.id
      resource_group_name = azurerm_resource_group.rg.name
      dns_prefix          = random_pet.azurerm_kubernetes_cluster_dns_prefix.id
    
      identity {
        type = "SystemAssigned"
      }
    
      default_node_pool {
        name       = "agentpool"
        vm_size    = "Standard_D2_v2"
        node_count = var.node_count
      }
      linux_profile {
        admin_username = var.username
    
        ssh_key {
          key_data = jsondecode(azapi_resource_action.ssh_public_key_gen.output).publicKey
        }
      }
      network_profile {
        network_plugin    = "kubenet"
        load_balancer_sku = "standard"
      }
    }
    
  5. Создайте файл с именем variables.tf и вставьте следующий код:

    variable "resource_group_location" {
      type        = string
      default     = "eastus"
      description = "Location of the resource group."
    }
    
    variable "resource_group_name_prefix" {
      type        = string
      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 "node_count" {
      type        = number
      description = "The initial quantity of nodes for the node pool."
      default     = 3
    }
    
    variable "msi_id" {
      type        = string
      description = "The Managed Service Identity ID. Set this value if you're running this example using Managed Identity as the authentication method."
      default     = null
    }
    
    variable "username" {
      type        = string
      description = "The admin username for the new cluster."
      default     = "azureadmin"
    }
    
  6. Создайте файл с именем outputs.tf и вставьте следующий код:

    output "resource_group_name" {
      value = azurerm_resource_group.rg.name
    }
    
    output "kubernetes_cluster_name" {
      value = azurerm_kubernetes_cluster.k8s.name
    }
    
    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
    }
    

Инициализация Terraform

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

terraform init -upgrade

Основные моменты:

  • Параметр -upgrade обновляет необходимые подключаемые модули поставщика до последней версии, которая соответствует ограничениям версии конфигурации.

Создание плана выполнения 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 без параметров.

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

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

    resource_group_name=$(terraform output -raw resource_group_name)
    
  2. Отображение имени нового кластера Kubernetes с помощью команды az aks list .

    az aks list \
      --resource-group $resource_group_name \
      --query "[].{\"K8s cluster name\":name}" \
      --output table
    
  3. Получите конфигурацию Kubernetes из состояния Terraform и сохраните ее в файле, который kubectl может прочитать с помощью следующей команды.

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

    cat ./azurek8s
    

    Основные моменты:

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

    export KUBECONFIG=./azurek8s
    
  6. Проверьте работоспособность кластера с помощью kubectl get nodes команды.

    kubectl get nodes
    

Основные моменты:

  • При создании кластера AKS мониторинг был включен для записи метрик работоспособности для узлов кластера и модулей pod. Эти метрики работоспособности доступны на портале Azure. Дополнительные сведения о мониторинге работоспособности контейнеров см. в разделе Включение мониторинга для существующих управляемых кластеров.
  • При применении плана выполнения Terraform несколько ключевых значений, классифицируемых как выходные данные. Например, адрес узла, имя пользователя кластера AKS и пароль кластера AKS выходные данные.

Развертывание приложения

Чтобы развернуть приложение, используйте файл манифеста для создания всех объектов, необходимых для запуска приложения AKS Store. Файл манифеста Kubernetes используется для определения требуемого состояния кластера, например выполняемых в нем образов контейнеров. Манифест включает следующие развертывания и службы Kubernetes:

Снимок экрана: пример архитектуры Магазина Azure.

  • Интерфейс магазина: веб-приложение для пользователей для просмотра продуктов и размещения заказов.
  • Служба продуктов: отображает сведения о продукте.
  • Служба заказов: помещает заказы.
  • Rabbit MQ: очередь сообщений для очереди заказов.

Примечание.

Не рекомендуется запускать контейнеры с отслеживанием состояния, такие как Rabbit MQ, без постоянного хранения для рабочей среды. Они используются здесь для простоты, но мы рекомендуем использовать управляемые службы, такие как Azure CosmosDB или Служебная шина Azure.

  1. Создайте файл с именем aks-store-quickstart.yaml и скопируйте его в следующем манифесте:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: rabbitmq
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: rabbitmq
      template:
        metadata:
          labels:
            app: rabbitmq
        spec:
          nodeSelector:
            "kubernetes.io/os": linux
          containers:
          - name: rabbitmq
            image: mcr.microsoft.com/mirror/docker/library/rabbitmq:3.10-management-alpine
            ports:
            - containerPort: 5672
              name: rabbitmq-amqp
            - containerPort: 15672
              name: rabbitmq-http
            env:
            - name: RABBITMQ_DEFAULT_USER
              value: "username"
            - name: RABBITMQ_DEFAULT_PASS
              value: "password"
            resources:
              requests:
                cpu: 10m
                memory: 128Mi
              limits:
                cpu: 250m
                memory: 256Mi
            volumeMounts:
            - name: rabbitmq-enabled-plugins
              mountPath: /etc/rabbitmq/enabled_plugins
              subPath: enabled_plugins
          volumes:
          - name: rabbitmq-enabled-plugins
            configMap:
              name: rabbitmq-enabled-plugins
              items:
              - key: rabbitmq_enabled_plugins
                path: enabled_plugins
    ---
    apiVersion: v1
    data:
      rabbitmq_enabled_plugins: |
        [rabbitmq_management,rabbitmq_prometheus,rabbitmq_amqp1_0].
    kind: ConfigMap
    metadata:
      name: rabbitmq-enabled-plugins            
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: rabbitmq
    spec:
      selector:
        app: rabbitmq
      ports:
        - name: rabbitmq-amqp
          port: 5672
          targetPort: 5672
        - name: rabbitmq-http
          port: 15672
          targetPort: 15672
      type: ClusterIP
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: order-service
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: order-service
      template:
        metadata:
          labels:
            app: order-service
        spec:
          nodeSelector:
            "kubernetes.io/os": linux
          containers:
          - name: order-service
            image: ghcr.io/azure-samples/aks-store-demo/order-service:latest
            ports:
            - containerPort: 3000
            env:
            - name: ORDER_QUEUE_HOSTNAME
              value: "rabbitmq"
            - name: ORDER_QUEUE_PORT
              value: "5672"
            - name: ORDER_QUEUE_USERNAME
              value: "username"
            - name: ORDER_QUEUE_PASSWORD
              value: "password"
            - name: ORDER_QUEUE_NAME
              value: "orders"
            - name: FASTIFY_ADDRESS
              value: "0.0.0.0"
            resources:
              requests:
                cpu: 1m
                memory: 50Mi
              limits:
                cpu: 75m
                memory: 128Mi
          initContainers:
          - name: wait-for-rabbitmq
            image: busybox
            command: ['sh', '-c', 'until nc -zv rabbitmq 5672; do echo waiting for rabbitmq; sleep 2; done;']
            resources:
              requests:
                cpu: 1m
                memory: 50Mi
              limits:
                cpu: 75m
                memory: 128Mi    
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: order-service
    spec:
      type: ClusterIP
      ports:
      - name: http
        port: 3000
        targetPort: 3000
      selector:
        app: order-service
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: product-service
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: product-service
      template:
        metadata:
          labels:
            app: product-service
        spec:
          nodeSelector:
            "kubernetes.io/os": linux
          containers:
          - name: product-service
            image: ghcr.io/azure-samples/aks-store-demo/product-service:latest
            ports:
            - containerPort: 3002
            resources:
              requests:
                cpu: 1m
                memory: 1Mi
              limits:
                cpu: 1m
                memory: 7Mi
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: product-service
    spec:
      type: ClusterIP
      ports:
      - name: http
        port: 3002
        targetPort: 3002
      selector:
        app: product-service
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: store-front
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: store-front
      template:
        metadata:
          labels:
            app: store-front
        spec:
          nodeSelector:
            "kubernetes.io/os": linux
          containers:
          - name: store-front
            image: ghcr.io/azure-samples/aks-store-demo/store-front:latest
            ports:
            - containerPort: 8080
              name: store-front
            env: 
            - name: VUE_APP_ORDER_SERVICE_URL
              value: "http://order-service:3000/"
            - name: VUE_APP_PRODUCT_SERVICE_URL
              value: "http://product-service:3002/"
            resources:
              requests:
                cpu: 1m
                memory: 200Mi
              limits:
                cpu: 1000m
                memory: 512Mi
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: store-front
    spec:
      ports:
      - port: 80
        targetPort: 8080
      selector:
        app: store-front
      type: LoadBalancer
    

    Сведения о разбивке файлов манифеста YAML см. в разделе "Развертывания" и "Манифесты YAML".

    Если вы создаете и сохраняете файл YAML локально, вы можете отправить файл манифеста в каталог по умолчанию в CloudShell, нажав кнопку "Отправить и скачать файлы " и выбрав файл из локальной файловой системы.

  2. Разверните приложение с помощью kubectl apply команды и укажите имя манифеста YAML.

    kubectl apply -f aks-store-quickstart.yaml
    

    В следующем примере выходных данных показаны развертывания и службы:

    deployment.apps/rabbitmq created
    service/rabbitmq created
    deployment.apps/order-service created
    service/order-service created
    deployment.apps/product-service created
    service/product-service created
    deployment.apps/store-front created
    service/store-front created
    

Тестирование приложения

При запуске приложения Служба Kubernetes предоставляет внешний интерфейс приложения в Интернете. Процесс создания может занять несколько минут.

  1. Проверьте состояние развернутых модулей pod с помощью kubectl get pods команды. Прежде чем продолжить, сделайте все модули pod Running .

    kubectl get pods
    
  2. Проверьте общедоступный IP-адрес для приложения store-front. Отслеживайте ход выполнения с помощью команды с kubectl get service аргументом --watch .

    kubectl get service store-front --watch
    

    Выходные данные EXTERNAL-IP для store-front службы изначально отображаются как ожидающие:

    NAME          TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
    store-front   LoadBalancer   10.0.100.10   <pending>     80:30025/TCP   4h4m
    
  3. Когда параметр EXTERNAL-IP вместо pending примет значение общедоступного IP-адреса, выполните команду CTRL-C, чтобы остановить процесс отслеживания kubectl.

    В следующем примере выходных данных показан общедоступный IP-адрес, присвоенный службе.

    NAME          TYPE           CLUSTER-IP    EXTERNAL-IP    PORT(S)        AGE
    store-front   LoadBalancer   10.0.100.10   20.62.159.19   80:30025/TCP   4h5m
    
  4. Откройте веб-браузер на внешний IP-адрес службы, чтобы увидеть приложение Магазина Azure в действии.

    Снимок экрана: пример приложения AKS Store.

Очистка ресурсов

Удаление ресурсов AKS

Если вам больше не нужны ресурсы, созданные через Terraform, выполните следующие действия:

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

    terraform plan -destroy -out main.destroy.tfplan
    

    Основные моменты:

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

    terraform apply main.destroy.tfplan
    

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

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

    sp=$(terraform output -raw sp)
    
  2. Удалите субъект-службу с помощью команды az ad sp delete .

    az ad sp delete --id $sp
    

Клонирование шаблона интерфейса командной строки разработчика Azure

Интерфейс командной строки разработчика Azure позволяет быстро скачать примеры из репозитория Azure-Samples . В нашем кратком aks-store-demo руководстве вы скачайте приложение. Дополнительные сведения об общих вариантах использования см. в обзореazd.

  1. Клонируйте демонстрационный шаблон хранилища AKS из репозитория Azure-Samples с помощью azd init команды с параметром --template .

    azd init --template Azure-Samples/aks-store-demo
    
  2. Введите имя среды для проекта, использующего только буквенно-цифровые символы и дефисы, например aks-terraform-1.

    Enter a new environment name: aks-terraform-1
    

Вход в учетную запись Azure Cloud

Шаблон azd содержит весь код, необходимый для создания служб, но для размещения приложения в AKS необходимо войти в учетную запись Azure.

  1. Войдите в учетную запись с помощью azd auth login команды.

    azd auth login
    
  2. Скопируйте код устройства, отображаемый в выходных данных, и нажмите клавишу ВВОД для входа.

    Start by copying the next code: XXXXXXXXX
    Then press enter and continue to log in from your browser...
    

    Внимание

    Если вы используете виртуальную машину вне сети или GitHub Codespace, некоторые политики безопасности Azure вызывают конфликты при входе в azd auth loginсистему. При возникновении проблемы вы можете следовать предоставленному ей обходной путь azd auth, который включает использование curl запроса на URL-адрес localhost, на который вы были перенаправлены после выполнения azd auth login.

  3. Проверка подлинности с помощью учетных данных на странице входа вашей организации.

  4. Убедитесь, что вы пытаетесь подключиться из Azure CLI.

  5. Проверьте сообщение "Проверка подлинности кода устройства завершена. Войдите в Azure". Отображается в исходном терминале.

    Waiting for you to complete authentication in the browser...
    Device code authentication completed.
    Logged in to Azure.
    

azd auth обходной путь

Для этого обходного решения требуется установить Azure CLI .

  1. Откройте окно терминала и войдите с помощью Azure CLI с помощью az login команды с заданным параметром --scopehttps://graph.microsoft.com/.default.

    az login --scope https://graph.microsoft.com/.default
    

    Чтобы создать маркер доступа к браузеру, необходимо перенаправить на страницу проверки подлинности на новой вкладке, как показано в следующем примере:

    https://login.microsoftonline.com/organizations/oauth2/v2.0/authorize?clientid=<your_client_id>.
    
  2. Скопируйте URL-адрес localhost веб-страницы, полученной после попытки входа.azd auth login

  3. В новом окне терминала используйте следующий curl запрос для входа. Замените заполнитель URL-адресом <localhost> localhost, скопированным на предыдущем шаге.

    curl <localhost>
    

    Успешный вход выводит HTML-веб-страницу, как показано в следующем примере:

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8" />
        <meta http-equiv="refresh" content="60;url=https://docs.microsoft.com/cli/azure/">
        <title>Login successfully</title>
        <style>
            body {
                font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
            }
    
            code {
                font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace;
                display: inline-block;
                background-color: rgb(242, 242, 242);
                padding: 12px 16px;
                margin: 8px 0px;
            }
        </style>
    </head>
    <body>
        <h3>You have logged into Microsoft Azure!</h3>
        <p>You can close this window, or we will redirect you to the <a href="https://docs.microsoft.com/cli/azure/">Azure CLI documentation</a> in 1 minute.</p>
        <h3>Announcements</h3>
        <p>[Windows only] Azure CLI is collecting feedback on using the <a href="https://learn.microsoft.com/windows/uwp/security/web-account-manager">Web Account Manager</a> (WAM) broker for the login experience.</p>
        <p>You may opt-in to use WAM by running the following commands:</p>
        <code>
            az config set core.allow_broker=true<br>
            az account clear<br>
            az login
        </code>
    </body>
    </html>
    
  4. Закройте текущий терминал и откройте исходный терминал. Вы увидите список JSON подписок.

  5. id Скопируйте поле подписки, которую вы хотите использовать.

  6. Задайте подписку az account set с помощью команды.

    az account set --subscription <subscription_id>
    

Создание и развертывание ресурсов для кластера

Чтобы развернуть приложение, используйте azd up команду для создания всех объектов, необходимых для запуска приложения МАГАЗИНА AKS.

  • Файл azure.yaml определяет требуемое состояние кластера, например образы контейнеров для получения и включают следующие развертывания и службы Kubernetes:

Схема, показывющая пример архитектуры Магазина Azure.

  • Интерфейс магазина: веб-приложение для пользователей для просмотра продуктов и размещения заказов.
  • Служба продуктов: отображает сведения о продукте.
  • Служба заказов: помещает заказы.
  • Rabbit MQ: очередь сообщений для очереди заказов.

Примечание.

Не рекомендуется запускать контейнеры с отслеживанием состояния, такие как Rabbit MQ, без постоянного хранения для рабочей среды. Они используются здесь для простоты, но мы рекомендуем использовать управляемые службы, такие как Azure Cosmos DB или Служебная шина Azure.

Развертывание ресурсов приложения

Шаблон azd для этого краткого руководства создает новую группу ресурсов с кластером AKS и Azure Key Vault. Хранилище ключей хранит секреты клиента и запускает службы в pets пространстве имен.

  1. Создайте все ресурсы приложения с помощью azd up команды.

    azd up
    

    azd upзапускает все перехватчики внутри папки для предварительной azd-hooks регистрации, подготовки и развертывания служб приложений.

    Настройте перехватчики для добавления пользовательского azd кода на этапы рабочего процесса. Дополнительные сведения см. в справочнике azd по перехватчикам .

  2. Выберите подписку Azure для использования выставления счетов.

    ? Select an Azure Subscription to use:  [Use arrows to move, type to filter]
    > 1. My Azure Subscription (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)
    
  3. Выберите регион для развертывания приложения.

    Select an Azure location to use:  [Use arrows to move, type to filter]
      1.  (South America) Brazil Southeast (brazilsoutheast)
      2.  (US) Central US (centralus)
      3.  (US) East US (eastus)
    > 43. (US) East US 2 (eastus2)
      4.  (US) East US STG (eastusstg)
      5.  (US) North Central US (northcentralus)
      6.  (US) South Central US (southcentralus)
    

    azd автоматически запускает перехватчики предварительной подготовки и postprovision, чтобы создать ресурсы для приложения. Процесс создания может занять несколько минут. После завершения вы увидите выходные данные, аналогичные следующему примеру:

    SUCCESS: Your workflow to provision and deploy to Azure completed in 9 minutes 40 seconds.
    

Создание планов Terraform

В шаблоне разработчика Azure папка /infra/terraform содержит весь код, используемый для создания плана Terraform.

Terraform развертывает и выполняет команды, использующиеся terraform apply в рамках azdшага подготовки. После завершения вы увидите выходные данные, аналогичные следующему примеру:

Plan: 5 to add, 0 to change, 0 to destroy.
...
Saved the plan to: /workspaces/aks-store-demo/.azure/aks-terraform-azd/infra/terraform/main.tfplan

Тестирование приложения

При запуске приложения Служба Kubernetes предоставляет внешний интерфейс приложения в Интернете. Процесс создания может занять несколько минут.

  1. Задайте пространство имен в качестве демонстрационного kubectl set-context пространства pets имен с помощью команды.

    kubectl config set-context --current --namespace=pets
    
  2. Проверьте состояние развернутых модулей pod с помощью kubectl get pods команды. Прежде чем продолжить, убедитесь, что все модули pod находятся Running в процессе.

    kubectl get pods
    
  3. Проверьте общедоступный IP-адрес для приложения на стороне магазина и отслеживайте ход выполнения с помощью kubectl get service команды с аргументом --watch .

    kubectl get service store-front --watch
    

    Выходные данные EXTERNAL-IP для store-front службы изначально отображаются как ожидающие:

    NAME          TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
    store-front   LoadBalancer   10.0.100.10   <pending>     80:30025/TCP   4h4m
    
  4. Когда параметр EXTERNAL-IP вместо pending примет значение общедоступного IP-адреса, выполните команду CTRL-C, чтобы остановить процесс отслеживания kubectl.

    В следующем примере выходных данных показан допустимый общедоступный IP-адрес, назначенный службе:

    NAME          TYPE           CLUSTER-IP    EXTERNAL-IP    PORT(S)        AGE
    store-front   LoadBalancer   10.0.100.10   20.62.159.19   80:30025/TCP   4h5m
    
  5. Откройте веб-браузер на внешний IP-адрес службы, чтобы увидеть приложение Магазина Azure в действии.

    Снимок экрана: пример приложения AKS Store.

Удаление кластера

Завершив работу с кратким руководством, очистите ненужные ресурсы, чтобы избежать расходов Azure.

  1. Удалите все ресурсы, созданные в кратком руководстве azd down , с помощью команды.

    azd down
    
  2. Подтвердите решение удалить все используемые ресурсы из подписки, введя y и нажав клавишу Enter.

    ? Total resources to delete: 14, are you sure you want to continue? (y/N)
    
  3. Разрешить очистку повторно использовать переменные быстрого запуска, если применимо, введя y и нажав клавишу Enter.

    [Warning]: These resources have soft delete enabled allowing them to be recovered for a period or time after deletion. During this period, their names can't be reused. In the future, you can use the argument --purge to skip this confirmation.
    

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

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

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

С помощью этого краткого руководства вы развернули кластер Kubernetes и простое многоконтейнерное приложение в нем. Этот пример приложения предназначен только для демонстрационных целей и не представляет все рекомендации для приложений Kubernetes. Рекомендации по созданию полных решений с помощью AKS для рабочей среды см . в руководстве по решению AKS.

Чтобы узнать больше об AKS и ознакомиться с полным примером кода к развертыванию, перейдите к руководству по кластеру Kubernetes.