本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 Amazon EKS 的安全群組政策 Pod
使用 的安全群組 Pods,您必須擁有現有的安全群組。下列步驟說明如何使用 的安全群組政策 Pod。 除非另有說明,否則請從相同的終端機完成所有步驟,因為變數會用於下列步驟中,這些步驟不會跨終端機持續存在。
如果您有 Pod 使用 Amazon EC2 執行個體時,您必須先設定外掛程式,才能使用此程序。如需詳細資訊,請參閱設定 Amazon VPC CNI plugin for Kubernetes 適用於 Amazon EKS 的安全群組 Pods。
-
建立 Kubernetes 要部署資源的命名空間。您可以取代
my-namespace
搭配您要使用的命名空間名稱。kubectl create namespace my-namespace
-
將 Amazon EKS 部署
SecurityGroupPolicy
到您的叢集。-
將以下內容複製到您的裝置。您可以取代
podSelector
serviceAccountSelector
如果您想要選取 Pods 根據服務帳戶標籤。您必須指定其中一個選取器或其他工具。空白podSelector
(範例:podSelector: {}
) 會選取所有 Pods 在命名空間中。您可以變更my-role
您的角色名稱。空白serviceAccountSelector
會選取命名空間中的所有服務帳戶。您可以取代my-security-group-policy
使用SecurityGroupPolicy
和 的名稱my-namespace
使用您要在SecurityGroupPolicy
其中建立 的命名空間。您必須取代
my_pod_security_group_id
現有安全群組的 ID。如果您沒有現有的安全群組,則必須建立一個。如需詳細資訊,請參閱 Amazon EC2 使用者指南中的 Linux 執行個體的 Amazon Word 安全群組。 EC2 您可以指定 1-5 個安全群組 IDs。如果您指定多個 ID,則所有安全群組中所有規則的組合對選取的 有效 Pods.cat >my-security-group-policy.yaml <<EOF apiVersion: vpcresources.k8s.aws/v1beta1 kind: SecurityGroupPolicy metadata: name: my-security-group-policy namespace: my-namespace spec: podSelector: matchLabels: role: my-role securityGroups: groupIds: - my_pod_security_group_id EOF
重要
您為 指定的安全群組 Pods 必須符合下列條件:
-
它們必須存在。如果它們不存在,則當您部署 Pod 符合選取器、您的 Pod 仍然卡在建立程序中。如果您描述 Pod,您會看到類似下列的錯誤訊息:
An error occurred (InvalidSecurityGroupID.NotFound) when calling the CreateNetworkInterface operation: The securityGroup ID '
。sg-05b1d815d1EXAMPLE
' does not exist -
它們必須允許透過您設定探查的任何連接埠,從套用至節點 (適用於
kubelet
) 的安全群組傳入通訊。 -
它們必須允許透過
TCP
和UDP
連接埠 53 與指派給 的安全群組進行傳出通訊 Pods (或 節點 Pods 執行) 執行 CoreDNS。 您 的安全群組 CoreDNS Pods 必須允許來自您指定安全群組的傳入TCP
和UDP
連接埠 53 流量。 -
他們必須具有必要的傳入和傳出規則,才能與其他 通訊 Pods 他們需要與之通訊。
-
他們必須具有允許 的規則 Pods 與 通訊 Kubernetes 如果您將安全群組與 Fargate 搭配使用,則控制平面。執行此動作最簡單的方法是指定叢集安全群組為其中一個安全群組。
安全群組政策僅適用於新排程的 Pods。 它們不會影響執行中 Pods.
-
-
部署政策。
kubectl apply -f my-security-group-policy.yaml
-
-
使用符合 的標籤部署範例應用程式
my-role
的值podSelector
您在上一個步驟中指定的 。-
將以下內容複製到您的裝置。取代
example values
,然後執行修改後的命令。如果您取代my-role
,請確定它與您在上一個步驟中為選取器指定的值相同。cat >sample-application.yaml <<EOF apiVersion: apps/v1 kind: Deployment metadata: name: my-deployment namespace: my-namespace labels: app: my-app spec: replicas: 4 selector: matchLabels: app: my-app template: metadata: labels: app: my-app role: my-role spec: terminationGracePeriodSeconds: 120 containers: - name: nginx image: public.ecr.aws/nginx/nginx:1.23 ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: my-app namespace: my-namespace labels: app: my-app spec: selector: app: my-app ports: - protocol: TCP port: 80 targetPort: 80 EOF
-
使用下列命令部署應用程式。部署應用程式時,Amazon VPC CNI plugin for Kubernetes 符合
role
標籤,您在上一個步驟中指定的安全群組會套用至 Pod.kubectl apply -f sample-application.yaml
-
-
檢視 Pods 使用範例應用程式部署。對於本主題的餘數,該終端機稱為
TerminalA
。kubectl get pods -n my-namespace -o wide
範例輸出如下。
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES my-deployment-5df6f7687b-4fbjm 1/1 Running 0 7m51s 192.168.53.48 ip-192-168-33-28.region-code.compute.internal <none> <none> my-deployment-5df6f7687b-j9fl4 1/1 Running 0 7m51s 192.168.70.145 ip-192-168-92-33.region-code.compute.internal <none> <none> my-deployment-5df6f7687b-rjxcz 1/1 Running 0 7m51s 192.168.73.207 ip-192-168-92-33.region-code.compute.internal <none> <none> my-deployment-5df6f7687b-zmb42 1/1 Running 0 7m51s 192.168.63.27 ip-192-168-33-28.region-code.compute.internal <none> <none>
注意
如果有的話,請嘗試這些提示 Pods 卡住。
-
如果有任何 Pods 卡在
Waiting
狀態,然後執行kubectl describe pod
。如果您看到my-deployment-xxxxxxxxxx-xxxxx
-nmy-namespace
Insufficient permissions: Unable to create Elastic Network Interface.
,請確認您已在上一個步驟中將 IAM 政策新增至 IAM 叢集角色。 -
如果有任何 Pods 卡在
Pending
狀態中,請確認您的節點執行個體類型已列在 limit.go中,且執行個體類型支援的最大分支網路介面數量乘以節點群組中節點數量的乘積尚未滿足。例如, m5.large
執行個體支援九個分支網路介面。如果您的節點群組有五個節點,則最多可以為節點群組建立 45 個分支網路介面。第 46 日 Pod 您嘗試部署的 將處於Pending
狀態,直到另一個 Pod 具有關聯安全群組的 會被刪除。
如果您執行
kubectl describe pod
,並看到類似下列訊息的訊息,則可以放心地將其忽略。當 時,可能會出現此訊息 Amazon VPC CNI plugin for Kubernetes 會嘗試設定主機聯網,並在建立網路介面時失敗。外掛程式會記錄此事件,直到網路介面建立為止。my-deployment-xxxxxxxxxx-xxxxx
-nmy-namespace
Failed to create Pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container "e24268322e55c8185721f52df6493684f6c2c3bf4fd59c9c121fd4cdc894579f" network for Pod "my-deployment-5df6f7687b-4fbjm": networkPlugin cni failed to set up Pod "my-deployment-5df6f7687b-4fbjm-c89wx_my-namespace" network: add cmd: failed to assign an IP address to container
您無法超過 的最大數量 Pods 可在執行個體類型上執行。如需最大數量 的清單 Pods 您可以在每個執行個體類型上執行,請參閱 上的 eni-max-pods.txt
GitHub。 當您刪除 Pod 具有關聯的安全群組,或刪除 Pod 正在執行,VPC 資源控制器會刪除分支網路介面。如果您使用 刪除叢集 Pods 使用 Pods 對於安全群組,控制器不會刪除分支網路介面,因此您需要自行刪除它們。如需有關如何刪除網路介面的資訊,請參閱 Amazon EC2 使用者指南中的刪除網路介面。 -
-
在單獨的終端機中,將 shell 插入其中一個 Pods。 對於本主題的其餘部分,此終端機稱為
TerminalB
。5df6f7687b
-4fbjm
kubectl exec -it -n my-namespace my-deployment-5df6f7687b-4fbjm -- /bin/bash
-
從
TerminalB
中的 shell,確認範例應用程式是否正常運作。curl my-app
範例輸出如下。
<!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> [...]
您收到輸出,因為所有 Pods 執行應用程式與您建立的安全群組相關聯。該群組包含規則,允許所有 之間的所有流量 Pods 與安全群組相關聯的 。允許將 DNS 流量從該安全群組傳出到叢集安全群組,而該群組與您的節點相關聯。節點正在執行 CoreDNS Pods,您的 Pods 已對 進行名稱查詢。
-
從
TerminalA
中移除允許 DNS 與叢集安全群組通訊的安全群組規則,從您的安全群組中移除。如果您未在上一個步驟中將 DNS 規則新增至叢集安全群組,請取代$my_cluster_security_group_id
以及您建立規則的安全群組 ID。aws ec2 revoke-security-group-ingress --group-id $my_cluster_security_group_id --security-group-rule-ids $my_tcp_rule_id aws ec2 revoke-security-group-ingress --group-id $my_cluster_security_group_id --security-group-rule-ids $my_udp_rule_id
-
從
TerminalB
,再次嘗試存取該應用程式。curl my-app
範例輸出如下。
curl: (6) Could not resolve host: my-app
嘗試失敗,因為 Pod 無法再存取 CoreDNS Pods,其具有與其相關聯的叢集安全群組。叢集安全群組不再具有安全群組規則,允許來自與 相關聯的安全群組的 DNS 通訊 Pod.
如果您嘗試使用其中一個 傳回的 IP 地址來存取應用程式 Pods 在上一個步驟中,您仍然會收到回應,因為所有連接埠都允許在 Pods 具有與其相關聯的安全群組,且不需要名稱查詢。
-
完成實驗後,您可以移除您建立的範例安全群組政策、應用程式和安全群組。從
TerminalA
執行下列命令。kubectl delete namespace my-namespace aws ec2 revoke-security-group-ingress --group-id $my_pod_security_group_id --security-group-rule-ids $my_inbound_self_rule_id wait sleep 45s aws ec2 delete-security-group --group-id $my_pod_security_group_id