共用方式為


建立私人 Azure Kubernetes 服務(AKS)叢集

本文將協助你使用 Azure CLI 或 Terraform 部署基於私有連結的 AKS 叢集。 如果你有興趣建立一個不需要私有連結或隧道的 AKS 叢集,請參考 Create a Azure Kubernetes Service (AKS)叢集並整合 API Server VNet

AKS 中私有叢集概述

在私人叢集中,控制平面或 API 伺服器都具有內部 IP 位址,如 RFC1918 - 私人網際網路的位址配置文件中所定義。 藉由使用私人叢集,您可以確保 API 伺服器與節點集區之間的網路流量只會保留在專用網路上。

控制平面或 API 伺服器位於 AKS 管理的 Azure 資源群組中,而你的叢集或節點池則屬於資源群組。 伺服器與叢集或節點池可以透過 API 伺服器虛擬網路中的 Azure Private Link 服務,以及暴露在 AKS 叢集子網上的私有端點彼此通訊。

當你建立私有 AKS 叢集時,AKS 預設會建立私有和公開的完全合格網域名稱(FQDN),並搭配相應的 DNS 區域。 關於詳細的 DNS 設定選項,請參閱 配置私人 DNS 區域、私人 DNS 子區域或自訂子網域

區域可用性

私人叢集在支援AKS的公共區域、Azure Government 及由 21Vianet 營運的 Microsoft Azure 區域中可用。

重要

所有 適用於雲端的 Microsoft Defender 功能將於 2026 年 8 月 18 日在中國 Azure 區域正式退役。 由於即將退休,中國 Azure 用戶將無法再重新加入服務的新訂閱。 新訂閱是指在 2025 年 8 月 18 日退休公告當天之前,尚未加入 適用於雲端的 Microsoft Defender 服務的任何訂閱。 欲了解更多關於停用的資訊,請參閱Microsoft Azure 由 21Vianet 營運的 適用於雲端的 Microsoft Defender 停用公告

客戶應與其由21Vianet營運的Microsoft Azure帳戶代表合作,評估此次退休對自身營運的影響。

私有 AKS 叢集的前提條件

  • 一個有效的 Azure 訂閱。 如果你沒有Azure訂閱,請在開始前建立一個free帳號

  • 請用指令 az account set 設定你的訂閱上下文。 例如:

    az account set --subscription "00000000-0000-0000-0000-000000000000"
    
  • Azure CLI version 2.28.0 或更高版本。 使用命令 az --version 查找您的版本。 如果你需要安裝或升級,請參考 安裝 Azure CLI

  • 若使用 Azure Resource Manager(ARM)或 Azure REST API,AKS API 版本必須是 2021-05-01 或更高

  • 要使用自訂 DNS 伺服器,請在自訂 DNS 伺服器中新增Azure公共 IP 位址 168.63.129.16 作為上游 DNS,並確保將這個公共 IP 位址加入為 first DNS伺服器。 欲了解更多關於Azure IP 位址的資訊,請參見 什麼是 IP 位址 168.63.129.16?

  • 已啟用 API Server VNet 整合的 AKS 叢集,也可以啟用私有叢集模式。 欲了解更多資訊,請參閱 啟用或停用具備 API Server VNet 整合的現有叢集的私有叢集模式

  • 如果你需要在私有 AKS 叢集啟用 Azure Container Registry,在叢集虛擬網路(VNet) 中為容器登錄檔設置私人連結,或在容器登錄檔的 VNet 與私有叢集的 VNet 之間建立對等連接。

  • Kubectl 已安裝。 您可以使用命令 az aks install-cli 在本機安裝它。

重要

2025 年 11 月 30 日起,Azure Kubernetes Service (AKS) 將不再支援或提供 Azure Linux 2.0 的安全更新。 Azure Linux 2.0 節點映像已凍結在 202512.06.0 發行版本。 自 2026 年 3 月 31 日起,節點映像將被移除,且你將無法擴展節點池。 遷移到支援的 Azure Linux 版本時,可以升級你的節點池到 支援的 Kubernetes 版本,或遷移到 osSku AzureLinux3。 欲了解更多資訊,請參閱 退休GitHub議題Azure 更新退休公告。 欲掌握最新公告與更新,請參考AKS發布說明

局限性

  • IP 授權範圍只適用於公開 API 伺服器。 你無法將這些範圍套用到私有 API 伺服器端點。
  • Azure Private Link 服務限制 適用於私有叢集。
  • Azure DevOps Microsoft 託管代理程式在私有叢集中不受支援。 請考慮使用自我裝載的代理程式
  • 刪除或修改客戶子網中的私有端點會導致叢集停止運作。
  • Azure Private Link 服務只支援標準 Azure Load Balancer。 基本的 Azure Load Balancer 不被支援。

具備自訂 DNS 的中樞與輪輻架構用於私人 AKS 叢集

樞紐輻射架構常用於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 區域中的記錄。
  • 如果您保留預設的私有 DNS 區域行為,AKS 會嘗試直接將該區域連結到託管叢集的分支 VNet,即便該區域已經連結到中心 VNet。
    • 在使用自訂 DNS 伺服器的輻射型 VNet 中,若叢集的管理身份在輻射型 VNet 上缺少 Network Contributor ,此操作可能會失敗。 為防止故障 ,請選擇 以下支援的配置之一:
      • 自訂私人 DNS 區域:提供一個現有的私人區域並設定 privateDNSZone / --private-dns-zone 其資源 ID。 將該區域連結到相應的 VNet(例如集線器 VNet),並設定 publicDNSfalse / 使用 --disable-public-fqdn
      • 僅限公用 DNS:將 privateDNSZone / --private-dns-zone 設定為 none 以停用建立私人區域,並publicDNS 保持在其預設值 (true)/不要使用 --disable-public-fqdn
  • 如果您在私人叢集中使用 kubenet 的自備 (BYO) 路由表,並同時自備 DNS,叢集建立將會失敗。 在叢集建立失敗之後,必須將節點資源群組中的 RouteTable 與子網路建立關聯,才能讓建立成功。

私有 AKS 叢集搭配自訂 DNS 的限制

  • 同時將 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 = "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資源群組、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 叢集上停用公用 FQDN

停用新叢集上的公用 FQDN

使用 az aks create 命令搭配 --disable-public-fqdn 旗標建立私人 AKS 叢集時,停用公用 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 以建立一個私人 AKS 叢集,並使用用戶指派的身份停用公開 FQDN:

    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 plan and terraform apply 指令套用更新後的 Terraform 設定。

    terraform plan
    terraform apply
    

私有 DNS 的設定選項

你可以使用 Azure CLI(使用 --private-dns-zone 參數)或 Azure Resource Manager(ARM)範本(帶有 privateDNSZone 屬性)來設定私有 AKS 叢集的私有 DNS 設定。 下表概述了參數 --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 區域的資源 ID 以備未來使用。 你還需要一個使用者指定的身份或服務主體,擁有 私用 DNS 區域貢獻者 以及 網路貢獻者 角色。 對於使用 API Server VNet 整合的叢集,私人 DNS 區域支援的命名格式為 private.<region>.azmk8s.io<subzone>.private.<region>.azmk8s.io建立叢集後,你無法更改或刪除這些資源資源,因為這可能導致效能問題和叢集升級失敗。 您可以僅使用 --fqdn-subdomain <subdomain> 搭配 <custom-private-dns-zone-resource-id> 來為 privatelink.<region>.azmk8s.io 提供子域功能。 如果你指定子區,<subzone> 名稱有32字元限制。

私有DNS的考量

在為私有 AKS 叢集設定私有 DNS 時,請考慮以下幾點:

  • 如果私有 DNS 區域與 AKS 叢集屬於不同的訂閱,你需要在兩個訂閱中註冊 Microsoft.ContainerService Azure 供應商。
  • 如果你的 AKS 叢集設定有 Active Directory 服務主體,AKS 不支援使用系統指定的管理身份,並設定自訂私有 DNS 區域。 叢集必須使用使用者指派的受控識別驗證

使用私人 DNS 區域建立私人 AKS 叢集

用這個 az aks create 指令建立一個私有 AKS 叢集,並設定私有 DNS 區域。

此指令的關鍵參數

  • --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 建立一個私有 AKS 叢集,並設定自訂的私有 DNS 區域或子區域。

此指令的關鍵參數

  • --enable-private-cluster: 啟用私有叢集模式。
  • --private-dns-zone [<custom-private-dns-zone-resource-id>|<custom-private-dns-subzone-resource-id>]:全球雲端現有私有 DNS 區域或子區域的資源 ID,格式為 Azureprivatelink.<region>.azmk8s.io<subzone>.privatelink.<region>.azmk8s.io
  • --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區域貢獻者Network 貢獻者

  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.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 叢集

使用自訂私人 DNS 區域和自訂子區域建立私人 AKS 叢集

用這個 az aks create 指令建立一個私有 AKS 叢集,並設定自訂的私有 DNS 區域和子網域。

此指令的關鍵參數

  • --enable-private-cluster: 啟用私有叢集模式。
  • --private-dns-zone <custom-private-dns-zone-resource-id>:現有私有 DNS 區域的資源 ID,格式適用於 Azure 的全球雲端:privatelink.<region>.azmk8s.io
  • --fqdn-subdomain <subdomain>: 用於叢集 FQDN 的子網域,位於自訂私有 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 <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。 不支援其他更新值組合。

警告

當您從 byosystemnone更新私人叢集時,代理程式節點會變更為使用公用 FQDN。 在使用 Azure 虛擬機器擴展集 的 AKS 叢集中,會執行 node 映像升級,以利用公開的 FQDN 來更新節點。

使用byo指令,將私有叢集從systemnone更新至az aks update,同時將參數設定為--private-dns-zonenone

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 plan and terraform apply 指令套用更新後的 Terraform 設定。

    terraform plan
    terraform apply
    

初始化 Terraform

在包含你 main.tf 檔案的目錄中,使用 terraform init 指令初始化 Terraform。 此命令會下載使用 Terraform 管理 Azure 資源所需的 Azure 提供者。

terraform init

格式化並驗證 Terraform 設定

使用 terraform fmt and terraform 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