每個 Pod 的安全群組 - Amazon EKS

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

每個 Pod 的安全群組

AWS 安全群組可做為EC2執行個體的虛擬防火牆,以控制傳入和傳出流量。根據預設,Amazon VPCCNI將使用與節點ENI上主要 相關聯的安全群組。更具體地說,與執行個體ENI相關聯的每個 都會具有相同的EC2安全群組。因此,節點上的每個 Pod 都會與其執行節點共用相同的安全群組。

如下圖所示,在工作者節點上執行的所有應用程式 Pod 都可以存取RDS資料庫服務 (考慮RDS傳入允許節點安全群組)。安全群組太粗粒,因為它們適用於節點上執行的所有 Pod。Pod 的安全群組為工作負載提供網路分割,這是良好深度防禦策略的重要部分。

連線至 的安全群組節點圖例 RDS

透過 Pod 的安全群組,您可以執行對共用運算資源具有不同網路安全需求的應用程式,藉此提高運算效率。如 和 Pod-to-External AWS服務等 Pod-to-Pod多種類型的安全規則,可以在具有EC2安全群組的單一位置定義,並套用到使用 Kubernetes 原生 的工作負載APIs。下圖顯示 Pod 層級套用的安全群組,以及它們如何簡化您的應用程式部署和節點架構。Pod 現在可以存取 Amazon RDS 資料庫。

Pod 和節點的圖解,具有連接到 的不同安全群組 RDS

您可以透過設定 ENABLE_POD_ENI=true來啟用 Pod VPC 的安全群組CNI。啟用後,在控制平面上執行VPC的資源控制器 (由 管理EKS) 會建立並連接名為 "`aws-k8s-trunk-eni"` 的中繼介面至節點。中繼線介面可做為連接至執行個體的標準網路介面。若要管理中繼線介面,您必須將AmazonEKSVPCResourceController受管政策新增至與 Amazon 叢集搭配使用的EKS叢集角色。

控制器也會建立名為 "aws-k8s-branch-eni" 的分支介面,並將其與中繼介面建立關聯。Pod 會使用SecurityGroupPolicy自訂資源指派安全群組,並與分支介面相關聯。由於安全群組是以網路介面所指定,因此現在我們能夠在這些額外的網路介面上排程需要特定安全群組的 Pod。檢閱 EKSPod 安全群組的使用者指南區段,包括部署先決條件。

具有與 關聯之安全群組的工作者子網路圖例 ENIs

分支介面容量會附加至次要 IP 地址的現有執行個體類型限制。使用安全群組的 Pod 不會計入 max-Pod 公式中,而且當您使用安全群組作為 Pod 時,您需要考慮提高 max-Pod 值,或執行的 Pod 比節點實際支援的少。

m5.large 最多可以有 9 個分支網路介面,以及最多 27 個次要 IP 地址指派給其標準網路介面。如以下範例所示,m5.large 的預設最大 Pod 為 29,並將使用安全群組的 Pod EKS計入最大 Pod。如需如何變更節點最大 Pod 的說明,請參閱 EKS 使用者指南

當 Pod 的安全群組與自訂聯網 搭配使用時,會使用 Pod 安全群組中定義的安全群組,而不是 中指定的安全群組ENIConfig。因此,當啟用自訂聯網時,請仔細評估安全群組排序,同時使用每個 Pod 的安全群組。

建議

停用 TCP Early Demux for Liveness Probe

如果您是使用即時或整備探查,您也需要停用TCP早期 demux,以便 kubelet 可以透過 連線到分支網路介面上的 PodTCP。只有在嚴格模式下才需要這樣做。若要執行此操作,請執行下列命令:

kubectl edit daemonset aws-node -n kube-system

initContainer區段下,將 的值變更為 DISABLE_TCP_EARLY_DEMUX true.

使用 Security Group For Pods 來利用現有的AWS組態投資。

安全群組可讓您更輕鬆地限制網路對VPC資源的存取,例如RDS資料庫或EC2執行個體。每個 Pod 的安全群組的一個明顯優勢是有機會重複使用現有的AWS安全群組資源。如果您使用安全群組做為網路防火牆來限制對 AWS服務的存取,建議您使用分支 將安全群組套用至 PodENIs。如果您要將應用程式從EC2執行個體傳輸至 ,EKS並限制存取具有安全群組的其他 AWS 服務,請考慮使用 Pod 的安全群組。

設定 Pod 安全群組強制執行模式

Amazon VPC CNI 外掛程式 1.11 版新增了名為 POD_SECURITY_GROUP_ENFORCING_MODE(「強制執行模式」) 的新設定。強制執行模式會控制哪些安全群組適用於 Pod,以及是否NAT已啟用來源。您可以指定強制執行模式為嚴格或標準。嚴格是預設值,反映 的先前行為VPCCNI,並將 ENABLE_POD_ENI 設定為 true

在嚴格模式下,只會強制執行分支ENI安全群組。來源NAT也會停用。

在標準模式中,會套用與主要ENI和分支 ENI(與 Pod 相關聯) 相關聯的安全群組。網路流量必須符合兩個安全群組。

警告

任何模式變更都只會影響新啟動的 Pod。現有的 Pod 將使用建立 Pod 時設定的模式。如果客戶想要變更流量行為,則需要回收具有安全群組的現有 Pod。

強制執行模式:使用嚴格模式隔離 Pod 和節點流量:

根據預設,Pod 的安全群組會設定為「嚴格模式」。如果您必須完全將 Pod 流量與節點的其他流量分開,請使用此設定。在嚴格模式下,NAT會關閉來源,以便可以使用分支ENI傳出安全群組。

警告

啟用嚴格模式時,來自 Pod 的所有傳出流量都會離開節點並進入VPC網路。相同節點上 Pod 之間的流量會經過 VPC。這會增加VPC流量並限制節點型功能。嚴格模式 NodeLocal DNSCache不支援 。

強制執行模式:在下列情況下使用標準模式

Pod 中容器可見的用戶端來源 IP

如果您需要讓 Pod 中的容器可看見用戶端來源 IP,請考慮POD_SECURITY_GROUP_ENFORCING_MODE將 設定為 standard。Kubernetes 服務支援 externalTrafficPolicy=本機,以支援用戶端來源 IP (預設類型叢集) 的保留。您現在可以在標準模式下執行 Kubernetes 服務類型 NodePort , LoadBalancer 並使用執行個體目標,並將 externalTrafficPolicy 設定為 Local。 會Local保留用戶端來源 IP,並避免 LoadBalancer 和 NodePort 類型的服務進行第二個跳轉。

部署 NodeLocal DNSCache

使用 Pod 的安全群組時,請設定標準模式以支援使用 的 PodNodeLocal DNSCache。 NodeLocal DNSCache 會將DNS快取代理程式作為 執行到叢集節點,以改善叢集DNS效能 DaemonSet。這將有助於具有最高DNSQPS需求的 Pod 查詢具有本機快取的本機 kube-dns/CoreDNS,這將改善延遲。

NodeLocal DNSCache 不支援嚴格模式,因為即使節點的所有網路流量都會進入 VPC。

支援 Kubernetes 網路政策

我們建議您在將網路政策與具有關聯安全群組的 Pod 搭配使用時,使用標準強制執行模式。

我們強烈建議為 Pod 使用安全群組,以限制網路層級存取AWS不屬於叢集的服務。考慮網路政策來限制叢集內 Pod 之間的網路流量,通常稱為東部/西部流量。

識別每個 Pod 與安全群組的不相容

Windows 型和非硝基執行個體不支援 Pod 的安全群組。若要將安全群組與 Pod 搭配使用,執行個體必須加上 標籤 isTrunkingEnabled。如果您的 Pod 不依賴 內外的任何AWS服務,請使用網路政策來管理 Pod 之間的存取,而不是安全群組VPC。

每個 Pod 使用安全群組來有效控制 AWS Services 的流量

如果EKS叢集中執行的應用程式必須與 中的其他資源通訊VPC,例如RDS資料庫,請考慮使用 SGs 進行 Pod。雖然有政策引擎可讓您指定 CIDR或 DNS名稱,但在與具有位於 內端點AWS的服務通訊時,它們是較不理想的選擇VPC。

相反地,Kubernetes 網路政策提供控制叢集內外輸入和輸出流量的機制。如果您的應用程式對其他服務的相依性有限,應考慮 Kubernetes 網路政策AWS。您可以設定網路政策,根據CIDR範圍指定輸出規則,以限制對AWS服務的存取,而不是 等AWS原生語義SGs。您可以使用 Kubernetes 網路政策來控制 Pod 之間的網路流量 (通常稱為東部/西部流量),以及 Pod 與外部服務之間的網路流量。Kubernetes 網路政策在OSI層級 3 和 4 實作。

Amazon EKS可讓您使用網路政策引擎,例如 CalicoCilium 。根據預設,不會安裝網路政策引擎。如需如何設定的指示,請參閱各自的安裝指南。如需如何使用網路政策的詳細資訊,請參閱EKS安全最佳實務 。企業版網路政策引擎提供DNS主機名稱功能,這對於控制 Kubernetes Services/Pod 與在 之外執行的資源之間的流量很有用AWS。此外,您也可以考慮對預設不支援安全群組之 AWS 服務的DNS主機名稱支援。

標記單一安全群組以使用 AWS Loadbalancer 控制器

當許多安全群組配置到 Pod 時,Amazon EKS建議標記具有kubernetes.io/cluster/$name共用或擁有的單一安全群組。此標籤可讓 AWS Loadbalancer Controller 更新安全群組的規則,將流量路由至 Pod。如果只將一個安全群組指派給 Pod,則標籤的指派為選擇性。安全群組中設定的許可是累加的,因此標記單一安全群組就足以讓 loadbalancer 控制器找到和協調規則。它也有助於遵守安全群組定義的預設配額

NAT 設定傳出流量

NAT 針對來自指派安全群組之 Pod 的傳出流量,會停用來源。對於使用安全群組的 Pod,這些安全群組需要存取使用NAT閘道或執行個體設定的私有子網路上的網際網路啟動工作者節點,並在 中啟用外部SNATCNI。

kubectl set env daemonset -n kube-system aws-node AWS_VPC_K8S_CNI_EXTERNALSNAT=true

將具有安全群組的 Pod 部署至私有子網路

指派給安全群組的 Pod 必須在部署到私有子網路的節點上執行。請注意,已將指派安全群組部署至公有子網路的 Pod 無法存取網際網路。

在 Pod 規格檔案中驗證terminationGracePeriod秒數

確保 Pod 規格檔案中terminationGracePeriodSeconds的 不是零 (預設為 30 秒)。這對於 Amazon 從工作者節點VPCCNI刪除 Pod 網路至關重要。設為零時,CNI外掛程式不會從主機移除 Pod 網路,而且分支ENI也不會有效清除。

將 Pod 的安全群組與 Fargate 搭配使用

在 Fargate 上執行的 Pod 安全群組的運作方式與在EC2工作者節點上執行的 Pod 非常類似。例如,您必須先建立安全群組,才能在與 Fargate Pod SecurityGroupPolicy 相關聯的 中參考安全群組。根據預設,當您未明確將 指派給 Fargate Pod 時 SecurityGroupPolicy ,叢集安全群組會連接至所有 Fargate Pod。為了簡單起見,您可能想要將叢集安全群組新增至 Fagate Pod, SecurityGroupPolicy 否則您必須將最低安全群組規則新增至安全群組。您可以使用 describe-cluster 找到叢集安全群組API。

aws eks describe-cluster --name CLUSTER_NAME --query 'cluster.resourcesVpcConfig.clusterSecurityGroupId'
cat >my-fargate-sg-policy.yaml <<EOF apiVersion: vpcresources.k8s.aws/v1beta1 kind: SecurityGroupPolicy metadata: name: my-fargate-sg-policy namespace: my-fargate-namespace spec: podSelector: matchLabels: role: my-fargate-role securityGroups: groupIds: - cluster_security_group_id - my_fargate_pod_security_group_id EOF

最低安全群組規則列於此處 。這些規則允許 Fargate Pod 與叢集內服務通訊,例如 kube-apiserver、kubelet 和 Core DNS。您也需要新增規則,以允許進出 Fargate Pod 的傳入和傳出連線。這可讓您的 Pod 與 中的其他 Pod 或資源通訊VPC。此外,您必須包含 Fargate 規則,才能從 Amazon ECR或其他容器登錄檔提取容器映像,例如 DockerHub。如需詳細資訊,請參閱 AWS一般參考 中的 AWS IP 地址範圍。

您可以使用下列命令來尋找套用至 Fargate Pod 的安全群組。

kubectl get pod FARGATE_POD -o jsonpath='{.metadata.annotations.vpc\.amazonaws\.com/pod-eni}{"\n"}'

從上述命令記下 eniId 。

aws ec2 describe-network-interfaces --network-interface-ids ENI_ID --query 'NetworkInterfaces[*].Groups[*]'

必須刪除並重新建立現有的 Fargate Pod,才能套用新的安全群組。例如,下列命令會啟動 example-app 的部署。若要更新特定 Pod,您可以在下列命令中變更命名空間和部署名稱。

kubectl rollout restart -n example-ns deployment example-pod

📝 在 上編輯此頁面 GitHub