EKS 完全私有叢集 - Eksctl 使用者指南

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

EKS 完全私有叢集

eksctl 支援建立沒有傳出網際網路存取且只有私有子網路的完全私有叢集。VPC 端點用於啟用 AWS 服務的私有存取。

本指南說明如何在沒有傳出網際網路存取的情況下建立私有叢集。

建立完全私有的叢集

建立完全私有叢集的唯一必要欄位是 privateCluster.enabled

privateCluster: enabled: true

建立叢集後,需要存取 Kubernetes API 伺服器的 eksctl 命令必須從叢集的 VPC 內執行、對等 VPC 或使用 AWS Direct Connect 等其他方式執行。如果 eksctl 命令是從叢集的 VPC 內執行,則需要存取 EKS APIs 的 eksctl 命令將無法運作。若要修正此問題,請為 Amazon EKS 建立界面端點,以從 Amazon Virtual Private Cloud (VPC) 私下存取 Amazon Elastic Kubernetes Service (Amazon EKS) 管理 APIs。在未來版本中,eksctl 將新增支援來建立此端點,因此不需要手動建立。啟用適用於 Amazon EKS 的 AWS PrivateLink 之後,需要存取 OpenID Connect 提供者 URL 的命令將需要從叢集的 VPC 外部執行。

建立受管節點群組會繼續運作,而且如果命令是從叢集的 VPC、對等 VPC 內執行或使用 AWS Direct Connect 等其他方式執行,則建立自我管理節點群組會繼續運作,因為它需要透過 EKS 介面端點存取 API 伺服器。

注意

VPC 端點會按小時計費,並根據用量計費。如需定價的詳細資訊,請參閱 AWS PrivateLink 定價

警告

不支援完全私有叢集eu-south-1

設定其他 AWS 服務的私有存取權

為了讓工作者節點能夠私下存取 AWS 服務,eksctl 會為下列服務建立 VPC 端點:

  • ECR 的界面端點 ( ecr.apiecr.dkr) 可提取容器映像 (AWS CNI 外掛程式等)

  • S3 用來提取實際映像層的閘道端點

  • aws-cloud-provider 整合所需的 EC2 介面端點

  • STS 的界面端點,可支援服務帳戶 (IRSA) 的 Fargate 和 IAM 角色

  • 如果啟用 CloudWatch 記錄,則為 CloudWatch 記錄的介面端點 (logs)

這些 VPC 端點對於功能私有叢集至關重要,因此 eksctl 不支援設定或停用它們。不過,叢集可能需要其他 AWS 服務的私有存取權 (例如,Cluster Autoscaler 所需的 Autoscaling)。這些服務可在 中指定privateCluster.additionalEndpointServices,其會指示 eksctl 為每個服務建立 VPC 端點。

例如,若要允許私有存取 Autoscaling 和 CloudWatch 記錄:

privateCluster: enabled: true additionalEndpointServices: # For Cluster Autoscaler - "autoscaling" # CloudWatch logging - "logs"

中支援的端點additionalEndpointServicesautoscalingcloudformationlogs

略過端點建立

如果已使用必要的 AWS 端點建立 VPC 並連結至 EKS 文件中所述的子網路, eksctl可以提供skipEndpointCreation如下的選項來略過建立:

privateCluster: enabled: true skipEndpointCreation: true

此設定無法與 搭配使用additionalEndpointServices。它會略過所有端點建立。此外,只有在正確設定端點<→子網路拓撲時,才建議使用此設定。如果子網路 ID 正確,則會使用字首地址設定vpce路由,建立所有必要的 EKS 端點並將其連結至提供的 VPC。 eksctl 不會變更任何這些資源。

節點群組

全私有叢集僅支援私有節點群組 (受管和自我管理),因為叢集的 VPC 是在沒有任何公有子網路的情況下建立。必須明確設定 privateNetworking 欄位 (nodeGroup[].privateNetworking managedNodeGroup[)。在完全私有叢集中保持privateNetworking未設定是錯誤。

nodeGroups: - name: ng1 instanceType: m5.large desiredCapacity: 2 # privateNetworking must be explicitly set for a fully-private cluster # Rather than defaulting this field to `true`, # we require users to explicitly set it to make the behaviour # explicit and avoid confusion. privateNetworking: true managedNodeGroups: - name: m1 instanceType: m5.large desiredCapacity: 2 privateNetworking: true

叢集端點存取

全私有叢集不支援在叢集建立clusterEndpointAccess期間修改。設定 clusterEndpoints.publicAccess或 時發生錯誤clusterEndpoints.privateAccess,因為完全私有叢集只能擁有私有存取權,而且允許修改這些欄位可能會破壞叢集。

使用者提供的 VPC 和子網路

eksctl 支援使用預先存在的 VPC 和子網路建立完全私有的叢集。只能指定私有子網路,在 下指定子網路時發生錯誤vpc.subnets.public

eksctl 會在提供的 VPC 中建立 VPC 端點,並修改所提供子網路的路由表。每個子網路都應有一個與其相關聯的明確路由表,因為 eksctl 不會修改主路由表。

apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: name: private-cluster region: us-west-2 privateCluster: enabled: true additionalEndpointServices: - "autoscaling" vpc: subnets: private: us-west-2b: id: subnet-0818beec303f8419b us-west-2c: id: subnet-0d42ef09490805e2a us-west-2d: id: subnet-0da7418077077c5f9 nodeGroups: - name: ng1 instanceType: m5.large desiredCapacity: 2 # privateNetworking must be explicitly set for a fully-private cluster # Rather than defaulting this field to true for a fully-private cluster, we require users to explicitly set it # to make the behaviour explicit and avoid confusion. privateNetworking: true managedNodeGroups: - name: m1 instanceType: m5.large desiredCapacity: 2 privateNetworking: true

管理完全私有的叢集

若要讓所有命令在建立叢集後運作,eksctl 將需要 EKS API 伺服器端點的私有存取權,以及傳出網際網路存取權 (適用於 EKS:DescribeCluster)。如果 eksctl 具有傳出網際網路存取,則支援不需要存取 API 伺服器的命令。

強制刪除完全私有的叢集

透過 eksctl 刪除完全私有叢集時可能會發生錯誤,因為 eksctl 不會自動存取叢集的所有資源。 --force存在以解決此問題:它會強制刪除叢集,並在發生錯誤時繼續。

限制

目前實作的限制是 eksctl 一開始會建立同時啟用公有和私有端點存取的叢集,並在所有操作完成後停用公有端點存取。這是必要的,因為 eksctl 需要存取 Kubernetes API 伺服器,以允許自我管理節點加入叢集,並支援 GitOps 和 Fargate。這些操作完成後,eksctl 會將叢集端點存取切換為僅限私有。此額外更新確實表示完全私有叢集的建立需要比標準叢集更長的時間。未來,eksctl 可能會切換到啟用 VPC 的 Lambda 函數,以執行這些 API 操作。

透過 HTTP 代理伺服器傳出存取

eksctl 可以透過設定的 HTTP(S) 代理伺服器與 AWS APIs 通訊,但您需要確保正確設定代理排除清單。

一般而言,您需要設定適當的no_proxy環境變數,包括值 ,以確保叢集的 VPC 端點請求不會透過代理路由.eks.amazonaws.com

如果您的代理伺服器執行「SSL 攔截」,而且您使用服務帳戶 (IRSA) 的 IAM 角色,則需要確保明確略過網域 的 SSL Man-in-the-Middleoidc.<region>.amazonaws.com。否則會導致 eksctl 取得 OIDC 提供者的不正確根憑證指紋,而 AWS VPC CNI 外掛程式將無法啟動,因為無法取得 IAM 憑證,導致您的叢集無法運作。

詳細資訊