編輯

共用方式為


對 Kubernetes 的安全網路存取

Azure Bastion
Azure DNS
Azure Kubernetes Service (AKS)
Azure Private Link
Azure 虛擬網路

本文比較 Azure Kubernetes Service (AKS) 和 Amazon Elastic Kubernetes Service (Amazon EKS) 的網路模式。 本文說明如何改善 AKS 叢集受控 API 伺服器的連線安全性,以及限制公用網路存取的不同選項。

注意

本文是一系列文章的一部分,有助於熟悉 Amazon EKS 的專業人員了解 Azure Kubernetes Service (AKS)

Amazon EKS 網路模式

使用 Amazon Virtual Private Cloud (Amazon PRIVATE Cloud),您可以將 Amazon Web Services (AWS) 資源啟動至由公用和私人 子網組成的虛擬網路,或位於 CSV 中的 IP 位址範圍。 公用子網裝載必須連線到因特網的資源,而私人子網會裝載未連線到公用因特網的資源。 Amazon EKS 可以在公用和私人子網中布建受控節點群組。

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

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

僅限公用端點

透過公用端點公開控制平面是新 Amazon EKS 叢集的預設模式。 當只啟用叢集的公用端點時,Kubernetes API 要求源自於 Amazon AMAZON 內的 KUBERNETes API 要求,例如背景工作節點來控制平面通訊,請離開 AMAZON,但不會離開 Amazon 的網路。 若要讓節點連線到控制平面,它們必須使用公用IP位址和因特網閘道的路由,或路由至網路位址轉換 (NAT) 網關,以便使用NAT 閘道的公用IP位址。

公用和私人端點

啟用公用和私人端點時,KUBERnetes API 要求會透過由 AMAZON EKS 管理的彈性網路介面(ENIS)在VP 中透過 AMAZON EKS 管理的彈性網路介面(ENIs)與控制平面通訊。 叢集 API 伺服器可從因特網存取。

僅限私人端點

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

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

  • 連線的網路:使用 AWS 傳輸閘道將網路連線到 或其他 連線選項,,然後使用連線網路中的計算機。 您必須確定 Amazon EKS 控制平面安全組包含規則,以允許來自連線網路的埠 443 上的輸入流量。
  • Amazon EC2 防禦主機:您可以將 Amazon EC2 實例啟動至叢集的VP中的公用子網,然後透過 SSH 登入該實例,以執行 kubectl 命令。 如需詳細資訊,請參閱在 AWS Linux 防禦主機。 您必須確定 Amazon EKS 控制平面安全組包含規則,以允許來自防禦主機的埠 443 上的輸入流量。 如需詳細資訊,請參閱 檢視叢集的 Amazon EKS 安全組需求。 當您為防禦主機設定 kubectl 時,請務必使用已對應至叢集 RBAC 組態的 AWS 認證,或在移除端點公用存取之前,將 IAM 主體新增至 RBAC 組態。 如需詳細資訊,請參閱 授與 IAM 使用者和角色對 Kubernetes API 的存取權未經授權或拒絕存取
  • AWS Cloud9 IDE:AWS Cloud9 是一種雲端式整合開發環境(IDE),可讓您只使用瀏覽器撰寫、執行及偵錯程式碼。 您可以在叢集的 CSV 中建立 AWS Cloud9 IDE,並使用 IDE 與您的叢集通訊。 如需詳細資訊,請參閱在 AWS Cloud9 中建立環境。 您必須確定 Amazon EKS 控制平面安全組包含規則,以允許來自 IDE 安全組的埠 443 上的輸入流量。 如需詳細資訊,請參閱 檢視叢集的 Amazon EKS 安全組需求。 當您為 AWS Cloud9 IDE 設定 kubectl 時,請務必使用已經對應至叢集 RBAC 組態的 AWS 認證,或在移除端點公用存取之前,將 IDE 將使用的 IAM 主體新增至 RBAC 組態。 如需詳細資訊,請參閱 授與 IAM 使用者和角色對 Kubernetes API 的存取權未經授權或拒絕存取

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

API 伺服器的 AKS 網路存取

有兩個選項可保護 AKS、私人 AKS 叢集或授權 IP 範圍中 Kubernetes API 的網路存取。

私人 AKS 叢集

私人 AKS 叢集 可確保 API 伺服器與代理程式節點之間的網路流量會保留在虛擬網路內。 在私人 AKS 叢集中,控制平面或 API 伺服器具有 RFC1918 - 私人因特網位址設定 檔案中定義的內部 IP 位址。 藉由使用私人叢集,您可以確保 API 伺服器與節點集區之間的網路流量只會保留在專用網路上。

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

當您布建私人 AKS 叢集時,AKS 預設會使用私人 DNS 區域建立私人 FQDN,並在 Azure 公用 DNS 中建立具有對應 A 記錄的其他公用 FQDN。 代理程式節點會繼續使用私人 DNS 區域中的 A 記錄,解析私人端點的私人 IP 位址,以便與 API 伺服器通訊。

下圖說明私人 AKS 叢集組態。

顯示私人 AKS 叢集的圖表。

下載此架構的 Visio 檔案

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

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

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

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

私人叢集部署選項

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

  • authorizedIpRanges (string) 以 CIDR 格式指定允許的 IP 範圍。
  • disableRunCommand (布爾值) 會指定是否要停用 run 叢集的命令。
  • enablePrivateCluster (布爾值) 會指定是否要將叢集建立為私用。
  • enablePrivateClusterPublicFQDN (布爾值) 會指定是否要為私人叢集建立另一個公用 FQDN。
  • privateDnsZone (string) 指定節點資源群組中的私人 DNS 區域。 如果您未指定值,資源提供者會建立區域。 您可以指定下列值:
    • System 為預設值。
    • None 默認為公用 DNS,因此 AKS 不會建立私人 DNS 區域。
    • <Your own private DNS zone resource ID> 會使用您以 或 格式 privatelink.<region>.azmk8s.io 建立的私人 DNS 區域 <subzone>.privatelink.<region>.azmk8s.io.

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

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

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

沒有公用 API 伺服器 FQDN 可用。
None 所有 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 位址。 有數個選項可用來建立私人叢集的網路連線:

  1. 使用具有 --vnet-name 旗標的 az vm create 命令,在與 AKS 叢集相同的虛擬網路中建立虛擬機。
  2. 在個別的虛擬網路中使用虛擬機,並使用 AKS 叢集虛擬網路設定 虛擬網路對等互連
  3. 設定 Azure ExpressRoute 或 VPN 以連線到叢集虛擬網路。
  4. 在另一個虛擬網路內建立 Azure 私人端點 連線。
  5. 使用 Cloud Shell 實例部署到連線到叢集 API 伺服器的子網中。

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

在 Azure 入口網站中,您可以使用 Run command 功能在私人叢集上執行命令。 此功能實際上會利用 command invoke 功能在叢集上執行命令。 Run command 功能所建立的 Pod 提供用來管理叢集的 kubectlhelm 工具。 此外,它也支援Bash,其具有 jqxargsgrepawk 等工具。

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

API Server VNet 整合

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

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

公用或私人叢集支援 API Server VNet 整合。 您可以在叢集布建之後新增或移除公用存取權。 不同於非 VNet 整合式叢集,代理程式節點一律會直接與 API 伺服器內部負載平衡器 (ILB) IP 的私人 IP 位址通訊,而不使用 DNS。 API 伺服器流量的所有節點都會保留在專用網上,API 伺服器不需要通道才能連線到節點。 需要與 API 伺服器通訊的叢集外用戶端可以在啟用公用網路存取時正常執行。 如果停用公用網路存取,您應該遵循與標準 私人叢集相同的私人 DNS 設定方法,。 如需詳細資訊,請參閱 使用 API Server VNet 整合建立 Azure Kubernetes Service 叢集

授權的IP範圍

改善叢集安全性並將對 API 伺服器的攻擊降到最低的第二個選項是使用 授權的 IP 範圍。 授權的IP會將公用 AKS 叢集的控制平面存取限制為已知的IP位址和 CIDR 清單。 當您使用此選項時,API 伺服器仍會公開,但存取會受到限制。 如需詳細資訊,請參閱 使用 Azure Kubernetes Service (AKS) 中授權的 IP 位址範圍保護對 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。

下一步

下列參考提供檔和自動化範例的連結,以使用安全的 API 部署 AKS 叢集: