本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
AWS 安全群組可做為 EC2 執行個體的虛擬防火牆,以控制傳入和傳出流量。根據預設,Amazon VPC CNI 將使用與節點上主要 ENI 相關聯的安全群組。更具體地說,與執行個體相關聯的每個 ENI 都會有相同的 EC2 安全群組。因此,節點上的每個 Pod 都會與其執行節點共用相同的安全群組。
如下圖所示,在工作者節點上操作的所有應用程式 Pod 都可以存取 RDS 資料庫服務 (考量 RDS 傳入允許節點安全群組)。安全群組太粗精細,因為它們適用於節點上執行的所有 Pod。Pod 的安全群組為工作負載提供網路分段,這是良好深度防禦策略的重要部分。

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

您可以透過設定 VPC CNI ENABLE_POD_ENI=true
來啟用 Pod 的安全群組。啟用後,在控制平面上執行的 VPC 資源控制器AmazonEKSVPCResourceController
受管政策新增至 Amazon EKS 叢集隨附的叢集角色。
控制器也會建立名為 "aws-k8s-branch-eni" 的分支界面,並將其與幹線界面建立關聯。Pod 會使用 SecurityGroupPolicy

分支界面容量會附加至次要 IP 地址的現有執行個體類型限制。使用安全群組的 Pod 不會計入 max-Pod 公式中,而且當您使用安全群組進行 Pod 時,您需要考慮提高 max-Pod 值,或者執行的 Pod 數量比節點實際支援的 Pod 少。
m5.large 最多可以有 9 個分支網路介面,以及最多 27 個次要 IP 地址指派給其標準網路介面。如以下範例所示,m5.large 的預設最大 Pod 為 29,EKS 會將使用安全群組的 Pod 計入最大 Pod。請參閱 EKS 使用者指南,以取得如何變更節點最大裝置的指示。
當 Pod 的安全群組與自訂聯網搭配使用時,會使用 Pod 安全群組中定義的安全群組,而不是 ENIConfig 中指定的安全群組。因此,啟用自訂聯網時,請仔細評估安全群組排序,同時使用每個 Pod 的安全群組。
建議
停用 TCP Early Demux for Liveness 探查
如果您是使用即時或整備探查,您還需要停用 TCP 早期 demux,以便 kubelet 可以透過 TCP 連接到分支網路介面上的 Pod。這只有在嚴格模式下才需要。若要執行此操作,請執行下列命令:
kubectl edit daemonset aws-node -n kube-system
在 initContainer
區段下,將 的值變更為 DISABLE_TCP_EARLY_DEMUX
true.
使用安全群組 Pod 來利用現有的 AWS 組態投資。
安全群組可讓您更輕鬆地限制網路對 VPC 資源的存取,例如 RDS 資料庫或 EC2 執行個體。每個 Pod 的安全群組的一個明顯優勢是有機會重複使用現有的 AWS 安全群組資源。如果您使用安全群組做為網路防火牆來限制對 AWS 服務的存取,建議您使用分支 ENIs 將安全群組套用至 Pod。如果您要將應用程式從 EC2 執行個體轉移到 EKS,並限制存取具有安全群組的其他 AWS 服務,請考慮使用 Pod 的安全群組。
設定 Pod 安全群組強制執行模式
Amazon VPC CNI 外掛程式 1.11 版新增了名為 POD_SECURITY_GROUP_ENFORCING_MODE
(「強制執行模式」) 的新設定。強制執行模式會控制哪些安全群組適用於 Pod,以及是否啟用來源 NAT。您可以指定強制執行模式為嚴格或標準。嚴格是預設值,反映 VPC CNI 的先前行為,並將 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=local,以支援保留用戶端來源 IP (預設類型叢集)。您現在可以使用執行個體目標執行 NodePort 和 LoadBalancer 類型的 Kubernetes 服務,並將 externalTrafficPolicy 設為標準模式的 Local。 會Local
保留用戶端來源 IP,並避免 LoadBalancer 和 NodePort 類型的服務進行第二個跳轉。
部署 NodeLocal DNSCache
使用 Pod 的安全群組時,請設定標準模式以支援使用 NodeLocal DNSCache
NodeLocal DNSCache 在嚴格模式下不受支援,因為所有網路流量,即使是節點,都會進入 VPC。
支援 Kubernetes 網路政策
我們建議您在搭配具有相關聯安全群組的 Pod 使用網路政策時,使用標準強制執行模式。
我們強烈建議為 Pod 使用安全群組,以限制網路層級存取不屬於叢集的 AWS 服務。考慮網路政策來限制叢集內 Pod 之間的網路流量,通常稱為東部/西部流量。
識別每個 Pod 與安全群組的不相容
Windows 型和非 nitro 執行個體不支援 Pod 的安全群組。若要使用具有 Pod 的安全群組,執行個體必須以 isTrunkingEnabled 標記。如果您的 Pod 不依賴 VPC 內外的任何 AWS 服務,請使用網路政策來管理 Pod 之間的存取,而不是安全群組。
每個 Pod 使用安全群組來有效控制 AWS 服務的流量
如果 EKS 叢集內執行的應用程式必須與 VPC 中的其他資源通訊,例如 RDS 資料庫,請考慮使用 SGs進行 Pod。雖然有政策引擎可讓您指定 CIDR 或 DNS 名稱,但與端點位於 VPC 內的 AWS 服務通訊時,它們是較不理想的選擇。
相反地,Kubernetes 網路政策
Amazon EKS 可讓您使用網路政策引擎,例如 Calico
標記單一安全群組以使用 AWS Loadbalancer 控制器
當許多安全群組配置到 Pod 時,Amazon EKS 建議標記具有kubernetes.io/cluster/$name
設定傳出流量的 NAT
來源 NAT 會針對來自指派安全群組之 Pod 的傳出流量停用。對於使用安全群組的 Pod,這些安全群組需要存取使用 NAT 閘道或執行個體設定的私有子網路上的網際網路啟動工作者節點,並在 CNI 中啟用外部 SNAT。
kubectl set env daemonset -n kube-system aws-node AWS_VPC_K8S_CNI_EXTERNALSNAT=true
使用安全群組將 Pod 部署至私有子網路
指派給安全群組的 Pod 必須在部署到私有子網路的節點上執行。請注意,具有部署至公有子網路之指派安全群組的 Pod 將無法存取網際網路。
在 Pod 規格檔案中驗證 terminationGracePeriodSeconds
請確定 Pod 規格檔案中terminationGracePeriodSeconds
的 不是零 (預設為 30 秒)。這對於 Amazon VPC CNI 從工作者節點刪除 Pod 網路至關重要。設為零時,CNI 外掛程式不會從主機移除 Pod 網路,而且分支 ENI 不會有效清除。
將 Pod 的安全群組與 Fargate 搭配使用
在 Fargate 上執行的 Pod 安全群組的運作方式與在 EC2 工作者節點上執行的 Pod 非常類似。例如,您必須先建立安全群組,才能在與 Fargate Pod 相關聯的 SecurityGroupPolicy 中參考安全群組。根據預設,當您未明確將 SecurityGroupPolicy 指派給 Fargate Pod 時,叢集安全群組會指派給所有 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 和 CoreDNS。您也需要新增規則,以允許傳入和傳出連線往返 Fargate Pod。這可讓您的 Pod 與 VPC 中的其他 Pod 或資源通訊。此外,您必須包含 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