共用方式為


增強 Kubernetes 的網路存取安全性

本文比較 Azure Kubernetes Service (AKS) 和 Amazon Elastic Kubernetes Service (EKS) 的網路模式。 它描述如何改善 AKS 叢集受控 API 伺服器的連線安全性。 它也包含限制公用網路存取的選項。

備註

本文是一系列文章的一部分,可協助熟悉 Amazon EKS 的專業人員瞭解 Azure Kubernetes Service (AKS)。

Amazon EKS 網路模式

您可以使用 Amazon Virtual Private Cloud (VPC) 將 Amazon Web Services (AWS) 資源啟動至具有公用和私人 子網的虛擬網路。 子網是虛擬私有雲 (VPC) 內的 IP 位址範圍。 公用子網會托管連接到網際網路的資源。 私人子網會裝載未連線到公用因特網的資源。 Amazon EKS 可以在公用和私人子網中布建受控節點群組。

端點訪問控制可讓您設定 API 伺服器端點是否可從公用因特網或透過VP連線。 Amazon EKS 提供數種方式來控制 叢集端點的存取。 您可以同時啟用預設公用端點、私人端點或兩個端點。 當您啟用公用端點時,您可以新增無類別網路端域間路由 (CIDR) 限制,以限制可連線到公用端點的用戶端 IP 位址。

叢集的端點設定會決定 Amazon EKS 節點如何連線到受控 Kubernetes 控制平面。 您可以透過 Amazon EKS 控制台或 API 來變更端點設定。 如需詳細資訊,請參閱 Amazon EKS 叢集端點訪問控制

僅限公用端點

新 Amazon EKS 叢集的預設模式會透過公用端點公開控制平面。 如果只啟用叢集的公用端點,則源自 VPC 的 Kubernetes API 要求會離開 VPC,但仍在 Amazon 的網路中。 這些要求包括從工作節點到控制平面的通訊。 節點會透過公用IP位址和通往因特網閘道的路由連線到控制平面。 或者,他們可以使用路由至網路位址轉換 (NAT) 閘道,其中可以使用 NAT 閘道的公用 IP 位址。

公用和私人端點

當您同時啟用公用和私人端點時,Kubernetes API 請求會透過 Amazon EKS 管理的彈性網路介面(ENIs)在 VPC 中與控制平面進行通訊。 叢集 API 伺服器可從因特網連線。

僅限私人端點

當您只啟用私人端點時,叢集 API 伺服器的所有流量,例如 kubectlhelm 命令,都必須來自叢集的 API 或 連線網路內。 已停用從網際網路連接 API 伺服器的公共存取。 若要實作此存取模式,請使用 AWS 虛擬專用網 (VPN)AWS 直接連接 到 VPC。 若要限制沒有 AWS VPN 或 DirectConnect 的端點存取,您可以將 CIDR 限制新增至公用端點以限制連線,而不需要設定更多網路功能。

如果您停用叢集 Kubernetes API 伺服器端點的公用存取,您可以使用下列其中一種方式來存取 Kubernetes API 伺服器端點:

如需連線選項的詳細資訊,請參閱 存取僅限私人的 API 伺服器

AKS 到 API 伺服器的網路存取

若要保護 AKS 中 Kubernetes API 的網路存取,您可以使用私人 AKS 叢集或授權的 IP 位址範圍。

私人 AKS 叢集

私人 AKS 叢集可協助確保 API 伺服器與代理程式節點之間的網路流量會保留在虛擬網路內。 在私人 AKS 叢集中,控制平面或 API 伺服器具有 內部 IP 位址。 私人叢集可協助確保 API 伺服器與節點集區之間的網路流量只會保留在專用網路上。

在私人 AKS 叢集中,API 伺服器具有只能透過位於相同虛擬網路的 Azure 私人端點 連線的內部 IP 位址。 相同虛擬網路中的虛擬機(VM)可以透過這個私人端點私下與控制平面通訊。 控制平面或 API 伺服器裝載於 Azure 管理的訂用帳戶中。 AKS 叢集及其節點集區位於客戶的訂用帳戶中。

下圖顯示私人 AKS 叢集組態。

顯示私人 AKS 叢集組態的圖表。

下載此架構的 Visio 檔案

若要布建私人 AKS 叢集,AKS 資源提供者會在私人域名系統 (DNS) 區域中為節點資源群組建立私人完整功能變數名稱 (FQDN)。 或者,AKS 也可以建立公用 FQDN,此公用 FQDN 在 Azure 公用 DNS 區域中有對應的地址 A 記錄。 代理程式節點會使用 A 私人 DNS 區域中的記錄來解析私人端點 IP 位址,以便與 API 伺服器通訊。

AKS 資源提供者可以在節點資源群組中建立私人 DNS 區域,或者您可以建立私人 DNS 區域,並將其資源識別符傳遞至布建系統。 若要建立私人叢集,您可以使用 Terraform 搭配 AzureBicepAzure Resource Manager 範本Azure CLIAzure PowerShell 模組Azure REST API

您可以在佈建期間為 API 伺服器啟用公用 FQDN,或在現有叢集上使用 az aks update 命令及 --enable-public-fqdn 命令列參數。 如果您啟用公用 FQDN,存取伺服器的 VM 必須位於裝載叢集的相同虛擬網路中,或是透過 虛擬網路對等互連站對站 VPN 連線的網路。 這些 VM 的範例包括 Azure DevOps 自我裝載代理程式或 GitHub Actions 自我裝載執行器。

針對私人 AKS 叢集,請停用 API 伺服器的公用 FQDN。 若要與私人控制平面通訊,VM 必須位於相同的虛擬網路或具有私人 DNS 區域的虛擬網路連結的對等互連虛擬網路中。 私人 A DNS 區域中的記錄會將 API 伺服器的 FQDN 解析為與基礎控制平面通訊的私人端點 IP 位址。 如需詳細資訊,請參閱 建立私人 AKS 叢集

私人叢集部署選項

AKS 資源提供者會提供下列參數以自定義私人 AKS 叢集部署:

  • 字串 authorizedIpRanges 會以 CIDR 格式指定允許的 IP 位址範圍。

  • disableRunCommand布爾值會指定是否要停用叢集的run命令。

  • enablePrivateCluster布爾值會指定是否要將叢集建立為私用。

  • enablePrivateClusterPublicFQDN布爾值會指定是否要為私人叢集建立另一個公用 FQDN。

  • 字串 privateDnsZone 會指定節點資源群組中的私人 DNS 區域。 如果您未指定值,資源提供者會建立區域。 您可以指定下列值:

    • System 為預設值。

    • None 默認為公用 DNS,因此 AKS 不會建立私人 DNS 區域。

    • <Your own private DNS zone resource ID>會使用您以 或 privatelink.<region>.azmk8s.io格式<subzone>.privatelink.<region>.azmk8s.io建立的私人 DNS 區域。

下表顯示部署私人 AKS 叢集的 DNS 組態選項:

私用 DNS 區域選項 enablePrivateClusterPublicFQDN: true enablePrivateClusterPublicFQDN: false
系統 代理節點、AKS 叢集中的虛擬網路中或任何其他 VM,以及任何連接到私人 DNS 區域的虛擬網路,皆使用私人 DNS 區域 A 記錄來解析私人端點的私人 IP 位址。

其他 VM 會使用 API 伺服器的公用 FQDN。
代理節點、AKS 叢集中的虛擬網路中或任何其他 VM,以及任何連接到私人 DNS 區域的虛擬網路,皆使用私人 DNS 區域 A 記錄來解析私人端點的私人 IP 位址。

沒有公用 API 伺服器 FQDN 可用。
沒有 所有 VM,包括代理程式節點,都會透過 A Azure 受控公用 DNS 區域中的記錄,使用 API 伺服器的公用 FQDN。 錯誤組態。 私人 AKS 叢集至少需要公用或私人 DNS 區域,以解析 API 伺服器的名稱。
您自己的私人 DNS 區域資源識別碼 代理節點、AKS 叢集中的虛擬網路中或任何其他 VM,以及任何連接到私人 DNS 區域的虛擬網路,皆使用私人 DNS 區域 A 記錄來解析私人端點的私人 IP 位址。

其他 VM 會使用 API 伺服器的公用 FQDN。
代理節點、AKS 叢集中的虛擬網路中或任何其他 VM,以及任何連接到私人 DNS 區域的虛擬網路,皆使用私人 DNS 區域 A 記錄來解析私人端點的私人 IP 位址。

沒有公用 API 伺服器 FQDN 可用。

私人叢集聯機和管理

在私人 AKS 叢集中,API 伺服器端點沒有公用 IP 位址。 您可以使用下列其中一個選項來建立私人叢集的網路連線:

使用 Azure CLI 執行 az aks 命令 invoke 命令 來存取私人叢集,而不需設定 VPN 或 ExpressRoute 閘道。 使用此命令可以透過 Azure API 從遠端叫用私人叢集上的命令,例如 kubectlhelm,而不需要直接連線到叢集。 若要使用 command invoke,請設定 Microsoft.ContainerService/managedClusters/runcommand/actionMicrosoft.ContainerService/managedclusters/commandResults/read 動作的必要許可權。

在 Azure 入口網站中,您可以使用 Run command 此功能在私人叢集上執行命令。 此功能會透過 command invoke 功能在叢集中執行命令。 功能所建立的 Pod Run command 會提供 kubectlhelm 工具來管理叢集。 Run command 也提供了在Pod內的Bash環境,裡面包含像jqxargsgrepawk這樣的工具。

您可以在相同的虛擬網路或對等互連虛擬網路中使用 Azure Bastion 來連線到跳板管理 VM。 Azure Bastion 是完全受控的平臺即服務(PaaS),可讓您用來透過瀏覽器和 Azure 入口網站連線到 VM。 Azure Bastion 直接從 Azure 入口網站透過傳輸層安全性 (TLS) 提供高度安全且順暢的遠端桌面通訊協定 (RDP) 或 SSH VM 連線。 當 VM 透過 Azure Bastion 連線時,它們不需要公用 IP 位址、代理程式或特殊客戶端軟體。

API Server VNet 整合

使用 API Server VNet 整合 設定的 AKS 叢集會將 API 伺服器端點直接投影到委派的子網中。 子網位於部署 AKS 的虛擬網路中。 API Server VNet 整合可讓 API 伺服器與叢集節點之間的網路通訊,而不需要私人連結或通道。 API 伺服器位於委派子網的內部負載平衡器VIP後方。 節點會設定為使用內部負載平衡器 VIP。 使用 API Server VNet 整合來確保 API 伺服器與節點集區之間的網路流量只會保留在專用網路上。

控制平面或 API 伺服器位於 AKS 管理的 Azure 訂用帳戶中。 您的叢集或節點集區位於您的 Azure 訂用帳戶中。 組成叢集節點的伺服器和 VM 可以透過投影至委派子網的 API 伺服器 VIP 和 Pod IP 位址彼此通訊。

您可以使用 API Server VNet 與公用叢集和私人叢集整合。 您可以在叢集布建之後新增或移除公用存取權。 不同於沒有虛擬網路整合的叢集,代理程序節點一律會直接與 API 伺服器內部負載平衡器 IP 的私人 IP 位址通訊,而不使用 DNS。 從節點到 API 伺服器流量的流量位於專用網。 而 API 伺服器對節點連線不需要通道。 如果啟用公用網路存取,叢集外用戶端可以正常與 API 伺服器通訊。 如果停用公用網路存取,請遵循與標準 私人叢集相同的私人 DNS 設定方法。 如需詳細資訊,請參閱 使用 API Server VNet 整合建立 AKS 叢集

授權的IP位址範圍

您也可以使用 授權的IP位址範圍 來改善叢集安全性,並將對API伺服器的攻擊降到最低。 授權的IP位址範圍會將公用 AKS 叢集的控制平面存取限制為已知的IP位址和 CIDR 清單。 當您使用此選項時,API 伺服器仍會公開,但存取會受到限制。

下列 az aks update Azure CLI 命令會授權 IP 位址範圍:

 az aks update \
     --resource-group myResourceGroup \
     --name myAKSCluster \
     --api-server-authorized-ip-ranges  73.140.245.0/24

AKS 連線考慮事項

請考慮 AKS 連線的下列重點:

  • 相較於授權的IP位址範圍,AKS私人叢集提供增強的安全性和隔離。 不過,您無法將現有的公用 AKS 叢集轉換成私人叢集。 相反地,您可以啟用任何現有 AKS 叢集的授權 IP 位址範圍。

  • 您無法將授權的 IP 位址範圍套用至私人 API 伺服器端點。 它們只適用於公用 API 伺服器。

  • 私人叢集不支援 Azure DevOps 裝載的代理程式。 您應該改用自行架設的代理程式。

  • 若要讓 Azure Container Registry 使用私人 AKS 叢集運作,您必須在叢集虛擬網路中設定容器登錄的私人連結。 或者,您可以在 Container Registry 的虛擬網路與私人叢集的虛擬網路之間建立聯結。

  • Azure Private Link 的限制適用於私人叢集。

  • 如果刪除或修改私人叢集之客戶子網中的私人端點,叢集就會停止運作。

貢獻者們

本文由 Microsoft 維護。 下列參與者撰寫本文。

主要作者:

其他參與者:

若要查看非公開的 LinkedIn 個人檔案,請登入 LinkedIn。

後續步驟