Краткое руководство: Создание автоматизированного кластера Azure Kubernetes Service (AKS) в пользовательской виртуальной сети

Область применения: ✔️ AKS Automatic

Azure Kubernetes Service (AKS) automatic обеспечивает самый простой управляемый интерфейс Kubernetes для разработчиков, инженеров DevOps и инженеров платформы. Идеально подходит для современных приложений и приложений ИИ, AKS Automatic автоматизирует настройку и управление кластерами AKS и внедряет конфигурации лучших практик. Пользователи любого уровня навыков могут воспользоваться преимуществами безопасности, производительности и зависимости AKS Automatic для своих приложений. AKS Automatic также включает SLA на готовность pod, которое гарантирует, что 99,9% операций по готовности pod, соответствующих требованиям, завершаются в течение 5 минут, обеспечивая надежную и самовосстанавливающуюся инфраструктуру для ваших приложений. В этом быстром начале предполагается, что у вас есть основное понимание концепций Kubernetes. Дополнительные сведения см. в основных понятиях Kubernetes для Azure Kubernetes Service (AKS).

Из этой краткой инструкции вы узнаете:

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

Если у вас нет учетной записи Azure, создайте учетную запись free.

Предпосылки

  • Azure CLI версии 2.86.0 или более поздней. Чтобы найти версию, выполните az --version команду. Если необходимо установить или обновить, см. раздел Install Azure CLI.

Примечание.

В этом примере создается кластер AKS Automatic с помощью ресурса azurerm_kubernetes_automatic_cluster поставщика AzureRM, для которого требуется версия провайдера AzureRM v4.81 или выше. Пример эквивалентного использования поставщика AzAPI см. в примере 101-aks-automatic-custom-network-azapi .

  • Идентификация кластера с встроенным назначением ролей в подсети сервера API.
  • Удостоверение кластера со встроенным Network Contributor назначением ролей в виртуальной сети для поддержки автоматической подготовки узла.
  • Идентификация пользователя для доступа к кластеру с Служба Azure Kubernetes Cluster User Role и Служба Azure Kubernetes RBAC Writer.
  • Виртуальная сеть с выделенной подсетью сервера API размером по крайней мере */28, делегированной Microsoft.ContainerService/managedClusters.
    • Если к подсетям подключена группа безопасности сети (NSG), убедитесь, что правила безопасности NSG разрешают необходимые типы обмена данными между компонентами кластера. Подробные требования см. в разделе "Требования к пользовательской виртуальной сети".
    • Если присутствует Брандмауэр Azure или другой метод или устройство ограничения исходящего трафика, убедитесь, что разрешены необходимые правила для исходящего сетевого трафика и полные доменные имена (FQDN).
  • AKS Automatic включит Политика Azure в вашем кластере AKS, но следует предварительно зарегистрировать поставщика ресурсов Microsoft.PolicyInsights в подписке для более плавного взаимодействия. Дополнительные сведения см. в разделе Поставщики ресурсов и типы Azure.
  • Удалите расширение AKS-preview с помощью az extension remove -n aks-preview.

Это важно

Начиная с AKS 1.36, в новых кластерах AKS Automatic по умолчанию будет включен Kubernetes Gateway API через надстройку маршрутизации приложений вместо управляемого NGINX Ingress с надстройкой маршрутизации приложений из-за прекращения поддержки вышестоящего проекта Ingress NGINX.

Существующие автоматические кластеры не затрагиваются, но должны начать миграцию в API шлюза Kubernetes с помощью надстройки маршрутизации приложений.

Ограничения

Следующие ограничения применяются к автоматическим кластерам AKS:

  • AKS Automatic общедоступен в следующих регионах: australiacentral, australiaeast, australiasoutheast, austriaeast, belgiumcentral, brazilsouth, canadacentral, canadaeast, centralindia, centralus, chilecentral, denmarkeast, eastasia, eastus, eastus2, francecentral, germanywestcentral, indonesiacentral, israelcentral, italynorth, japaneast, japanwest, koreacentral, koreasouth, malaysiawest, mexicocentral, newzealandnorth, northcentralus, northeurope, norwayeast, polandcentral, southafricanorth, southcentralus, southeastasia, southindia, spaincentral, swedencentral, switzerlandnorth, uaenorth, uksouth, ukwest, westcentralus, westeurope, westus, westus2, westus3.
  • Новые автоматические кластеры AKS по умолчанию позволяют включить пулы узлов управляемой системы и LocalDNS. Нельзя создавать автоматические кластеры AKS без пулов узлов управляемой системы в любом регионе.
  • Автоматический кластер AKS имеет предварительно настроенную блокировку группы ресурсов узлов, которая не позволяет вносить изменения в группу ресурсов MC_, что препятствует созданию ссылок виртуальной сети в зоне Частная зона DNS по умолчанию. Для сценариев использования между виртуальными сетями или пользовательскими DNS воспользуйтесь настраиваемой сетью и частной DNS, следуя инструкции по созданию частного кластера Azure Kubernetes Service (AKS) в пользовательской виртуальной сети.
  • требуется Azure CLI версии 2.86.0 или более поздней. Чтобы найти версию, выполните az --version команду. Если необходимо установить или обновить, см. раздел Install Azure CLI.
  • Следующие расширения не поддерживаются:
  • Узлы Windows не поддерживаются.
  • Миграция с базового SKU AKS на автоматический SKU не поддерживается.
  • Миграция из существующего кластера AKS Automatic без пулов управляемых системных узлов в AKS Automatic с пулами управляемых системных узлов поддерживается в предварительной версии в регионах, где общедоступны пулы управляемых системных узлов. Миграция из AKS Automatic с управляемыми системными пулами узлов обратно в AKS Automatic без управляемых системных пулов узлов не поддерживается.

Определение переменных

Определите следующие переменные, которые используются в следующих шагах.

RG_NAME=automatic-rg
VNET_NAME=automatic-vnet
CLUSTER_NAME=automatic
IDENTITY_NAME=automatic-uami
LOCATION=eastus
SUBSCRIPTION_ID=$(az account show --query id -o tsv)

Создание группы ресурсов

Группа ресурсов Azure — это логическая группа, в которой Azure ресурсы развертываются и управляются.

Создайте группу ресурсов с помощью команды az group create.

az group create -n ${RG_NAME} -l ${LOCATION}

Следующий пример выходных данных напоминает успешное создание группы ресурсов:

{
  "id": "/subscriptions/<guid>/resourceGroups/automatic-rg",
  "location": "canadacentral",
  "managedBy": null,
  "name": "automatic-rg",
  "properties": {
    "provisioningState": "Succeeded"
  },
  "tags": null
}

Создание виртуальной сети

Создайте виртуальную сеть с помощью az network vnet create команды. Создайте подсеть сервера API, подсеть пользовательского узла и подсеть системного узла с помощью az network vnet subnet create команды.

При использовании пользовательской виртуальной сети с AKS Automatic необходимо создать подсеть сервера API. AKS делегирует подсеть объекту Microsoft.ContainerService/managedClusters от вашего имени, что предоставляет службе AKS разрешения на развертывание в этой подсети подов сервера API и внутреннего балансировщика нагрузки. Вы не можете использовать подсеть для других рабочих нагрузок, но ее можно использовать для подсети сервера API для нескольких кластеров AKS, расположенных в одной виртуальной сети. Минимальный поддерживаемый размер подсети сервера API для поддержки одного кластера — /28.

Предупреждение

Кластер AKS резервирует по крайней мере девять ip-адресов (9) в адресном пространстве подсети. Отсутствие IP-адресов может предотвратить масштабирование сервера API и вызвать сбой сервера API.

az network vnet create --name ${VNET_NAME} \
--resource-group ${RG_NAME} \
--location ${LOCATION} \
--address-prefixes 172.19.0.0/16

az network vnet subnet create --resource-group ${RG_NAME} \
--vnet-name ${VNET_NAME} \
--name apiServerSubnet \
--delegations Microsoft.ContainerService/managedClusters \
--address-prefixes 172.19.0.0/28

az network vnet subnet create --resource-group ${RG_NAME} \
--vnet-name ${VNET_NAME} \
--name userNodeSubnet \
--address-prefixes 172.19.1.0/24

az network vnet subnet create --resource-group ${RG_NAME} \
--vnet-name ${VNET_NAME} \
--name managedSystemNodeSubnet \
--address-prefixes 172.19.0.64/26

Требования к группе безопасности сети

Если вы добавили правила группы безопасности сети (NSG), чтобы ограничить трафик между различными подсетями в пользовательской виртуальной сети, убедитесь, что правила безопасности NSG разрешают необходимые типы обмена данными между компонентами кластера.

Подробные требования NSG при использовании пользовательских виртуальных сетей с кластерами AKS см. в разделе "Требования к пользовательской виртуальной сети".

Создайте управляемое удостоверение и предоставьте ему разрешения на виртуальную сеть.

Создайте управляемое удостоверение командой az identity create и получите идентификатор субъекта. Назначьте роль участника сети управляемому удостоверению в виртуальной сети с помощью команды az role assignment create.

az identity create \
--resource-group ${RG_NAME} \
 --name ${IDENTITY_NAME} \
 --location ${LOCATION}

IDENTITY_PRINCIPAL_ID=$(az identity show --resource-group ${RG_NAME} --name ${IDENTITY_NAME} --query principalId -o tsv)

az role assignment create \
--scope "/subscriptions/${SUBSCRIPTION_ID}/resourceGroups/${RG_NAME}/providers/Microsoft.Network/virtualNetworks/${VNET_NAME}" \
--role "Network Contributor" \
--assignee-object-id "${IDENTITY_PRINCIPAL_ID}" \
--assignee-principal-type ServicePrincipal

Создание автоматического кластера AKS в пользовательской виртуальной сети

Чтобы создать автоматический кластер AKS, используйте команду az aks create .

az aks create \
--resource-group ${RG_NAME} \
--name ${CLUSTER_NAME} \
--location ${LOCATION} \
--apiserver-subnet-id "/subscriptions/${SUBSCRIPTION_ID}/resourceGroups/${RG_NAME}/providers/Microsoft.Network/virtualNetworks/${VNET_NAME}/subnets/apiServerSubnet" \
--node-subnet-id "/subscriptions/${SUBSCRIPTION_ID}/resourceGroups/${RG_NAME}/providers/Microsoft.Network/virtualNetworks/${VNET_NAME}/subnets/userNodeSubnet" \
--system-node-subnet-id "/subscriptions/${SUBSCRIPTION_ID}/resourceGroups/${RG_NAME}/providers/Microsoft.Network/virtualNetworks/${VNET_NAME}/subnets/managedSystemNodeSubnet" 
--assign-identity "/subscriptions/${SUBSCRIPTION_ID}/resourcegroups/${RG_NAME}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/${IDENTITY_NAME}" \
--sku automatic \
--no-ssh-key

Через несколько минут выполнение команды завершается и отображаются сведения о кластере в формате JSON.

Подключение к кластеру

Кластером Kubernetes можно управлять при помощи kubectl клиента командной строки Kubernetes. kubectl уже установлен, если вы используете Azure Cloud Shell. Чтобы установить kubectl локально, выполните команду az aks install-cli . Автоматические кластеры AKS настраиваются с помощью Microsoft Entra ID для управления доступом на основе ролей Kubernetes (RBAC).

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

Настройте kubectl для подключения к кластеру Kubernetes с помощью команды az aks get-credentials. Эта команда скачивает учетные данные и настраивает интерфейс командной строки Kubernetes для их использования.

az aks get-credentials --resource-group ${RG_NAME} --name ${CLUSTER_NAME}

Проверьте подключение к кластеру, выполнив команду kubectl get. Эта команда возвращает список узлов кластера.

kubectl get nodes

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

To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code AAAAAAAAA to authenticate.

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

NAME                           STATUS   ROLES    AGE   VERSION
aks-hostedpool-16652789-vms1   Ready    <none>   19m   v1.34.7
aks-hostedpool-16652789-vms2   Ready    <none>   19m   v1.34.7
aks-hostedpool-16652789-vms3   Ready    <none>   19m   v1.34.7
aks-system-surge-zq4d2         Ready    <none>   19m   v1.34.7

Создание виртуальной сети

Этот Bicep-файл определяет виртуальную сеть.

@description('The location of the managed cluster resource.')
param location string = resourceGroup().location

@description('The name of the virtual network.')
param vnetName string = 'aksAutomaticVnet'

@description('The address prefix of the virtual network.')
param addressPrefix string = '172.19.0.0/16'

@description('The name of the API server subnet.')
param apiServerSubnetName string = 'apiServerSubnet'

@description('The subnet prefix of the API server subnet.')
param apiServerSubnetPrefix string = '172.19.0.0/28'

@description('The name of the user node subnet.')
param userNodeSubnetName string = 'userNodeSubnet'

@description('The subnet prefix of the user node subnet.')
param userNodeSubnetPrefix string = '172.19.1.0/24'

@description('The name of the system node subnet.')
param systemNodeSubnetName string = 'systemNodeSubnet'

@description('The subnet prefix of the system node subnet.')
param systemNodeSubnetPrefix string = '172.19.0.64/26'

// Virtual network with an API server subnet, a user node subnet, and a system node subnet
resource virtualNetwork 'Microsoft.Network/virtualNetworks@2023-09-01' = {
    name: vnetName
    location: location
    properties: {
        addressSpace: {
            addressPrefixes: [ addressPrefix ]
        }
        subnets: [
            {
                name: apiServerSubnetName
                properties: {
                    addressPrefix: apiServerSubnetPrefix
                }
            }
            {
                name: userNodeSubnetName
                properties: {
                    addressPrefix: userNodeSubnetPrefix
                }
            }
            {
                name: systemNodeSubnetName
                properties: {
                    addressPrefix: systemNodeSubnetPrefix
                }
            }
        ]
    }
}

output apiServerSubnetId string = resourceId('Microsoft.Network/virtualNetworks/subnets', vnetName, apiServerSubnetName)
output userNodeSubnetId string = resourceId('Microsoft.Network/virtualNetworks/subnets', vnetName, userNodeSubnetName)
output systemNodeSubnetId string = resourceId('Microsoft.Network/virtualNetworks/subnets', vnetName, systemNodeSubnetName)

Сохраните файл Bicep virtualNetwork.bicep на локальный компьютер.

Это важно

Файл Bicep задает параметр vnetName на aksAutomaticVnet, параметр addressPrefix на 172.19.0.0/16, параметр apiServerSubnetPrefix на 172.19.0.0/28 и параметр apiServerSubnetPrefix на 172.19.1.0/24. Если вы хотите использовать различные значения, обязательно обновите строки до предпочитаемых значений.

Разверните файл Bicep с помощью Azure CLI.

az deployment group create --resource-group <resource-group> --template-file virtualNetwork.bicep

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

Подробные требования NSG при использовании пользовательских виртуальных сетей с кластерами AKS см. в разделе "Требования к пользовательской виртуальной сети".

Создайте управляемое удостоверение

Этот файл Bicep определяет управляемое удостоверение, назначаемое пользователем.

param location string = resourceGroup().location
param uamiName string = 'aksAutomaticUAMI'

resource userAssignedManagedIdentity 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-01-31' = {
  name: uamiName
  location: location
}

output uamiId string = userAssignedManagedIdentity.id
output uamiPrincipalId string = userAssignedManagedIdentity.properties.principalId
output uamiClientId string = userAssignedManagedIdentity.properties.clientId

Сохраните файл Bicep uami.bicep на локальный компьютер.

Это важно

Файл Bicep задает параметр uamiName для aksAutomaticUAMI. Если вы хотите использовать другое имя удостоверения, обязательно обновите строку до предпочтительного имени.

Разверните файл Bicep с помощью Azure CLI.

az deployment group create --resource-group <resource-group> --template-file uami.bicep

Назначьте роль участника сети для виртуальной сети

Этот файл Bicep определяет назначения ролей в виртуальной сети.

@description('The name of the virtual network.')
param vnetName string = 'aksAutomaticVnet'

@description('The principal ID of the user assigned managed identity.')
param uamiPrincipalId string

// Get a reference to the virtual network
resource virtualNetwork 'Microsoft.Network/virtualNetworks@2023-09-01' existing ={
  name: vnetName
}

// Assign the Network Contributor role to the user assigned managed identity on the virtual network
// '4d97b98b-1d4f-4787-a291-c67834d212e7' is the built-in Network Contributor role definition
// See: https://learn.microsoft.com/en-us/azure/role-based-access-control/built-in-roles/networking#network-contributor
resource networkContributorRoleAssignmentToVirtualNetwork 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
  name: guid(uamiPrincipalId, '4d97b98b-1d4f-4787-a291-c67834d212e7', resourceGroup().id, virtualNetwork.name)
  scope: virtualNetwork
  properties: {
      roleDefinitionId: resourceId('Microsoft.Authorization/roleDefinitions', '4d97b98b-1d4f-4787-a291-c67834d212e7')
      principalId: uamiPrincipalId
  }
}

Сохраните файл Bicep roleAssignments.bicep на локальный компьютер.

Это важно

Файл Bicep устанавливает параметр vnetName в значение aksAutomaticVnet. Если вы использовали другое имя виртуальной сети, обязательно обновите строку до предпочтительного имени виртуальной сети.

Разверните файл Bicep с помощью Azure CLI. Необходимо указать идентификатор принципала назначения пользовательской личности.

az deployment group create --resource-group <resource-group> --template-file roleAssignments.bicep \
--parameters uamiPrincipalId=<user assigned identity prinicipal id>

Создание автоматического кластера AKS в пользовательской виртуальной сети

Этот Bicep-файл определяет автоматический кластер AKS.

@description('The name of the managed cluster resource.')
param clusterName string = 'aksAutomaticCluster'

@description('The location of the managed cluster resource.')
param location string = resourceGroup().location

@description('The resource ID of the API server subnet.')
param apiServerSubnetId string

@description('The resource ID of the user node subnet.')
param userNodeSubnetId string

@description('The resource ID of the system node subnet.')
param systemNodeSubnetId string

@description('The resource ID of the user assigned managed identity.')
param uamiId string

/// Create the AKS Automatic cluster using the custom virtual network and user assigned managed identity
resource aks 'Microsoft.ContainerService/managedClusters@2024-03-02-preview' = {
  name: clusterName
  location: location  
  sku: {
    name: 'Automatic'
  }
  properties: {
    apiServerAccessProfile: {
      subnetId: apiServerSubnetId
    }
    networkProfile: {
      outboundType: 'loadBalancer'
    }
    hostedSystemProfile: {
      systemNodeSubnetID: systemNodeSubnetId
      nodeSubnetID: userNodeSubnetId
    }
  }
  identity: {
    type: 'UserAssigned'
    userAssignedIdentities: {
      '${uamiId}': {}
    }
  }
}

Сохраните файл Bicep aks.bicep на локальный компьютер.

Это важно

Файл Bicep задает для параметра clusterName значение aksAutomaticCluster. Если вы хотите другое имя кластера, обязательно обновите строку до предпочтительного имени кластера.

Разверните файл Bicep с помощью Azure CLI. Необходимо указать идентификатор ресурса подсети сервера API, идентификатор ресурса подсети пользовательского узла, идентификатор ресурса подсети системного узла и идентификатор ресурса управляемого удостоверения, назначаемого пользователем.

az deployment group create --resource-group <resource-group> --template-file aks.bicep \
--parameters apiServerSubnetId=<API server subnet resource id> \
--parameters nodeSubnetId=<user node subnet resource id> \
--parameters systemNodeSubnetId=<system node subnet resource id> \
--parameters uamiId=<user assigned identity id>

Подключение к кластеру

Кластером Kubernetes можно управлять при помощи kubectl клиента командной строки Kubernetes. kubectl уже установлен, если вы используете Azure Cloud Shell. Чтобы установить kubectl локально, выполните команду az aks install-cli . Автоматические кластеры AKS настраиваются с помощью Microsoft Entra ID для управления доступом на основе ролей Kubernetes (RBAC).

Это важно

При создании кластера с помощью Bicep необходимо назначить одну из встроенных ролей, таких как Служба Azure Kubernetes RBAC Reader, Служба Azure Kubernetes RBAC Writer, Служба Azure Kubernetes RBAC Admin или Служба Azure Kubernetes RBAC Cluster Admin, для пользователей с указанием области действия в кластере или в конкретном пространстве имен, используя, например, az role assignment create --role "Служба Azure Kubernetes RBAC Cluster Admin" --scope <AKS cluster resource id> --assignee user@contoso.com. Кроме того, убедитесь, что у пользователей есть встроенная роль Служба Azure Kubernetes Cluster User, чтобы иметь возможность выполнять az aks get-credentials, а затем получить kubeconfig кластера AKS с помощью команды az aks get-credentials.

Настройте kubectl для подключения к кластеру Kubernetes с помощью команды az aks get-credentials. Эта команда скачивает учетные данные и настраивает интерфейс командной строки Kubernetes для их использования.

az aks get-credentials --resource-group <resource-group> --name <cluster-name>

Проверьте подключение к кластеру, выполнив команду kubectl get. Эта команда возвращает список узлов кластера.

kubectl get nodes

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

To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code AAAAAAAAA to authenticate.

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

NAME                           STATUS   ROLES    AGE   VERSION
aks-hostedpool-16652789-vms1   Ready    <none>   19m   v1.34.7
aks-hostedpool-16652789-vms2   Ready    <none>   19m   v1.34.7
aks-hostedpool-16652789-vms3   Ready    <none>   19m   v1.34.7
aks-system-surge-zq4d2         Ready    <none>   19m   v1.34.7

Просмотрите код Terraform

Примечание.

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

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

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

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

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

    # Create a random name for the resource group using random_pet
    resource "random_pet" "rg_name" {
      prefix = var.resource_group_name_prefix
    }
    
    # Create a resource group using the generated random name
    resource "azurerm_resource_group" "rg" {
      location = var.resource_group_location
      name     = random_pet.rg_name.id
    }
    
    # Create the custom virtual network that hosts the cluster
    resource "azurerm_virtual_network" "vnet" {
      name                = var.virtual_network_name
      location            = azurerm_resource_group.rg.location
      resource_group_name = azurerm_resource_group.rg.name
      address_space       = var.virtual_network_address_space
    }
    
    # Create the subnet delegated to AKS for API Server VNet Integration
    resource "azurerm_subnet" "api_server" {
      name                 = "apiServerSubnet"
      resource_group_name  = azurerm_resource_group.rg.name
      virtual_network_name = azurerm_virtual_network.vnet.name
      address_prefixes     = var.api_server_subnet_address_prefixes
    
      delegation {
        name = "aks-delegation"
    
        service_delegation {
          name    = "Microsoft.ContainerService/managedClusters"
          actions = ["Microsoft.Network/virtualNetworks/subnets/join/action"]
        }
      }
    }
    
    # Create the subnet that hosts the user node pools
    resource "azurerm_subnet" "user_nodes" {
      name                 = "userNodeSubnet"
      resource_group_name  = azurerm_resource_group.rg.name
      virtual_network_name = azurerm_virtual_network.vnet.name
      address_prefixes     = var.user_node_subnet_address_prefixes
    }
    
    # Create the subnet that hosts the managed system node pool
    resource "azurerm_subnet" "system_nodes" {
      name                 = "managedSystemNodeSubnet"
      resource_group_name  = azurerm_resource_group.rg.name
      virtual_network_name = azurerm_virtual_network.vnet.name
      address_prefixes     = var.system_node_subnet_address_prefixes
    
      lifecycle {
        # AKS adds its own managed cluster delegation to this subnet after the
        # cluster is created.
        ignore_changes = [delegation]
      }
    }
    
    # Create the user-assigned managed identity used by the cluster
    resource "azurerm_user_assigned_identity" "aks" {
      name                = var.identity_name
      location            = azurerm_resource_group.rg.location
      resource_group_name = azurerm_resource_group.rg.name
    }
    
    # Grant the cluster identity Network Contributor on the virtual network
    resource "azurerm_role_assignment" "network_contributor" {
      scope                = azurerm_virtual_network.vnet.id
      role_definition_name = "Network Contributor"
      principal_id         = azurerm_user_assigned_identity.aks.principal_id
      principal_type       = "ServicePrincipal"
    }
    
    # Create a random name for the AKS Automatic cluster
    resource "random_pet" "cluster_name" {
      prefix = var.cluster_name_prefix
    }
    
    # Create the AKS Automatic cluster in the custom virtual network
    resource "azurerm_kubernetes_automatic_cluster" "aks_automatic" {
      name                = random_pet.cluster_name.id
      location            = azurerm_resource_group.rg.location
      resource_group_name = azurerm_resource_group.rg.name
    
      identity {
        type         = "UserAssigned"
        identity_ids = [azurerm_user_assigned_identity.aks.id]
      }
    
      api_server_access {
        subnet_id = azurerm_subnet.api_server.id
      }
    
      hosted_system {
        node_subnet_id        = azurerm_subnet.user_nodes.id
        system_node_subnet_id = azurerm_subnet.system_nodes.id
      }
    
      depends_on = [azurerm_role_assignment.network_contributor]
    }
    
  4. Создайте файл с именем variables.tf и вставьте следующий код:

    variable "resource_group_location" {
      type        = string
      default     = "westus2"
      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 "cluster_name_prefix" {
      type        = string
      default     = "aks-automatic"
      description = "Prefix of the AKS Automatic cluster name that's combined with a random ID so the name is unique in your Azure subscription."
    }
    
    variable "virtual_network_name" {
      type        = string
      default     = "aks-automatic-vnet"
      description = "Name of the custom virtual network that hosts the cluster."
    }
    
    variable "identity_name" {
      type        = string
      default     = "aks-automatic-identity"
      description = "Name of the user-assigned managed identity that the cluster uses."
    }
    
    variable "virtual_network_address_space" {
      type        = list(string)
      default     = ["172.19.0.0/16"]
      description = "Address space of the custom virtual network."
    }
    
    variable "api_server_subnet_address_prefixes" {
      type        = list(string)
      default     = ["172.19.0.0/28"]
      description = "Address prefixes of the subnet delegated to the cluster API server."
    }
    
    variable "user_node_subnet_address_prefixes" {
      type        = list(string)
      default     = ["172.19.1.0/24"]
      description = "Address prefixes of the subnet that hosts the user node pools."
    }
    
    variable "system_node_subnet_address_prefixes" {
      type        = list(string)
      default     = ["172.19.0.64/26"]
      description = "Address prefixes of the subnet that hosts the managed system node pool."
    }
    
  5. Создайте файл с именем outputs.tf и вставьте следующий код:

    output "resource_group_name" {
      value = azurerm_resource_group.rg.name
    }
    
    output "cluster_name" {
      value = azurerm_kubernetes_automatic_cluster.aks_automatic.name
    }
    
    output "cluster_id" {
      value = azurerm_kubernetes_automatic_cluster.aks_automatic.id
    }
    
    output "node_resource_group_id" {
      value = azurerm_kubernetes_automatic_cluster.aks_automatic.node_resource_group_id
    }
    
    output "virtual_network_name" {
      value = azurerm_virtual_network.vnet.name
    }
    
    output "fully_qualified_domain_name" {
      value = azurerm_kubernetes_automatic_cluster.aks_automatic.fully_qualified_domain_name
    }
    

Инициализируйте Terraform

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

terraform init -upgrade

Создайте план запуска Terraform

Запустите команду terraform plan, чтобы создать план выполнения.

terraform plan -out main.tfplan

Применение плана выполнения Terraform

Выполните команду terraform apply, чтобы применить план выполнения к вашей облачной инфраструктуре.

terraform apply main.tfplan

Создание автоматического кластера AKS занимает несколько минут.

Проверка кластера

  1. Получите имя группы ресурсов Azure и имя кластера.

    resource_group_name=$(terraform output -raw resource_group_name)
    cluster_name=$(terraform output -raw cluster_name)
    
  2. Запустите az aks show, чтобы вывести сведения о кластере и убедиться, что используются SKU Automatic и настроенные вами подсети.

    az aks show --resource-group $resource_group_name --name $cluster_name --query "{name:name, sku:sku, provisioningState:provisioningState, apiServerSubnet:apiServerAccessProfile.subnetId}"
    

Подключение к кластеру

Кластером Kubernetes можно управлять при помощи kubectl клиента командной строки Kubernetes. Вы можете установить kubectl локально с помощью команды az aks install-cli . Автоматические кластеры AKS настраиваются с помощью Microsoft Entra ID для управления доступом на основе ролей Kubernetes (RBAC).

Настройте kubectl для подключения к кластеру Kubernetes с помощью команды az aks get-credentials.

az aks get-credentials --resource-group $resource_group_name --name $cluster_name

Проверьте подключение к кластеру, выполнив команду kubectl get.

kubectl get nodes

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

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

Снимок экрана примера архитектуры Azure Store.

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

Примечание.

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

  1. Создайте пространство имен aks-store-demo, в которое будут развернуты ресурсы Kubernetes.

    kubectl create ns aks-store-demo
    
  2. Разверните приложение с помощью команды kubectl apply в aks-store-demo namespace. Файл YAML, определяющий развертывание, находится на GitHub.

    kubectl apply -n aks-store-demo -f https://raw.githubusercontent.com/Azure-Samples/aks-store-demo/main/aks-store-ingress-quickstart.yaml
    

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

    statefulset.apps/rabbitmq created
    configmap/rabbitmq-enabled-plugins 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
    ingress/store-front created
    

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

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

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

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

    kubectl get ingress store-front -n aks-store-demo --watch
    

    Выходные данные ADDRESS для store-front службы изначально отображаются пустыми:

    NAME          CLASS                                HOSTS   ADDRESS        PORTS   AGE
    store-front   webapprouting.kubernetes.azure.com   *                      80      12m
    
  3. После изменения АДРЕСА с пустого на фактический общедоступный IP-адрес используйте CTRL-C для остановки kubectl процесса наблюдения.

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

    NAME          CLASS                                HOSTS   ADDRESS        PORTS   AGE
    store-front   webapprouting.kubernetes.azure.com   *       4.255.22.196   80      12m
    
  4. Откройте веб-браузер и перейдите к внешнему IP-адресу вашего ingress, чтобы увидеть работу приложения магазина Azure.

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

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

Если вы не планируете использовать учебник AKS, очистите ненужные ресурсы, чтобы избежать расходов Azure. Выполните команду az group delete , чтобы удалить группу ресурсов, службу контейнеров и все связанные ресурсы.

az group delete --name <resource-group> --yes --no-wait

Примечание.

Кластер AKS был создан с пользовательским управляемым удостоверением. Если вам больше не нужна эта идентификация, ее можно удалить вручную.

Если вам больше не нужны ресурсы, созданные с помощью Terraform, запустите план terraform и укажите destroy флаг.

terraform plan -destroy -out main.destroy.tfplan

Чтобы применить план выполнения, запустите команду terraform apply.

terraform apply main.destroy.tfplan

Дальнейшие действия

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

Чтобы узнать больше об AKS Automatic, перейдите к обзору.