本文將協助你使用 Azure CLI 或 Terraform 部署基於私有連結的 AKS 叢集。 如果你有興趣建立一個不需要私有連結或隧道的 AKS 叢集,請參考 Create a Azure Kubernetes Service (AKS)叢集並整合 API Server VNet。
AKS 中私有叢集概述
在私人叢集中,控制平面或 API 伺服器都具有內部 IP 位址,如 RFC1918 - 私人網際網路的位址配置文件中所定義。 藉由使用私人叢集,您可以確保 API 伺服器與節點集區之間的網路流量只會保留在專用網路上。
控制平面或 API 伺服器位於 AKS 管理的 Azure 資源群組中,而你的叢集或節點池則屬於資源群組。 伺服器與叢集或節點池可以透過 API 伺服器虛擬網路中的
當你建立私有 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?
- 叢集的 DNS 區域應該是你轉發到 168.63.129.16 的區域。 你可以在 Azure services DNS zone configuration 找到更多區域名稱資訊。
已啟用 API Server VNet 整合的 AKS 叢集,也可以啟用私有叢集模式。 欲了解更多資訊,請參閱 啟用或停用具備 API Server VNet 整合的現有叢集的私有叢集模式。
如果你需要在私有 AKS 叢集啟用 Azure Container Registry,在叢集虛擬網路(VNet) 中為容器登錄檔設置私人連結,或在容器登錄檔的 VNet 與私有叢集的 VNet 之間建立對等連接。
Kubectl 已安裝。 您可以使用命令
az aks install-cli在本機安裝它。
- Terraform 本地安裝。 安裝說明請參見 Install Terraform。
重要
自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),並設定publicDNS至false/ 使用--disable-public-fqdn。 -
僅限公用 DNS:將
privateDNSZone/--private-dns-zone設定為none以停用建立私人區域,並將publicDNS保持在其預設值 (true)/不要使用--disable-public-fqdn。
-
自訂私人 DNS 區域:提供一個現有的私人區域並設定
- 在使用自訂 DNS 伺服器的輻射型 VNet 中,若叢集的管理身份在輻射型 VNet 上缺少 Network Contributor ,此操作可能會失敗。 為防止故障 ,請選擇 以下支援的配置之一:
- 如果您在私人叢集中使用 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
建立一個名為
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 }在
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" }在
main.tf中加入以下程式碼以建立Azure資源群組:resource "azurerm_resource_group" "this" { name = var.resource_group_name location = var.location }加入以下程式碼以
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" } }請依照步驟初始 化 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
建立一個名為
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 }在
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" }在
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"] }加入以下程式碼以
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" } }請依照步驟初始 化 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
依照「 建立帶有進階網路的私有 AKS 叢集 」或「 建立預設基本網路的私有 AKS 叢集 」中的步驟 1-3 來設定 Terraform 設定並根據你的情境建立必要的資源。 這個例子使用了先進的網路技術。
將以下程式碼加入到
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" } }請依照步驟初始 化 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
在現有
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" } }請使用
terraform planandterraform 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 / privateDNSZone 為 none,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.ContainerServiceAzure 供應商。 - 如果你的 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
依照「 建立帶有進階網路的私有 AKS 叢集 」或「 建立預設基本網路的私有 AKS 叢集 」中的步驟 1-3 來設定 Terraform 設定並根據你的情境建立必要的資源。 這個例子使用了先進的網路技術。
將以下程式碼加入
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" } }請依照步驟初始 化 Terraform、 格式化並驗證 Terraform 設定、 建立 Terraform 執行計畫、 套用 Terraform 設定,並 連接到 AKS 叢集。
建立一個沒有私有 DNS 區域的私有 AKS 叢集
依照「 建立帶有進階網路的私有 AKS 叢集 」或「 建立預設基本網路的私有 AKS 叢集 」中的步驟 1-3 來設定 Terraform 設定並根據你的情境建立必要的資源。 這個例子使用了先進的網路技術。
加入以下程式碼以
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" } }請依照步驟初始 化 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 設定時,必須使用使用者指派的管理身份,角色為
依照「 建立帶有進階網路的私有 AKS 叢集 」或「 建立預設基本網路的私有 AKS 叢集 」中的步驟 1-3 來設定 Terraform 設定並根據你的情境建立必要的資源。 這個例子使用了先進的網路技術。
加入
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 ] }請依照步驟初始 化 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
依照「 建立帶有進階網路的私有 AKS 叢集 」或「 建立預設基本網路的私有 AKS 叢集 」中的步驟 1-3 來設定 Terraform 設定並根據你的情境建立必要的資源。 這個例子使用了先進的網路技術。
加入以下程式碼以
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" } }請依照步驟初始 化 Terraform、 格式化並驗證 Terraform 設定、 建立 Terraform 執行計畫、 套用 Terraform 設定,並 連接到 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
在現有
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" } }請使用
terraform planandterraform 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 命令。
使用
kubectl命令,設定az aks get-credentials連線到 Kubernetes 叢集。 此命令會下載憑證並設定 Kubernetes CLI 以供使用。az aks get-credentials --resource-group <private-cluster-resource-group> --name <private-cluster-name>使用
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