本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
每個 Pod 的安全群組
AWS 安全群組可做為EC2執行個體的虛擬防火牆,以控制傳入和傳出流量。根據預設,Amazon VPCCNI將使用與節點ENI上主要 相關聯的安全群組。更具體地說,與執行個體ENI相關聯的每個 都會具有相同的EC2安全群組。因此,節點上的每個 Pod 都會與其執行節點共用相同的安全群組。
如下圖所示,在工作者節點上執行的所有應用程式 Pod 都可以存取RDS資料庫服務 (考慮RDS傳入允許節點安全群組)。安全群組太粗粒,因為它們適用於節點上執行的所有 Pod。Pod 的安全群組為工作負載提供網路分割,這是良好深度防禦策略的重要部分。
透過 Pod 的安全群組,您可以執行對共用運算資源具有不同網路安全需求的應用程式,藉此提高運算效率。如 和 Pod-to-External AWS服務等 Pod-to-Pod多種類型的安全規則,可以在具有EC2安全群組的單一位置定義,並套用到使用 Kubernetes 原生 的工作負載APIs。下圖顯示 Pod 層級套用的安全群組,以及它們如何簡化您的應用程式部署和節點架構。Pod 現在可以存取 Amazon RDS 資料庫。
您可以透過設定 ENABLE_POD_ENI=true
來啟用 Pod VPC 的安全群組CNI。啟用後,在控制平面上執行VPC的資源控制器AmazonEKSVPCResourceController
受管政策新增至與 Amazon 叢集搭配使用的EKS叢集角色。
控制器也會建立名為 "aws-k8s-branch-eni" 的分支介面,並將其與中繼介面建立關聯。Pod 會使用SecurityGroupPolicy
分支介面容量會附加至次要 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 不支援嚴格模式,因為即使節點的所有網路流量都會進入 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 網路政策
Amazon EKS可讓您使用網路政策引擎,例如 Calico
標記單一安全群組以使用 AWS Loadbalancer 控制器
當許多安全群組配置到 Pod 時,Amazon EKS建議標記具有kubernetes.io/cluster/$name
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