建立私人 Azure Kubernetes Service (AKS) 叢集
本文可協助您部署私人連結型 AKS 叢集。 如果您想要在沒有必要的私人連結或通道的情況下建立 AKS 叢集,請參閱使用 API Server VNet 整合建立 Azure Kubernetes Service 叢集(預覽版)。
概觀
在私人叢集中,控制平面或 API 伺服器都具有內部 IP 位址,如 RFC1918 - 私人網際網路的位址配置文件中所定義。 藉由使用私人叢集,您可以確保 API 伺服器與節點集區之間的網路流量只會保留在專用網路上。
控制平面或 API 伺服器位於 AKS 管理的 Azure 資源群組中,而您的叢集或節點集區位於您的資源群組中。 伺服器和叢集或節點集區可以透過 API 伺服器虛擬網路中的 Azure Private Link 服務,以及在您的 AKS 叢集子網路中公開的私人端點,彼此通訊。
當您布建私人 AKS 叢集時,AKS 預設會使用私人 DNS 區域建立私人 FQDN,並在 Azure 公用 DNS 中建立具有對應 A
記錄的其他公用 FQDN。 代理程式節點會繼續使用 A
私人 DNS 區域中的記錄,解析私人端點的私人IP位址,以便與 API 伺服器通訊。
區域可用性
私人叢集適用於公用區域、Azure Government 和 Microsoft由支援 AKS 的 21Vianet 區域運作的 Azure。
必要條件
- Azure CLI 2.28.0 版或更高版本。 執行
az --version
以尋找版本,然後執行az upgrade
以升級版本。 如果您需要安裝或升級,請參閱安裝 Azure CLI。 aks-preview
延伸模組 0.5.29 或更高版本。- 如果使用 Azure Resource Manager (ARM) 或 Azure REST API,則 AKS API 版本必須是 2021-05-01 或更新版本。
- 若要使用自訂 DNS 伺服器,請在自訂 DNS 伺服器中新增 Azure 公用 IP 位址 168.63.129.16 作為上游 DNS 伺服器,並且確定將此公用 IP 位址新增為第一個 DNS 伺服器。 如需 Azure IP 位址的詳細資訊,請參閱什麼是 IP 位址 168.63.129.16?
- 叢集的 DNS 區域應該是您轉送至 168.63.129.16 的區域。 您可以在 Azure 服務 DNS 區域設定的區域名稱中找到更多資訊。
- 使用 API Server VNet 整合啟用的現有 AKS 叢集可以啟用私人叢集模式。 如需詳細資訊,請參閱在具有 API Server VNet 整合的現有叢集上啟用或停用私人叢集模式。
注意
Azure Linux 節點集區現已正式發行 (GA)。 若要了解優點和部署步驟,請參閱適用於 AKS 的 Azure Linux 容器主機簡介。
限制
- IP 授權範圍無法套用至私人 API 伺服器端點,只能套用至公用 API 伺服器。
- Azure Private Link 服務限制適用於私人叢集。
- 沒有支援搭配私人叢集使用 Azure DevOps Microsoft 裝載的代理程式。 請考慮使用 自我裝載代理程式。
- 如果您需要讓 Azure Container Registry 與私人 AKS 叢集搭配運作, 請在叢集虛擬網路 中設定容器登錄的私人連結,或設定容器登錄虛擬網路與私人叢集虛擬網路之間的對等互連。
- 刪除或修改客戶子網路中的私人端點,會導致叢集停止運作。
- 僅 Standard Azure Load Balancer 支援 Azure Private Link 服務。 不支援 Basic Azure Load Balancer。
建立私人 AKS 叢集
使用
az group create
命令建立資源群組。 您也可以為您的 AKS 叢集使用現有的資源群組。az group create \ --name <private-cluster-resource-group> \ --location <location>
使用具有
--enable-private-cluster
旗標的az aks create
命令,建立具有預設基本網路的私人叢集。az aks create \ --name <private-cluster-name> \ --resource-group <private-cluster-resource-group> \ --load-balancer-sku standard \ --enable-private-cluster \ --generate-ssh-keys
連線到私人叢集
若要管理 Kubernetes 叢集,請使用 Kubernetes 命令列用戶端 kubectl。 如果您使用 Azure Cloud Shell,則 kubectl
已安裝。 若要在本機安裝 kubectl
,請使用 az aks install-cli
命令。
使用
az aks get-credentials
命令,設定kubectl
連線到 Kubernetes 叢集。 此命令會下載憑證並設定 Kubernetes CLI 以供使用。az aks get-credentials --resource-group <private-cluster-resource-group> --name <private-cluster-name>
使用
kubectl get
命令確認叢集的連線。 此命令會傳回叢集節點的清單。kubectl get nodes
使用自訂網域
如果您想要設定自訂網域,使其僅能內部解析,請參閱使用自訂網域。
停用公用 FQDN
停用新叢集上的公用 FQDN
使用
az aks create
命令搭配--disable-public-fqdn
旗標建立私人 AKS 叢集時,停用公用 FQDN。az aks create \ --name <private-cluster-name> \ --resource-group <private-cluster-resource-group> \ --load-balancer-sku standard \ --enable-private-cluster \ --assign-identity <resourceID> \ --private-dns-zone <private-dns-zone-mode> \ --disable-public-fqdn \ --generate-ssh-keys
停用現有叢集上的公用 FQDN
使用具有
--disable-public-fqdn
旗標的az aks update
命令,在現有的 AKS 叢集上停用公用 FQDN。az aks update \ --name <private-cluster-name> \ --resource-group <private-cluster-resource-group> \ --disable-public-fqdn
設定私人 DNS 區域
您可以利用下列參數來設定私人 DNS 區域:
system
︰這是預設值。 如果省略--private-dns-zone
引數,則 AKS 會在節點資源群組中建立私人 DNS 區域。none
:預設值為公用 DNS。 AKS 不會建立私人 DNS 區域。CUSTOM_PRIVATE_DNS_ZONE_RESOURCE_ID
:這需要您為 Azure 全域雲端建立下列格式的私人 DNS 區域:privatelink.<region>.azmk8s.io
或<subzone>.privatelink.<region>.azmk8s.io
。 您將需要該私人 DNS 區域的資源識別碼以供未來使用。 您也需要具有私人 DNS 區域參與者和網路參與者角色的使用者指派身分識別或服務主體。 使用 API 伺服器 VNet 整合進行部署時,私人 DNS 區域支援private.<region>.azmk8s.io
或<subzone>.private.<region>.azmk8s.io
的命名格式。 建立叢集之後,您無法變更或刪除此資源,因為它可能會導致效能問題和叢集升級失敗。- 如果私人 DNS 區域位於與 AKS 叢集不同的訂用帳戶中,您必須在這兩個訂用帳戶中註冊
Microsoft.ContainerServices
Azure 提供者。 - 您只能搭配
CUSTOM_PRIVATE_DNS_ZONE_RESOURCE_ID
使用fqdn-subdomain
來提供 子域功能給privatelink.<region>.azmk8s.io
。 - 如果您的 AKS 叢集已設定為 Active Directory 服務主體,則 AKS 不支援使用系統指派的受控識別搭配自訂私人 DNS 區域。 叢集必須使用使用者指派的受控識別驗證。
- 如果您要指定
<subzone>
,則名稱有 32 個字元的限制<subzone>
。
- 如果私人 DNS 區域位於與 AKS 叢集不同的訂用帳戶中,您必須在這兩個訂用帳戶中註冊
注意
您可以使用 CUSTOM_PRIVATE_DNS_ZONE_RESOURCE_ID
ARM 範本或 Azure CLI 進行設定。 privateDNSZone
接受私人 DNZ 區域 resourceID
,如下列範例所示:
properties.apiServerAccessProfile.privateDNSZone.
"apiServerAccessProfile": {
"enablePrivateCluster": true,
"privateDNSZone": "system|none|[resourceId(..., 'Microsoft.Network/privateDnsZones', 'privatelink.<region>.azmk8s.io']"
}
使用私人 DNS 區域建立私人 AKS 叢集
使用具有下列旗標的
az aks create
命令,建立具有的私人 DNS 區域的私人 AKS 叢集:az aks create \ --name <private-cluster-name> \ --resource-group <private-cluster-resource-group> \ --load-balancer-sku standard \ --enable-private-cluster \ --assign-identity <resourceID> \ --private-dns-zone [system|none] \ --generate-ssh-keys
使用自訂私人 DNS 區域或私人 DNS 子區域建立私人 AKS 叢集
使用具有下列旗標的
az aks create
命令,建立具有的自訂 DNS 區或子區域的私人 AKS 叢集:# The custom private DNS zone name should be in the following format: "<subzone>.privatelink.<region>.azmk8s.io" az aks create \ --name <private-cluster-name> \ --resource-group <private-cluster-resource-group> \ --load-balancer-sku standard \ --enable-private-cluster \ --assign-identity <resourceID> \ --private-dns-zone <custom private dns zone or custom private dns subzone resourceID> \ --generate-ssh-keys
使用自訂私人 DNS 區域和自訂子區域建立私人 AKS 叢集
使用具有下列旗標的
az aks create
命令,建立具有的自訂 DNS 區和子網域的私人 AKS 叢集:# The custom private DNS zone name should be in one of the following formats: "privatelink.<region>.azmk8s.io" or "<subzone>.privatelink.<region>.azmk8s.io" az aks create \ --name <private-cluster-name> \ --resource-group <private-cluster-resource-group> \ --load-balancer-sku standard \ --enable-private-cluster \ --assign-identity <resourceID> \ --private-dns-zone <custom private dns zone resourceID> \ --fqdn-subdomain <subdomain> \ --generate-ssh-keys
將私人 DNS 區域的私人叢集更新為公用
您只能從 byo
或 system
更新至 none
。 不支援其他更新值組合。 更新之前,請確定您 連線到私人叢集。
警告
當您從 byo
或 system
none
更新私人叢集時,代理程式節點會變更為使用公用 FQDN。 在使用 Azure 虛擬機器擴展集 的 AKS 叢集中,會執行節點映射升級,以使用公用 FQDN 更新您的節點。
使用具有下列旗標的
az aks update
命令,將私人叢集從byo
或system
更新至none
:az aks update \ --name <private-cluster-name> \ --resource-group <private-cluster-resource-group> \ --private-dns-zone none
用來連線到私人叢集的選項
API 伺服器端點沒有公用 IP 位址。 若要管理 API 伺服器,您必須使用可存取 AKS 叢集 Azure 虛擬網絡 (VNet) 的 VM。 有數個選項可讓您與私人叢集建立網路連線:
- 使用具有
--vnet-name
旗標的az vm create
命令,在與 AKS 叢集相同的 VNet 中建立 VM。 - 在不同的網路中使用 VM,並設定虛擬網路對等互連。
- 使用 Express Route 或 VPN 連線。
- 使用 AKS
command invoke
功能。 - 使用私人端點連線。
- 使用部署到連接至叢集 API 伺服器的子網路中的 Cloud Shell 執行個體。
在與 AKS 叢集相同的 VNET 中建立 VM 是最簡單的選項。 Express Route 和 VPN 會增加成本,而且需要額外的網路複雜性。 虛擬網路對等互連會要求您規劃網路 CIDR 範圍,以確保沒有重疊的範圍。
虛擬網路對等互連
若要使用虛擬網路對等互連,您需要設定虛擬網路與私人 DNS 區域之間的連結。
- 在 Azure 入口網站 中,流覽至您的節點資源群組,然後選取您的私人 DNS 區域資源。
- 在服務功能表中的 [DNS 管理] 底下,選取 [虛擬網絡 連結>新增]。
- 在 [新增 虛擬網絡 連結] 頁面上,設定下列設定:
- 連結名稱:輸入虛擬網路連結的名稱。
- 虛擬網絡:選取包含 VM 的虛擬網路。
- 選取 [建立] 以建立虛擬網路連結。
- 流覽至包含叢集虛擬網路的資源群組,然後選取您的 虛擬網路資源。
- 在服務功能表中的 [設定] 底下,選取 [對等互連>新增]。
- 在 [ 新增對等互連 ] 頁面上,設定下列設定:
- 對等互連連結名稱:輸入對等互連連結的名稱。
- 虛擬網路:選取 VM 的虛擬網路。
- 選取 [ 新增 ] 以建立對等互連連結。
如需詳細資訊,請參閱虛擬網路對等互連。
具有自訂 DNS 的中樞和輪輻
中樞和輪輻架構通常用來在 Azure 中部署網路。 在其中許多部署中,輪輻 VNet 中的 DNS 設定會設定為參考中央 DNS 轉寄站,以允許用於內部部署和以 Azure 為基礎的 DNS 解析。
將 AKS 叢集部署到這類的網路環境時,有一些特殊的考量:
- 根據預設,佈建私人叢集時,叢集管理的資源群組中會建立私人端點 (1) 和私人 DNS 區域 (2)。 叢集會使用私人區域中的
A
記錄來解析私人端點的 IP,以便與 API 伺服器通訊。 - 私人 DNS 區域只會連結至叢集節點所連結的 VNet (3)。 這表示私人端點只能由該連結 VNet 中的主機解析。 未在 VNet 上設定任何自訂 DNS 的情況下 (預設值),這會在主機點向 DNS 的 168.63.129.16 時正常運作,DNS 可以因為連結而在私人 DNS 區域中解析記錄。
- 在包含叢集的 VNet 有自訂 DNS 設定 (4) 的情況下,除非私人 DNS 區域已連結至包含自訂 DNS 解析程式 (5) 的 VNet,否則叢集部署將會失敗。 在叢集佈建期間建立私人區域之後,您可以手動建立此連結,或使用事件型部署機制 (例如 Azure 事件方格和 Azure Functions),在偵測到建立區域時,透過自動化來建立此連結。 為避免在開始部署期間發生叢集失敗,您可以透過私人的 DNS 區域資源識別碼部署叢集。 這僅適用於資源類型
Microsoft.ContainerService/managedCluster
和 API 版本2022-07-01
。 不支援將舊版本與 ARM 版本或 Bicep 資源定義搭配使用。
注意
條件式轉送不支援子域。
注意
如果您正在使用自備路由表搭配 kubenet和自備 DNS 搭配私人叢集,則叢集建立會失敗。 在叢集建立失敗之後,節點資源群組中的 RouteTable
必須與子網路建立關聯,才能成功建立。
使用私人端點連線
您可以設定私人端點,讓 VNet 不需要對等互連,就能與私人叢集進行通訊。 在包含取用資源的虛擬網路中建立新的私人端點,然後在虛擬網路與相同網路中的新私人 DNS 區域之間建立連結。
重要
如果虛擬網路是使用自定義 DNS 伺服器設定,則必須針對環境適當地設定私人 DNS。 如需詳細資料,請參閱虛擬網路名稱解析文件。
建立私人端點資源
在您的 VNet 中建立私人端點資源:
- 從 Azure 入口網站 首頁,選取 [建立資源]。
- 搜尋私人端點,然後選取 [建立>私人端點]。
- 選取 建立。
- 在 [ 基本] 索引 標籤上,設定下列設定:
- 專案詳細資料
- 訂閱:選取您的私人叢集所在的 Azure 訂閱。
- 資源群組:選取包含虛擬網路的資源群組。
- [執行個體詳細資料]
- 名稱:輸入私人端點的名稱,例如 myPrivateEndpoint。
- 區域:選取與虛擬網路相同的區域。
- 專案詳細資料
- 選取 [下一步:資源 ],並設定下列設定:
- 連線方法:選取連線到我目錄中的 Azure 資源。
- 訂閱:選取您的私人叢集所在的 Azure 訂閱。
- 資源類型:選取 Microsoft.ContainerService/managedClusters。
- 資源:選取您的私人叢集。
- 目標子資源:選取管理。
- 選取 [下一步]:虛擬網絡 並設定下列設定:
- 網路功能
- 虛擬網路:選取您的虛擬網路。
- 子網路:選取您的子網路。
- 網路功能
- 選取下一步:DNS>下一步:標籤並視需要設定索引鍵/值 (選用)。
- 選取下一步: 檢閱 + 建立>建立。
建立資源之後,請記錄私人端點的私人 IP 位址以供日後使用。
建立私人 DNS 區域
建立私人端點之後,請建立與私人叢集所建立的私人 DNS 區域同名的新私人 DNS 區域。 請記得在包含取用資源的 VNet 中建立此 DNS 區域。
- 在 Azure 入口網站 中,流覽至您的節點資源群組,然後選取您的私人 DNS 區域資源。
- 在服務功能表中的 [DNS 管理] 底下,選取 [記錄集],並記下下列事項:
- 私人 DNS 區域的名稱,其遵循模式
*.privatelink.<region>.azmk8s.io
。 A
記錄的名稱 (不包括私人 DNS 名稱)。- 存留時間 (TTL)。
- 私人 DNS 區域的名稱,其遵循模式
- 從 Azure 入口網站 首頁,選取 [建立資源]。
- 搜尋 私用 DNS 區域,然後選取 [建立> 私用 DNS 區域]。
- 在 [ 基本] 索引 標籤上,設定下列設定:
- 專案詳細資料:
- 選取您的 [訂用帳戶]。
- 選取已建立私人端點的資源群組。
- [執行個體詳細資料]
- 名稱:輸入從先前步驟擷取的 DNS 區域名稱。
- 區域預設為您的資源群組位置。
- 專案詳細資料:
- 選取 [檢閱 + 建立]>[建立]。
建立 A
記錄
建立私人 DNS 區域之後,請建立 A
記錄,以將私人端點與私人叢集產生關聯:
- 移至在先前步驟中建立的私人 DNS 區域。
- 在服務功能表中的 [DNS 管理] 底下,選取 [記錄集>新增]。
- 在 [ 新增記錄集 ] 頁面上,設定下列設定:
- 名稱:輸入從
A
私人叢集 DNS 區域中記錄擷取的名稱。 - 類型:選取 A - 位址記錄。
- TTL:輸入從私人叢集 DNS 區域中
A
記錄擷取的數字。 - TTL 單位:變更下拉式清單值,以符合私人叢集 DNS 區域的
A
記錄相同單位。 - IP 位址:輸入 您所建立私人端點的 IP 位址。
- 名稱:輸入從
- 選取 [ 新增 ] 以建立
A
記錄。
重要
建立 A
記錄時,請只使用名稱,而不是完整網域名稱 (FQDN)。
將私人 DNS 區域連結至虛擬網路
建立 A
記錄之後,請將私人 DNS 區域連結至將存取私人叢集的虛擬網路:
- 移至在先前步驟中建立的私人 DNS 區域。
- 在服務功能表中的 [DNS 管理] 底下,選取 [虛擬網絡 連結>新增]。
- 在 [新增 虛擬網絡 連結] 頁面上,設定下列設定:
- 連結名稱:輸入虛擬網路連結的名稱。
- 訂閱:選取您的私人叢集所在的 Azure 訂閱。
- 虛擬網絡:選取私人叢集的虛擬網路。
- 選取 [建立] 以建立連結。
作業可能需要幾分鐘的時間才能完成。 建立虛擬網路鏈接之後,您可以從您在步驟 2 中使用的 [虛擬網絡 連結] 索引標籤取它。
警告
- 如果私人叢集已停止並重新啟動,則會移除並重新建立私人叢集的原始私人連結服務,這會中斷私人端點與私人叢集之間的連線。 若要解決此問題,請刪除並重新建立連結至私人叢集且由任何使用者建立的私人端點。 如果重新建立的私人端點有新的 IP 位址,您也需要更新 DNS 記錄。
- 如果您在私人 DNS 區域中更新 DNS 記錄,請確定您嘗試連線的主機是使用更新的 DNS 記錄。 您可以使用 命令來確認這一
nslookup
點。 如果您注意到更新未反映在輸出中,您可能需要排清計算機上的 DNS 快取,然後再試一次。
下一步
如需相關的最佳作法,請參閱 AKS 中的網路連線和安全性最佳做法。