建立私人 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 伺服器與叢集或節點池可以透過 API 伺服器虛擬網路中的 Azure Private Link 服務,以及暴露在 AKS 叢集子網路上的私有端點彼此通訊。

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

Note

AKS 將 API 伺服器的私有端點置於叢集配置中第一個節點池所使用的子網。 如果第一個節點池發生變動,AKS 可能會在 叢集停止/啟動操作中,在不同的子網路中重新建立私有端點。

區域可用性

私人叢集在支援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 區域,且 AKS 節點必須透過 UDP 和 TCP 埠 53 來連接該區域:

    • 為叢集的私有 DNS 區域設定條件轉發器,該轉發器會轉發到 Azure DNS 虛擬伺服器。168.63.129.16 或者,在連結到私人 DNS 區域的虛擬網路中使用 Azure DNS Private Resolver。 欲了解更多關於 Azure IP 位址的資訊,請參閱「什麼是 IP 位址 168.63.129.16?」。 關於區域名稱資訊,請參見 Azure 服務的 DNS 區域配置。
    • 確保 AKS 節點能透過 UDP 和 TCP 埠 53 同時連接自訂 DNS 伺服器。
    • 確保自訂 DNS 伺服器能同時監聽並回應 UDP 和 TCP 53 埠。
    • 確保NSG、防火牆、NVA 和路由都不會阻擋任何協定。
  • 已啟用 API Server VNet 整合的 AKS 叢集,也可以啟用私有叢集模式。 欲了解更多資訊,請參閱 啟用或停用具備 API Server VNet 整合的現有叢集的私有叢集模式。

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

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

重要

從 Kubernetes 1.37 開始,當建立或升級一個符合資格的 AKS Standard 節點池(但沒有明確的 LocalDNS 設定檔)時,LocalDNS 即可啟用。 藉由使用 PreferUDP,當 UDP 回應遭截斷時,LocalDNS 會改以 TCP 重試。 升級前請驗證兩個協定:

dig +udp @<custom-dns-ip> <private-or-public-fqdn>
dig +tcp @<custom-dns-ip> <private-or-public-fqdn>

重要

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

局限性

  • IP 授權範圍只適用於公開 API 伺服器。 你無法將這些範圍套用到私有 API 伺服器端點。
  • Azure Private Link 服務限制 適用於私有叢集。
  • Azure DevOps Microsoft 託管代理程式在私有叢集中不受支援。 請考慮使用自我裝載的代理程式。
  • 刪除或修改客戶子網中的私有端點會導致叢集停止運作。
  • Azure Private Link 服務僅支援 Standard Load Balancer。 Basic 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,AKS 仍會為承載叢集的輻射型 VNet 建立虛擬網路連結。 確保叢集受控的身分識別在輪輻 VNet 中具有網路參與者,然後將 publicDNS 設定為 false / 使用 --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      = "azure"
        network_plugin_mode = "overlay"
      }
    }
    
  5. 請依照初始化 Terraform 的步驟,格式化並驗證 Terraform 設定,建立 Terraform 執行計畫,套用 Terraform 設定,並配置 kubectl 以連接到私有 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 設定,並配置 kubectl 以連接到私有 AKS 叢集。

使用自訂網域搭配私有 AKS 叢集

如果您想要設定自訂網域,使其僅能內部解析,請參閱使用自訂網域。

在私有 AKS 叢集上停用公用 FQDN

當你使用 建立私有 AKS 叢集 --enable-private-cluster時,AKS 會透過虛擬網路內的私有端點部署 Kubernetes API 伺服器。 預設情況下,除非你指定 --disable-public-fqdn,否則 AKS 仍可能為 API 伺服器建立一個公開 DNS 名稱(public FQDN)。 公開的 FQDN 僅是一個公開可解析的 DNS 名稱,而私有叢集的 API 通訊仍透過私有端點進行。 使用 --disable-public-fqdn 會移除公共 DNS 名稱,並限制叢集管理存取僅限於私人連接方式,例如 VPN、ExpressRoute、VNet 對等或 Bastion 主機。

請使用下列指引:

  • 保持公開 FQDN 啟用:如果叢集上的 VNet 或連接網路上的用戶端需要一個公開可解析的 DNS 名稱作為 API 伺服器。 公用 FQDN 不會建立公用 API 端點,也不會移除私有端點對網路連線的需求。 對於 DevOps 管線,請使用連接網路上的自架代理。
  • 停用公開FQDN:若有強的安全或合規要求,企業私有網路已實作,採用樞紐輻射式安全網路架構,或叢集操作必須完全透過私有連接路徑進行。

建立私有 AKS 叢集時,請停用公開的 FQDN

使用 az aks create 命令搭配 --disable-public-fqdn 旗標建立私人 AKS 叢集時,停用公用 FQDN。

此指令的關鍵參數:

  • --disable-public-fqdn:停用 API 伺服器的公用完整網域名稱 (FQDN)。
  • --assign-identity <resource-id>: 指定叢集所用的管理身份。
  • --private-dns-zone system: 規定 AKS 在節點資源群組中建立一個私有 DNS 區域。 當你停用公開 FQDN 時,無法使用 none ,因為叢集需要私有或公共 DNS 區域來解析 API 伺服器名稱。
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 \
    --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 設定,並配置 kubectl 以連接到私有 AKS 叢集。

在現有的私人 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 範本(帶有privateDNSZone屬性)來設定私有 AKS 叢集的私有 DNS 設定。 下表描述了 Azure CLI --private-dns-zone 參數與 Azure Resource Manager privateDNSZone 屬性所支援的值:

--private-dns-zone / privateDNSZone 值 Description
system 設定私有 DNS 區域時的預設值。 如果你省略 --private-dns-zone / privateDNSZone了 ,AKS 會在節點資源群組中建立一個私有 DNS 區域。
none 如果你設定 --private-dns-zone / privateDNSZone 為 none,AKS 不會建立私人 DNS 區域。
<custom-private-dns-zone-resource-id> 使用此參數時,為 Azure 全球雲端建立以下格式的私有 DNS 區域: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 供應商。
  • 如果你用 Active Directory 服務主體來設定 AKS 叢集,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 設定,並配置 kubectl 以連接到私有 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 設定,並配置 kubectl 以連接到私有 AKS 叢集。

自訂私有 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 設定,並配置 kubectl 以連接到私有 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 設定,並配置 kubectl 以連接到私有 AKS 叢集。

將現有的私有 AKS 叢集從私有 DNS 區域更新為公用

您只能從 byo (自備) 或 system 更新為 none。 不支援其他更新值組合。

警告

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

使用byo指令,將私有叢集從system或none更新至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 命令。

連線前,請確保用戶端有網路和 DNS 存取叢集的私人 API 端點。 您可以透過叢集 VNet 或已連線的網路進行連線,方法包括使用已注入 VNet 的 Azure Cloud Shell、Azure Bastion、VNet 對等互連、私人端點、ExpressRoute 或 VPN。 欲了解更多資訊,請參閱 建立與私有 AKS 叢集的網路連線。 如果你沒有直接網路連線,可以用az aks command invoke指令透過 Azure API 執行指令。

  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.36.2
    aks-nodepool1-12345678-vmss000001   Ready    agent   3h6m   v1.36.2
    aks-nodepool1-12345678-vmss000002   Ready    agent   3h6m   v1.36.2