创建专用 Azure Kubernetes 服务 (AKS) 群集

本文介绍如何使用 Azure CLI 或 Terraform 部署基于专用链接的 AKS 群集。 如果有兴趣创建 AKS 群集而无需专用链接或隧道,请参阅[使用 API 服务器 VNet 集成创建 Azure Kubernetes 服务(AKS)群集][create-aks-cluster-api-vnet-integration]。

AKS 中的专用群集概述

在专用群集中,控制平面或 API 服务器具有内部 IP 地址,这些地址在 RFC1918 - 专用 Internet 的地址分配文档中定义。 使用专用群集可以确保 API 服务器与节点池之间的网络流量仅保留在专用网络上。

控制平面或 API 服务器位于 AKS 管理的 Azure 资源组中,而你的群集或节点池位于你的资源组中。 服务器和群集或节点池可以通过 API 服务器虚拟网络中的 Azure 专用链接服务 以及 AKS 群集子网上公开的专用终结点相互通信。

创建专用 AKS 群集时,AKS 默认会创建具有相应 DNS 区域的专用和公用完全限定域名(FQDN)。 有关详细的 DNS 配置选项,请参阅 “配置专用 DNS 区域”、“专用 DNS 子区域”或“自定义子域”。

区域可用性

私有群集在提供AKS 支持的公共区域、Azure 中国云和由世纪互联运营的 Azure 区域中可用。

重要

所有Microsoft Defender for Cloud 功能将于 2026 年 8 月 18 日正式停用在中国 Azure 区域。 由于即将停用,Azure 在中国的客户将无法再将新订阅加入该服务。 2025年8月18日(即公布停用日期)之前未被接入Microsoft Defender for Cloud服务的任何订阅均为新订阅。 有关停用的详细信息,请参阅 由世纪互联运营的 Azure 中关于 Microsoft Defender for Cloud 停用的公告

客户应与由世纪互联运营的 Azure 的帐户代表合作,评估此停用对自身运营的影响。

专用 AKS 群集的先决条件

  • 一个有效的 “Azure” 订阅。 如果没有 Azure 订阅,可在开始前创建一个试用帐户

  • 使用 az account set 命令设置订阅上下文。 例如:

    az account set --subscription "00000000-0000-0000-0000-000000000000"
    
  • Azure CLI 2.28.0 或更高版本。 使用 az --version 命令查找版本。 如果需要进行安装或升级,请参阅安装 Azure CLI

  • 如果使用 Azure 资源管理器(ARM)或 Azure REST API,AKS API 版本必须为 2021-05-01 或更高版本

  • 若要使用自定义 DNS 服务器,请将 Azure 公共 IP 地址 168.63.129.16 添加为自定义 DNS 服务器中的上游 DNS 服务器,并确保将此公共 IP 地址添加为 第一个 DNS 服务器。 有关 Azure IP 地址的详细信息,请参阅 IP 地址 168.63.129.16 是什么?

  • 如果需要在专用 AKS 群集上启用 Azure 容器注册表,请 为群集虚拟网络(VNet)中的容器注册表设置专用链接,或在容器注册表的 VNet 与专用群集的 VNet 之间建立对等互连。

  • 已安装 kubectl 。 您可以使用 az aks install-cli 命令在本地安装它。

  • 在本地安装 Terraform。 有关安装说明,请参阅 安装 Terraform

重要

2025 年 11 月 30 日开始,Azure Kubernetes 服务(AKS)不再支持或提供 Azure Linux 2.0 安全更新。 Azure Linux 2.0 节点映像在 202512.06.0 版中冻结。 从 2026 年 3 月 31 日开始,将删除节点映像,并且无法缩放节点池。 通过将 节点池升级到 受支持的 Kubernetes 版本或迁移到 osSku AzureLinux3,迁移到受支持的 Azure Linux 版本。 有关详细信息,请参阅 停用 GitHub 问题和Azure 更新停用公告。 若要随时了解公告和更新,请关注AKS 发行说明

局限性

  • IP 授权范围仅适用于公共 API 服务器。 不能将这些范围应用于专用 API 服务器终结点。
  • Azure 专用链接服务限制适用于专用群集。
  • 不支持具有专用群集的 Azure DevOps Microsoft 托管的代理。 请考虑使用自托管代理
  • 删除或修改客户子网中的专用终结点会导致群集停止运行。
  • 仅标准 Azure 负载均衡器支持 Azure 专用链接服务。 不支持基本 Azure 负载均衡器。

专用 AKS 群集的中心辐射结构和自定义 DNS

中心和分支体系结构通常用于在 Azure 中部署网络。 在许多此类部署中,会将分支 VNet 中的 DNS 设置配置为引用中心 DNS 转发器,以允许本地和基于 Azure 的 DNS 解析。

下图说明了一个具有自定义 DNS 的专用的 AKS 集群的中心辐射式架构:

专用群集中心和分支

  • 创建专用群集时,默认在群集管理的资源组中创建专用终结点(1)和专用 DNS 区域(2)。 群集使用专用区域中的 A 记录来解析专用终结点的 IP,以便与 API 服务器通信。
  • 专用 DNS 区域仅链接到群集节点附加到的 VNet(3),这意味着专用终结点只能由该链接 VNet 中的主机解析。 在未在 VNet 上配置自定义 DNS(默认)时,由于链接,主机指向 168.63.129.16,它可以解析专用 DNS 区域中的记录,因此可以正常工作。
  • 如果保留默认的专用 DNS 区域行为,即使该区域已链接到主枢纽 VNet,AKS 仍会尝试将区域直接链接到托管群集的辐射型 VNet。
    • 在使用自定义 DNS 服务器的分支 VNet 中,如果群集的托管标识在该分支 VNet 上缺少“网络参与者”角色,则此操作可能会失败。 若要防止失败,请选择以下受支持的配置 之一
      • 自定义专用 DNS 区域:提供现有的专用区域并将其设置为 privateDNSZone / --private-dns-zone 其资源 ID。 将该区域链接到相应的 VNet(例如中心 VNet),并将publicDNS设置为false,使用--disable-public-fqdn
      • 仅限公共 DNS:通过设置 并将 保持其默认值(),同时不使用 来禁用专用区域创建。
  • 如果将 自带 (BYO) 路由表与 kubenet 和 BYO DNS 与专用群集配合使用,则群集创建会失败。 你需要在群集创建操作失败之后将节点资源组中的 RouteTable 关联到子网,以使创建能够成功。

使用自定义 DNS 的专用 AKS 群集的限制

  • privateDNSZone / --private-dns-zone none publicDNS: 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订阅 ID、资源组名称、位置和 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>:VNet 中现有子网的资源 ID。
  • --dns-service-ip <dns-service-ip>:Kubernetes 服务地址范围中可用于群集 DNS 服务的可用 IP 地址。 例如,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订阅 ID、资源组名称、位置、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 = "chinanorth3"
    }
    
    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 资源组、VNet 和子网:

    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(Azure Kubernetes 服务)群集上禁用公共 FQDN

在新群集上禁用公共 FQDN

在创建专用 AKS 群集时使用 az aks create 命令和 --disable-public-fqdn 标志禁用公共 FQDN。

此命令中的关键参数

  • --disable-public-fqdn:禁用 API 服务器的公共完全限定域名(FQDN)。
  • --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. 按照创建 具有高级网络的专用 AKS 群集创建具有默认基本网络的专用 AKS 群集 中的步骤 1-3 设置 Terraform 配置,并根据方案创建必要的资源。 此示例使用高级网络。

  2. 添加以下代码以 main.tf 创建具有用户分配标识和禁用公共 FQDN 的专用 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

使用带 az aks update 标志的 --disable-public-fqdn 命令在现有 AKS 群集上禁用公共 FQDN。

此命令中的关键参数

  • --disable-public-fqdn:禁用 API 服务器的公共完全限定域名(FQDN)。
az aks update \
    --name <private-cluster-name> \
    --resource-group <private-cluster-resource-group> \
    --disable-public-fqdn
  1. 将以下代码添加到现有 main.tf 代码,以在现有 AKS 群集上禁用公共 FQDN。 此示例使用高级网络。 可以通过更改相关的 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 planterraform apply 命令应用更新后的 Terraform 配置。

    terraform plan
    terraform apply
    

专用 DNS 的配置选项

可以使用 Azure CLI(带 --private-dns-zone 参数)或 Azure 资源管理器(ARM)模板(使用 privateDNSZone 属性)为专用 AKS 群集配置专用 DNS 设置。 下表概述了可用于 --private-dns-zone 参数/ privateDNSZone 属性的选项:

设置 Description
system 配置专用 DNS 区域时的默认值。 如果省略 --private-dns-zone / privateDNSZone,AKS 会在节点资源组中创建专用 DNS 区域。
none 如果将 设置为 ,AKS 不会创建专用 DNS 区域。
<custom-private-dns-zone-resource-id> 若要使用此参数,需要为 Azure 全局云创建采用以下格式的专用 DNS 区域: privatelink.<region>.cx.prod.service.azk8s.cn<subzone>.privatelink.<region>.cx.prod.service.azk8s.cn。 需要专用 DNS 区域的资源 ID 供将来使用。 还需要具有专用 DNS 区域参与者网络参与者角色的用户分配标识或服务主体。 对于使用 API 服务器 VNet 集成的群集,专用 DNS 区域支持命名格式 private.<region>.cx.prod.service.azk8s.cn<subzone>.private.<region>.cx.prod.service.azk8s.cn创建群集后,无法更改或删除这些资源资源,因为它可能会导致性能问题和群集升级失败。 只能将 --fqdn-subdomain <subdomain><custom-private-dns-zone-resource-id> 结合使用,以便为 privatelink.<region>.cx.prod.service.azk8s.cn 提供子域功能。 如果要指定子区域,则名称有 32 个字符的限制 <subzone>

专用 DNS 的注意事项

为专用 AKS 群集配置专用 DNS 时,请记住以下注意事项:

  • 如果专用 DNS 区域与 AKS 群集位于不同的订阅中,需要在这两个订阅中注册 Azure 提供程序 Microsoft.ContainerService
  • 如果为 AKS 群集配置了 Active Directory 服务主体,则 AKS 不支持将系统分配的托管标识用于自定义专用 DNS 区域。 群集必须使用用户分配的托管标识身份验证

创建具有专用 DNS 区域的专用 AKS 群集

使用 az aks create 命令创建具有专用 DNS 区域的专用 AKS 群集。

此命令中的关键参数

  • --enable-private-cluster:启用专用群集模式。
  • --private-dns-zone [system|none]:配置群集的专用 DNS 区域。 system 是配置专用 DNS 区域时的默认值。 如果省略 --private-dns-zone,AKS 会在节点资源组中创建专用 DNS 区域。 none 禁用创建专用 DNS 区域。
  • --assign-identity <resource-id>:具有 专用 DNS 区域参与者网络参与者 角色的用户分配的托管身份的资源 ID。
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. 按照创建 具有高级网络的专用 AKS 群集创建具有默认基本网络的专用 AKS 群集 中的步骤 1-3 设置 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 群集

在没有专用 DNS 区域的情况下创建专用 AKS 群集

  1. 按照创建 具有高级网络的专用 AKS 群集创建具有默认基本网络的专用 AKS 群集 中的步骤 1-3 设置 Terraform 配置,并根据方案创建必要的资源。 此示例使用高级网络。

  2. 添加以下代码以 main.tf 创建没有专用 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-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 群集

创建具有自定义专用 DNS 区域和专用 DNS 子区域的专用 AKS 群集

使用 az aks create 命令创建具有自定义专用 DNS 区域或子区域的专用 AKS 群集。

此命令中的关键参数

  • --enable-private-cluster:启用专用群集模式。
  • --private-dns-zone [<custom-private-dns-zone-resource-id>|<custom-private-dns-subzone-resource-id>]:现有专用 DNS 区域或子区域的资源 ID,适用于 Azure 全局云,采用以下格式:privatelink.<region>.cx.prod.service.azk8s.cn<subzone>.privatelink.<region>.cx.prod.service.azk8s.cn
  • --assign-identity <resource-id>:具有 专用 DNS 区域参与者网络参与者 角色的用户分配的托管身份的资源 ID。
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 区域、将其链接到 VNet,以及分配 AKS 管理记录所需的权限。

对于自定义 DNS 配置,必须使用具有 专用 DNS 区域参与者网络参与者 角色的用户分配托管标识。

  1. 按照创建 具有高级网络的专用 AKS 群集创建具有默认基本网络的专用 AKS 群集 中的步骤 1-3 设置 Terraform 配置,并根据方案创建必要的资源。 此示例使用高级网络。

  2. 添加代码到 main.tf 中以创建具有自定义私有 DNS 域或子域的私人 AKS 群集:

    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.cx.prod.service.azk8s.cn"
     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 群集

创建具有自定义专用 DNS 区域和自定义子域的专用 AKS 群集

使用 az aks create 命令创建具有自定义专用 DNS 区域和子域的专用 AKS 群集。

此命令中的关键参数

  • --enable-private-cluster:启用专用群集模式。
  • --private-dns-zone <custom-private-dns-zone-resource-id>:用于 Azure 全局云的现有专用 DNS 区域的资源 ID,格式如下:privatelink.<region>.cx.prod.service.azk8s.cn
  • --fqdn-subdomain <subdomain>:用于自定义专用 DNS 区域中群集 FQDN 的子域。
  • --assign-identity <resource-id>:具有 专用 DNS 区域参与者网络参与者 角色的用户分配的托管身份的资源 ID。
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. 按照创建 具有高级网络的专用 AKS 群集创建具有默认基本网络的专用 AKS 群集 中的步骤 1-3 设置 Terraform 配置,并根据方案创建必要的资源。 此示例使用高级网络。

  2. 将以下代码添加到main.tf以创建具有自定义私有 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-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。 不支持更新值的其他组合。

警告

byosystem 将专用群集更新为 none 时,代理节点将更改为使用公共 FQDN。 在使用 Azure 虚拟机规模集的 AKS 群集中,执行节点映像升级,以通过公共 FQDN 更新您的节点。

使用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 planterraform apply 命令应用更新后的 Terraform 配置。

    terraform plan
    terraform apply
    

初始化 Terraform

使用main.tf命令在包含terraform init文件的目录中初始化 Terraform。 此命令下载用于通过 Terraform 管理 Azure 资源所需的 Azure 提供程序。

terraform init

格式化并验证 Terraform 配置

使用 terraform fmtterraform validate 命令格式化和验证 Terraform 配置。

terraform fmt
terraform validate

创建 Terraform 执行计划

使用 terraform plan 命令创建 Terraform 执行计划。 此命令显示 Terraform 将在 Azure 订阅中创建或修改的资源。

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

应用 Terraform 配置

查看并确认执行计划后,使用 terraform apply 命令应用 Terraform 配置。 此命令创建或修改 Azure 订阅中 main.tf 文件中定义的资源。

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

配置 kubectl 以连接到专用 AKS 群集

若要管理 Kubernetes 群集,请使用 Kubernetes 命令行客户端 kubectl。 如果使用的是 Azure Cloud Shell,则 kubectl 已安装。 若要在本地安装 kubectl,请使用 az aks install-cli 命令。

  1. 使用 kubectl 命令将 az aks get-credentials 配置为连接到你的 Kubernetes 群集。 此命令将下载凭据,并将 Kubernetes CLI 配置为使用这些凭据。

    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