Создание частного кластера Azure Kubernetes Service (AKS)

В этой статье показано, как развернуть кластер AKS на основе приватного канала с помощью Azure CLI или Terraform. Если вы хотите создать кластер AKS без обязательного приватного канала или туннеля, см. раздел Создание кластера Azure Kubernetes Service (AKS) с интеграцией VNet для сервера API.

Обзор частных кластеров в AKS

В частном кластере уровень управления или сервер API имеют внутренние IP-адреса, определенные в документе RFC1918 — выделение адресов для частных сетей интернета. Используя частный кластер, вы можете гарантировать, что сетевой трафик между сервером API и пулами узлов остается только в частной сети.

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

При создании частного кластера AKS AKS по умолчанию создает как частные, так и общедоступные полные доменные имена (FQDN) с соответствующими зонами DNS. Подробные параметры конфигурации DNS см. в разделе "Настройка частной зоны DNS", частной подзоны DNS или пользовательского поддомена.

Доступность по регионам

Частные кластеры доступны в общедоступных регионах, Azure для государственных организаций и Microsoft Azure, управляемых регионами 21Vianet, где поддерживается AKS.

Внимание

Все Microsoft Defender для облака функции будут официально прекращены в Azure в регионе Китая 18 августа 2026 года. Из-за этого предстоящего выхода на пенсию Azure в Китае клиенты больше не смогут подключить новые подписки к службе. Новая подписка — это любая подписка, которая еще не была подключена к службе Microsoft Defender для облака до 18 августа 2025 года, дата объявления о выходе на пенсию. Для получения дополнительной информации о прекращении использования см. раздел Объявление о прекращении работы Microsoft Defender для облака в Microsoft Azure, управляемое 21Vianet.

Клиенты должны работать с представителями своих клиентских учётных записей в Microsoft Azure, управляемых 21Vianet, чтобы оценить влияние этого прекращения поддержки на их операции.

Предварительные требования для частных кластеров AKS

  • Активная подписка Azure. Если у вас нет подписки Azure, создайте учетную запись free перед началом работы.

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

    az account set --subscription "00000000-0000-0000-0000-000000000000"
    
  • Azure CLI версии 2.28.0 или более поздней. Найдите версию с помощью az --version команды. Если необходимо установить или обновить, см. раздел Install Azure CLI.

  • При использовании Azure Resource Manager (ARM) или REST API Azure версия API AKS должна быть 2021-05-01 или более поздней.

  • Чтобы использовать пользовательский DNS-сервер, добавьте общедоступный IP-адрес Azure 168.63.129.16 в качестве вышестоящего DNS-сервера в пользовательском DNS-сервере и обязательно добавьте его в качестве первого DNS-сервера. Дополнительные сведения об IP-адресе Azure см. в разделе Что такое IP-адрес 168.63.129.16?

    • Зона DNS кластера должна быть той, которую вы перенаправляете на 168.63.129.16. Дополнительные сведения о названиях зон можно найти в конфигурации DNS-зон служб Azure.
  • Существующие кластеры AKS, включенные с интеграцией виртуальной сети API Server, могут иметь режим частного кластера. Дополнительные сведения см. в разделе "Включение или отключение режима частного кластера" в существующем кластере с интеграцией виртуальной сети API Server.

  • Если необходимо включить Реестр контейнеров Azure в частном кластере AKS, настройте приватный канал для реестра контейнеров в виртуальной сети кластера или настройте пиринг между виртуальной сетью реестра контейнеров и виртуальной сетью частного кластера.

  • установлен kubectl. Ее можно установить локально с помощью az aks install-cli команды.

  • Terraform установлен локально. Инструкции по установке см. в разделе "Установка Terraform".

Внимание

Начиная с 30 ноября 2025 Azure Kubernetes Service (AKS) больше не поддерживает или не предоставляет обновления системы безопасности для Azure Linux 2.0. Образ узла Azure Linux 2.0 заморожен в выпуске 202512.06.0. Начиная с 31 марта 2026 г. образы узлов будут удалены, и вы не сможете масштабировать пулы узлов. Миграция на поддерживаемую версию Azure Linux путем обновления пулов узлов до поддерживаемой версии Kubernetes или путем перехода на osSku AzureLinux3. Дополнительные сведения см. в проблеме на GitHub о выходе из эксплуатации и в объявлении о прекращении обновлений Azure. Чтобы оставаться в курсе объявлений и обновлений, следуйте заметкам о выпуске AKS.

Ограничения

  • Диапазоны разрешенных IP-адресов применяются только к общедоступному серверу API. Эти диапазоны нельзя применить к конечной точке частного сервера API.
  • Ограничения службы Приватный канал Azure применяются к приватным кластерам.
  • Не поддерживаются агенты Azure DevOps, размещенные Майкрософт, с частными кластерами. Рассмотрите возможность использования самостоятельно размещённых агентов.
  • Удаление или изменение частной конечной точки в подсети клиента приводит к остановке работы кластера.
  • служба Приватный канал Azure поддерживается только в стандартном Azure Load Balancer. Базовый Azure Load Balancer не поддерживается.

Концентратор и периферийный сервер с пользовательским DNS для частных кластеров AKS

Hub и spoke архитектуры часто используются для развертывания сетей в Azure. Во многих из этих развертываний настройки DNS в периферийных виртуальных сетях настроены для ссылки на центральный сервер пересылки DNS, чтобы обеспечить локальное и Azure-основанное разрешение DNS.

На следующей схеме показана архитектура концентратора и периферийной архитектуры для частного кластера AKS с пользовательским DNS:

Частный концентратор кластера и периферийный кластер

  • При создании частного кластера частная конечная точка (1) и частная зона DNS (2) создаются в группе ресурсов, управляемой кластером, по умолчанию. Кластер использует A запись в частной зоне для разрешения IP-адреса частной конечной точки и обеспечения связи с сервером API.
  • Частная зона DNS связана только с виртуальной сетью, к которой подключены узлы кластера (3), что означает, что частная конечная точка может быть разрешена только узлами в этой связанной виртуальной сети. В сценариях, когда настраиваемый DNS не сконфигурирован в виртуальной сети (по умолчанию), система работает без затруднений, поскольку узлы обращаются к 168.63.129.16, который разрешает записи в частной зоне DNS благодаря соединению.
  • При сохранении поведения частной зоны DNS по умолчанию AKS пытается связать зону непосредственно с периферийной виртуальной сетью, в которую размещается кластер, даже если зона уже связана с центральной виртуальной сетью.
    • В периферийных виртуальных сетях, использующих пользовательские DNS-серверы, это действие может завершиться ошибкой, если управляемому удостоверению кластера не хватает участника сети в периферийной виртуальной сети. Чтобы предотвратить сбой, выберите одну из следующих поддерживаемых конфигураций:
      • Настраиваемая частная зона DNS: укажите существующую частную зону и задайте privateDNSZone / --private-dns-zone его идентификатор ресурса. Свяжите эту зону с соответствующей виртуальной сетью (например, виртуальной сетью концентратора) и установите publicDNS на false / используйте --disable-public-fqdn.
      • Только общедоступный DNS: отключите создание частной зоны, установив privateDNSZone / --private-dns-zone на none и оставьте publicDNSв значении по умолчанию (true) / не используйте --disable-public-fqdn.
  • Если вы используете собственную таблицу маршрутов (BYO) с kubenet и собственный BYO DNS с частными кластерами, создание кластера терпит неудачу. Чтобы создание кластера было успешным, нужно связать RouteTable группу ресурсов узла с подсетью после того, как первоначальная попытка создания кластера не удалась.

Ограничения для частных кластеров AKS с пользовательским DNS

  • Параметр privateDNSZone / --private-dns-zonenonepublicDNS: false / --disable-public-fqdnв то же время не поддерживается.
  • Условное перенаправление не поддерживает поддомены.

Создайте группу ресурсов

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

az group create \
    --name <private-cluster-resource-group> \
    --location <location>

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

Создайте частный кластер с базовой сетью по умолчанию с помощью az aks create команды с флагом --enable-private-cluster .

Ключевые параметры в этой команде:

  • --enable-private-cluster: включает режим частного кластера.
az aks create \
    --name <private-cluster-name> \
    --resource-group <private-cluster-resource-group> \
    --load-balancer-sku standard \
    --enable-private-cluster \
    --generate-ssh-keys
  1. Создайте файл с именем main.tf и добавьте следующий код, чтобы определить версию Terraform и указать поставщика Azure:

    terraform {
      required_version = ">= 1.3.0"
      required_providers {
        azurerm = {
          source  = "hashicorp/azurerm"
          version = "~> 4.0"
        }
      }
    }
    
    provider "azurerm" {
      features {}
      subscription_id = var.subscription_id
    }
    
  2. Добавьте следующий код в main.tf для создания входных переменных для идентификатора подписки Azure, имени группы ресурсов, расположения и имени кластера AKS. При необходимости можно изменить значения по умолчанию.

    variable "subscription_id" {
      description = "The Azure subscription ID."
      type = string
    }
    
    variable "resource_group_name" {
      description = "The name of the resource group for the AKS cluster."
      type        = string
      default     = "rg-private-aks-basic"
    }
    
    variable "location" {
      description = "The Azure region where the resources will be created."
      type        = string
      default     = "eastus"
    }
    
    variable "aks_cluster_name" {
      description = "The name of the AKS cluster."
      type        = string
      default     = "aks-private-basic"
    }
    
  3. Добавьте следующий код в main.tf для создания группы ресурсов Azure:

    resource "azurerm_resource_group" "this" {
      name     = var.resource_group_name
      location = var.location
    }
    
  4. Добавьте следующий код в main.tf, чтобы создать частный кластер AKS с базовой сетью.

    resource "azurerm_kubernetes_cluster" "this" {
      name                = var.aks_cluster_name
      location            = azurerm_resource_group.this.location
      resource_group_name = azurerm_resource_group.this.name
      dns_prefix          = "privatebasicaks"
    
      private_cluster_enabled = true
    
      default_node_pool {
        name       = "system"
        node_count = 1
        vm_size    = "Standard_DS2_v2"
      }
    
      identity {
        type = "SystemAssigned"
      }
    
      network_profile {
        load_balancer_sku = "standard"
        network_plugin    = "kubenet"
      }
    }
    
  5. Выполните действия по инициализации Terraform, форматированию и проверке конфигурации Terraform, созданию плана выполнения Terraform, применению конфигурации Terraform и подключению к кластеру AKS.

Создание частного кластера AKS с расширенной сетью

Создайте частный кластер с расширенными сетями az aks create с помощью команды.

Ключевые параметры в этой команде:

  • --enable-private-cluster: включает режим частного кластера.
  • --network-plugin azure: Указывает сетевой плагин Azure CNI.
  • --vnet-subnet-id <subnet-id>: идентификатор ресурса существующей подсети в виртуальной сети.
  • --dns-service-ip <dns-service-ip>: доступный IP-адрес в диапазоне адресов службы Kubernetes, используемый для службы DNS кластера. Например: 10.2.0.10.
  • --service-cidr <service-cidr>: диапазон IP-адресов нотации CIDR, из которого следует назначать IP-адреса кластера служб. Например: 10.2.0.0/24.
az aks create \
    --resource-group <private-cluster-resource-group> \
    --name <private-cluster-name> \
    --load-balancer-sku standard \
    --enable-private-cluster \
    --network-plugin azure \
    --vnet-subnet-id <subnet-id> \
    --dns-service-ip <dns-service-ip> \
    --service-cidr <service-cidr> \
    --generate-ssh-keys
  1. Создайте файл с именем main.tf и добавьте следующий код, чтобы определить версию Terraform и указать поставщика Azure:

    terraform {
      required_version = ">= 1.3.0"
      required_providers {
        azurerm = {
          source  = "hashicorp/azurerm"
          version = "~> 4.0"
        }
      }
    }
    
    provider "azurerm" {
      features {}
      subscription_id = var.subscription_id
    }
    
  2. Добавьте следующий код в main.tf, чтобы создать входные переменные для идентификатора подписки Azure, имени группы ресурсов, расположения, имени кластера AKS, имени виртуальной сети (VNet) и имени подсети. При необходимости можно изменить значения по умолчанию.

    variable "subscription_id" {
      description = "The Azure subscription ID."
      type = string
    }
    
    variable "resource_group_name" {
      description = "The name of the resource group for the AKS cluster."
      type = string
      default = "rg-private-aks-advanced"
    }
    
    variable "location" {
      description = "The Azure region where the resources will be created."
      type = string
      default = "eastus"
    }
    
    variable "aks_cluster_name" {
      description = "The name of the AKS cluster."
      type = string
      default = "aks-private-advanced"
    }
    
    variable "vnet_name" {
      description = "The name of the virtual network."
      type = string
      default = "vnet-private-aks"
    }
    
    variable "subnet_name" {
      description = "The name of the subnet used by AKS."
      type = string
      default = "snet-aks"
    }
    
  3. Добавьте следующий код в main.tf для создания группы ресурсов Azure, виртуальной сети и подсети:

    resource "azurerm_resource_group" "this" {
      name = var.resource_group_name
      location = var.location
    }
    
    resource "azurerm_virtual_network" "this" {
      name = var.vnet_name
      location = azurerm_resource_group.this.location
      resource_group_name = azurerm_resource_group.this.name
      address_space = ["10.0.0.0/8"]
    }
    
    resource "azurerm_subnet" "aks" {
      name = var.subnet_name
      resource_group_name  = azurerm_resource_group.this.name
      virtual_network_name = azurerm_virtual_network.this.name
      address_prefixes = ["10.240.0.0/16"]
    }
    
  4. Добавьте следующий код в main.tf, чтобы создать кластер AKS с расширенными возможностями сетей.

    resource "azurerm_kubernetes_cluster" "this" {
      name = var.aks_cluster_name
      location = azurerm_resource_group.this.location
      resource_group_name = azurerm_resource_group.this.name
      dns_prefix = "privateadvancedaks"
    
      private_cluster_enabled = true
    
      default_node_pool {
        name = "system"
        node_count = 1
        vm_size = "Standard_DS2_v2"
        vnet_subnet_id = azurerm_subnet.aks.id
      }
    
      identity {
        type = "SystemAssigned"
      }
    
      network_profile {
        load_balancer_sku = "standard"
        network_plugin = "azure"
        dns_service_ip = "10.2.0.10"
        service_cidr = "10.2.0.0/24"
      }
    }
    
  5. Выполните действия по инициализации Terraform, форматированию и проверке конфигурации Terraform, созданию плана выполнения Terraform, применению конфигурации Terraform и подключению к кластеру AKS.

Использование пользовательских доменов с частными кластерами AKS

Если вы хотите настроить пользовательские домены, которые могут быть разрешены только внутри системы, см. раздел "Использование пользовательских доменов".

Деактивация публичного полного доменного имени на частном кластере AKS

Выключить общедоступное полное доменное имя на новом кластере

Отключите общедоступное полное доменное имя при создании частного кластера AKS, используя команду az aks create с флагом --disable-public-fqdn.

Ключевые параметры в этой команде:

  • --disable-public-fqdn: отключает полностью квалифицированное доменное имя (FQDN) для сервера API.
  • --assign-identity <resource-id>: указывает управляемую идентичность, которую следует использовать для кластера.
  • --private-dns-zone [system|none]: указывает частную зону DNS, используемую для кластера. system — значение по умолчанию при настройке частной зоны DNS. Если не указано --private-dns-zone, AKS создает частную зону DNS в группе ресурсов узла. none отключает создание частной зоны DNS.
az aks create \
    --name <private-cluster-name> \
    --resource-group <private-cluster-resource-group> \
    --load-balancer-sku standard \
    --enable-private-cluster \
    --assign-identity <resource-id> \
    --private-dns-zone [system|none] \
    --disable-public-fqdn \
    --generate-ssh-keys
  1. Выполните шаги 1–3 в статье "Создание частного кластера AKS с расширенными сетями" или создание частного кластера AKS сбазовой сетью по умолчанию для настройки конфигурации Terraform и создания необходимых ресурсов в зависимости от вашего сценария. В этом примере используется расширенная сеть.

  2. Добавьте следующий код в main.tf, чтобы создать частный кластер AKS с удостоверением, назначенным пользователем, и отключить общедоступное полное доменное имя.

    resource "azurerm_user_assigned_identity" "aks" {
      name = "id-private-aks-public-fqdn-off"
      location = azurerm_resource_group.this.location
      resource_group_name = azurerm_resource_group.this.name
    }
    resource "azurerm_kubernetes_cluster" "this" {
      name = var.aks_cluster_name
      location = azurerm_resource_group.this.location
      resource_group_name = azurerm_resource_group.this.name
      dns_prefix = "privateaks"
      private_cluster_enabled = true
      private_cluster_public_fqdn_enabled = false
    
      private_dns_zone_id = "System"
    
      default_node_pool {
        name = "system"
        node_count = 1
        vm_size = "Standard_DS2_v2"
        vnet_subnet_id = azurerm_subnet.aks.id
      }
      identity {
        type = "UserAssigned"
        identity_ids = [azurerm_user_assigned_identity.aks.id]
      }
      network_profile {
        load_balancer_sku = "standard"
        network_plugin = "azure"
        dns_service_ip = "10.2.0.10"
        service_cidr = "10.2.0.0/24"
      }
    }
    
  3. Выполните действия по инициализации Terraform, форматированию и проверке конфигурации Terraform, созданию плана выполнения Terraform, применению конфигурации Terraform и подключению к кластеру AKS.

Отключить общедоступное полное доменное имя (FQDN) в существующем кластере

Отключите публичное полное доменное имя в существующем кластере AKS с помощью команды az aks update и флага --disable-public-fqdn.

Ключевые параметры в этой команде:

  • --disable-public-fqdn: отключает полностью квалифицированное доменное имя (FQDN) для сервера API.
az aks update \
    --name <private-cluster-name> \
    --resource-group <private-cluster-resource-group> \
    --disable-public-fqdn
  1. Добавьте следующий код в существующий main.tf, чтобы отключить публичное FQDN в имеющемся кластере AKS. В этом примере используется расширенная сеть. Его можно изменить, чтобы использовать базовую сеть по умолчанию, изменив соответствующие ресурсы и параметры Terraform.

    resource "azurerm_kubernetes_cluster" "this" {
      name = var.aks_cluster_name
      location = azurerm_resource_group.this.location
      resource_group_name = azurerm_resource_group.this.name
      dns_prefix = "privateaks"
    
      private_cluster_enabled = true
      private_cluster_public_fqdn_enabled = false
      private_dns_zone_id = "System"
    
      default_node_pool {
        name = "system"
        node_count = 1
        vm_size = "Standard_DS2_v2"
        vnet_subnet_id = azurerm_subnet.aks.id
      }
    
      identity {
        type = "UserAssigned"
        identity_ids = [azurerm_user_assigned_identity.aks.id]
      }
    
      network_profile {
        load_balancer_sku = "standard"
        network_plugin = "azure"
        dns_service_ip = "10.2.0.10"
        service_cidr = "10.2.0.0/24"
      }
    }
    
  2. Примените обновленную конфигурацию Terraform, используя команды terraform plan и terraform apply.

    terraform plan
    terraform apply
    

Параметры конфигурации для частного DNS

Вы можете настроить частные параметры DNS для частного кластера AKS с помощью Azure CLI (с параметром --private-dns-zone) или шаблоном Azure Resource Manager (ARM) (с свойством privateDNSZone). В следующей таблице описаны параметры, доступные для --private-dns-zone параметра или privateDNSZone свойства:

Setting Description
system Значение по умолчанию при настройке частной зоны DNS. Если не указано --private-dns-zone / privateDNSZone, AKS создает частную зону DNS в группе ресурсов узла.
none Если задано значение --private-dns-zone / privateDNSZonenone, AKS не создает частную зону DNS.
<custom-private-dns-zone-resource-id> Чтобы использовать этот параметр, необходимо создать частную зону DNS в следующем формате для глобального облака Azure: privatelink.<region>.azmk8s.io или <subzone>.privatelink.<region>.azmk8s.io. Для дальнейшего использования вам потребуется идентификатор ресурса частной зоны DNS. Кроме того, вам потребуется назначаемое пользователем удостоверение или служебный принципал с ролями Частная зона DNS Zone Contributor и Network Contributor. Для кластеров, использующих интеграцию виртуальной сети сервера API, частная зона DNS поддерживает формат именования private.<region>.azmk8s.io или <subzone>.private.<region>.azmk8s.io. Вы не можете изменить или удалить ресурс этих ресурсов после создания кластера, так как это может привести к проблемам с производительностью и сбоям обновления кластера. Можно использовать --fqdn-subdomain <subdomain> вместе с <custom-private-dns-zone-resource-id> только для предоставления возможностей поддомена privatelink.<region>.azmk8s.io. Если вы указываете подзону, для имени задано 32 символьное <subzone> ограничение.

Рекомендации по частному DNS

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

  • Если частная зона DNS находится в подписке, отличной от кластера AKS, необходимо зарегистрировать поставщика Майкрософт.ContainerService Azure в обеих подписках.
  • Если кластер AKS настроен с помощью учетной записи службы Active Directory, AKS не поддерживает использование системно назначаемого управляемого удостоверения с настраиваемой частной зоной DNS. Кластер должен использовать аутентификацию с помощью управляемого удостоверения, назначаемого пользователем.

Создание частного кластера AKS с частной зоной DNS

Создайте частный кластер AKS с частной зоной DNS с помощью az aks create команды.

Ключевые параметры в этой команде:

  • --enable-private-cluster: включает режим частного кластера.
  • --private-dns-zone [system|none]: настраивает частную зону DNS для кластера. system — значение по умолчанию при настройке частной зоны DNS. Если не указано --private-dns-zone, AKS создает частную зону DNS в группе ресурсов узла. none отключает создание частной зоны DNS.
  • --assign-identity <resource-id>: идентификатор ресурса управляемой идентичности, назначаемой пользователем, с ролями Частной DNS Зоны Контрибьютора и Сетевого Контрибьютора.
az aks create \
    --name <private-cluster-name> \
    --resource-group <private-cluster-resource-group> \
    --load-balancer-sku standard \
    --enable-private-cluster \
    --assign-identity <resource-id> \
    --private-dns-zone [system|none] \
    --generate-ssh-keys
  1. Выполните шаги 1–3 в статье "Создание частного кластера AKS с расширенными сетями" или создание частного кластера AKS сбазовой сетью по умолчанию для настройки конфигурации Terraform и создания необходимых ресурсов в зависимости от вашего сценария. В этом примере используется расширенная сеть.

  2. Добавьте следующий код в main.tf, чтобы создать частный кластер AKS с приватной зоной DNS, управляемой AKS:

    resource "azurerm_kubernetes_cluster" "this" {
     name                = var.aks_cluster_name
     location            = azurerm_resource_group.this.location
     resource_group_name = azurerm_resource_group.this.name
     dns_prefix          = "aks-system-dns"
     private_cluster_enabled = true
     private_dns_zone_id     = "System"
     default_node_pool {
       name           = "system"
       node_count     = 1
       vm_size        = "Standard_DS2_v2"
       vnet_subnet_id = azurerm_subnet.aks.id
     }
     identity {
       type = "SystemAssigned"
     }
     network_profile {
       network_plugin    = "azure"
       load_balancer_sku = "standard"
       dns_service_ip    = "10.2.0.10"
       service_cidr      = "10.2.0.0/24"
     }
    }
    
  3. Выполните действия по инициализации Terraform, форматированию и проверке конфигурации Terraform, созданию плана выполнения Terraform, применению конфигурации Terraform и подключению к кластеру AKS.

Создание частного кластера AKS без частной зоны DNS

  1. Выполните шаги 1–3 в статье "Создание частного кластера AKS с расширенными сетями" или создание частного кластера AKS сбазовой сетью по умолчанию для настройки конфигурации Terraform и создания необходимых ресурсов в зависимости от вашего сценария. В этом примере используется расширенная сеть.

  2. Добавьте следующий код в main.tf, чтобы создать кластер AKS без частной зоны DNS:

    resource "azurerm_kubernetes_cluster" "this" {
     name                = var.aks_cluster_name
     location            = azurerm_resource_group.this.location
     resource_group_name = azurerm_resource_group.this.name
     dns_prefix          = "aks-no-dns"
     private_cluster_enabled = true
     private_dns_zone_id     = "None"
     default_node_pool {
       name           = "system"
       node_count     = 1
       vm_size        = "Standard_DS2_v2"
       vnet_subnet_id = azurerm_subnet.aks.id
     }
     identity {
       type = "SystemAssigned"
     }
     network_profile {
       network_plugin    = "azure"
       load_balancer_sku = "standard"
       dns_service_ip    = "10.2.0.10"
       service_cidr      = "10.2.0.0/24"
     }
    }
    
  3. Выполните действия по инициализации Terraform, форматированию и проверке конфигурации Terraform, созданию плана выполнения Terraform, применению конфигурации Terraform и подключению к кластеру AKS.

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

Создайте частный кластер AKS с настраиваемой частной зоной DNS или подзоной az aks create с помощью команды.

Ключевые параметры в этой команде:

  • --enable-private-cluster: включает режим частного кластера.
  • --private-dns-zone [<custom-private-dns-zone-resource-id>|<custom-private-dns-subzone-resource-id>]: идентификатор ресурса существующей частной зоны DNS или подзоны в следующем формате Azure для глобального облака: privatelink.<region>.azmk8s.io или <subzone>.privatelink.<region>.azmk8s.io.
  • --assign-identity <resource-id>: идентификатор ресурса управляемой удостоверенности, назначенной пользователем, с ролями Участник частной зоны DNS и Участник сети.
az aks create \
    --name <private-cluster-name> \
    --resource-group <private-cluster-resource-group> \
    --load-balancer-sku standard \
    --enable-private-cluster \
    --assign-identity <resource-id> \
    --private-dns-zone [<custom-private-dns-zone-resource-id>|<custom-private-dns-subzone-resource-id>] \
    --generate-ssh-keys

При использовании настраиваемой частной зоны DNS вы несете ответственность за создание инфраструктуры DNS и управление ею вместо того, чтобы полагаться на управляемые Azure DNS. Это включает создание зоны DNS, связывание ее с виртуальной сетью и назначение необходимых разрешений для управления записями AKS.

Для пользовательских конфигураций DNS необходимо использовать управляемое удостоверение, назначаемое пользователем, с ролями Частная зона DNS Zone Contributor и Network Contributor.

  1. Выполните шаги 1–3 в статье "Создание частного кластера AKS с расширенными сетями" или создание частного кластера AKS сбазовой сетью по умолчанию для настройки конфигурации Terraform и создания необходимых ресурсов в зависимости от вашего сценария. В этом примере используется расширенная сеть.

  2. Добавьте код в main.tf, чтобы создать частный кластер AKS с настраиваемой частной зоной DNS или подзоной.

    resource "azurerm_user_assigned_identity" "aks" {
     name                = "aks-custom-dns-id"
     location            = azurerm_resource_group.this.location
     resource_group_name = azurerm_resource_group.this.name
    }
    resource "azurerm_private_dns_zone" "aks" {
     name                = "privatelink.eastus.azmk8s.io"
     resource_group_name = azurerm_resource_group.this.name
    }
    resource "azurerm_private_dns_zone_virtual_network_link" "link" {
     name                  = "aks-dns-link"
     resource_group_name   = azurerm_resource_group.this.name
     private_dns_zone_name = azurerm_private_dns_zone.aks.name
     virtual_network_id    = azurerm_virtual_network.this.id
    }
    resource "azurerm_role_assignment" "dns" {
     scope                = azurerm_private_dns_zone.aks.id
     role_definition_name = "Private DNS Zone Contributor"
     principal_id         = azurerm_user_assigned_identity.aks.principal_id
    }
    resource "azurerm_role_assignment" "network" {
     scope                = azurerm_virtual_network.this.id
     role_definition_name = "Network Contributor"
     principal_id         = azurerm_user_assigned_identity.aks.principal_id
    }
    resource "azurerm_kubernetes_cluster" "this" {
     name                = var.aks_cluster_name
     location            = azurerm_resource_group.this.location
     resource_group_name = azurerm_resource_group.this.name
     dns_prefix          = "aks-custom-dns"
     private_cluster_enabled = true
     private_dns_zone_id     = azurerm_private_dns_zone.aks.id
     default_node_pool {
       name           = "system"
       node_count     = 1
       vm_size        = "Standard_DS2_v2"
       vnet_subnet_id = azurerm_subnet.aks.id
     }
     identity {
       type         = "UserAssigned"
       identity_ids = [azurerm_user_assigned_identity.aks.id]
     }
     network_profile {
       network_plugin    = "azure"
       load_balancer_sku = "standard"
       dns_service_ip    = "10.2.0.10"
       service_cidr      = "10.2.0.0/24"
     }
     depends_on = [
       azurerm_role_assignment.dns,
       azurerm_role_assignment.network
     ]
    }
    
  3. Выполните действия по инициализации Terraform, форматированию и проверке конфигурации Terraform, созданию плана выполнения Terraform, применению конфигурации Terraform и подключению к кластеру AKS.

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

Создайте частный кластер AKS с настраиваемой частной зоной DNS и поддоменом az aks create с помощью команды.

Ключевые параметры в этой команде:

  • --enable-private-cluster: включает режим частного кластера.
  • --private-dns-zone <custom-private-dns-zone-resource-id>: идентификатор ресурса существующей частной зоны DNS в следующем формате для глобального облака Azure: privatelink.<region>.azmk8s.io.
  • --fqdn-subdomain <subdomain>: поддомен, используемый для полного доменного имени кластера в настраиваемой частной зоне DNS.
  • --assign-identity <resource-id>: идентификатор ресурса управляемой удостоверенности, назначенной пользователем, с ролями Участник частной зоны DNS и Участник сети.
az aks create \
    --name <private-cluster-name> \
    --resource-group <private-cluster-resource-group> \
    --load-balancer-sku standard \
    --enable-private-cluster \
    --assign-identity <resource-id> \
    --private-dns-zone <custom-private-dns-zone-resource-id> \
    --fqdn-subdomain <subdomain> \
    --generate-ssh-keys
  1. Выполните шаги 1–3 в статье "Создание частного кластера AKS с расширенными сетями" или создание частного кластера AKS сбазовой сетью по умолчанию для настройки конфигурации Terraform и создания необходимых ресурсов в зависимости от вашего сценария. В этом примере используется расширенная сеть.

  2. Добавьте следующий код в main.tf, чтобы создать частный кластер AKS с пользовательской частной зоной DNS и поддоменом.

    resource "azurerm_kubernetes_cluster" "this" {
     name                = var.aks_cluster_name
     location            = azurerm_resource_group.this.location
     resource_group_name = azurerm_resource_group.this.name
     dns_prefix          = "aks-subdomain"
     private_cluster_enabled = true
     private_dns_zone_id     = azurerm_private_dns_zone.aks.id
     fqdn_subdomain          = "team1"
     default_node_pool {
       name           = "system"
       node_count     = 1
       vm_size        = "Standard_DS2_v2"
       vnet_subnet_id = azurerm_subnet.aks.id
     }
     identity {
       type         = "UserAssigned"
       identity_ids = [azurerm_user_assigned_identity.aks.id]
     }
     network_profile {
       network_plugin    = "azure"
       load_balancer_sku = "standard"
       dns_service_ip    = "10.2.0.10"
       service_cidr      = "10.2.0.0/24"
     }
    }
    
  3. Выполните действия по инициализации Terraform, форматированию и проверке конфигурации Terraform, созданию плана выполнения Terraform, применению конфигурации Terraform и подключению к кластеру AKS.

Обновление существующего частного кластера AKS из частной зоны DNS до общедоступной

Вы можете обновить только от byo (принести свой собственный) или system в none. Никакое другое сочетание значений обновления не поддерживается.

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

При обновлении частного кластера с byo или system на none, узлы агента изменяются на использование общедоступного полного доменного имени. В кластере AKS, использующего Azure Virtual Machine Scale Sets, выполняется обновление образа node для обновления узлов с общедоступным полным доменным именем.

Обновите частный кластер от byo или system до none, используя команду az aks update с параметром --private-dns-zone, установленным на none.

az aks update \
    --name <private-cluster-name> \
    --resource-group <private-cluster-resource-group> \
    --private-dns-zone none
  1. Добавьте следующий код в существующий main.tf , чтобы обновить частный кластер AKS из частной зоны DNS на общедоступный. В этом примере используется расширенная сеть. Его можно изменить, чтобы использовать базовую сеть по умолчанию, изменив соответствующие ресурсы и параметры Terraform.

    resource "azurerm_kubernetes_cluster" "this" {
     name                = var.aks_cluster_name
     location            = azurerm_resource_group.this.location
     resource_group_name = azurerm_resource_group.this.name
     dns_prefix          = "aks-update"
     private_cluster_enabled = true
     private_dns_zone_id     = "None"
     default_node_pool {
       name           = "system"
       node_count     = 1
       vm_size        = "Standard_DS2_v2"
       vnet_subnet_id = azurerm_subnet.aks.id
     }
     identity {
       type         = "UserAssigned"
       identity_ids = [azurerm_user_assigned_identity.aks.id]
     }
     network_profile {
       network_plugin    = "azure"
       load_balancer_sku = "standard"
       dns_service_ip    = "10.2.0.10"
       service_cidr      = "10.2.0.0/24"
     }
    }
    
  2. Примените обновленную конфигурацию Terraform, используя команды terraform plan и terraform apply.

    terraform plan
    terraform apply
    

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

Инициализируйте Terraform в каталоге, содержащем ваш файл main.tf, с помощью команды terraform init. Эта команда загружает поставщика (провайдера) Azure, необходимого для управления ресурсами Azure с помощью Terraform.

terraform init

Форматирование и проверка конфигурации Terraform

Отформатируйте и проверьте конфигурацию Terraform с помощью terraform fmt команд и terraform validate команд.

terraform fmt
terraform validate

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

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

terraform plan -var="subscription_id=<your-subscription-id>"

Применение конфигурации Terraform

После проверки и подтверждения плана выполнения примените конфигурацию Terraform с помощью terraform apply команды. Эта команда создает или изменяет ресурсы, определенные в файле main.tf в подписке Azure.

terraform apply -var="subscription_id=<your-subscription-id>"

Настройка kubectl для подключения к частному кластеру AKS

Чтобы управлять кластером Kubernetes, используйте клиент командной строки Kubernetes, kubectl. kubectl уже установлен, если вы используете Azure Cloud Shell. Чтобы установить kubectl локально, используйте az aks install-cli команду.

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

    az aks get-credentials --resource-group <private-cluster-resource-group> --name <private-cluster-name>
    
  2. Проверьте подключение к кластеру kubectl get с помощью команды. Эта команда возвращает список узлов кластера.

    kubectl get nodes
    

    Команда возвращает выходные данные, аналогичные следующему примеру выходных данных:

    NAME                                STATUS   ROLES   AGE    VERSION
    aks-nodepool1-12345678-vmss000000   Ready    agent   3h6m   v1.15.11
    aks-nodepool1-12345678-vmss000001   Ready    agent   3h6m   v1.15.11
    aks-nodepool1-12345678-vmss000002   Ready    agent   3h6m   v1.15.11