Verwenden Sie eine Sicherheitsgruppenrichtlinie für einen Amazon EKS Pod - Amazon EKS

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Verwenden Sie eine Sicherheitsgruppenrichtlinie für einen Amazon EKS Pod

Um Sicherheitsgruppen zu verwenden für Pods, Sie müssen über eine bestehende Sicherheitsgruppe verfügen. Die folgenden Schritte zeigen Ihnen, wie Sie die Sicherheitsgruppenrichtlinie für eine verwenden Pod. Sofern nicht anders angegeben, führen Sie alle Schritte von demselben Terminal aus, da in den folgenden Schritten Variablen verwendet werden, die nicht terminalübergreifend bestehen.

Wenn Sie eine haben Pod Bei EC2 Amazon-Instances müssen Sie das Plugin konfigurieren, bevor Sie dieses Verfahren verwenden. Weitere Informationen finden Sie unter Konfigurieren Sie den Amazon VPC CNI plugin for Kubernetes für Sicherheitsgruppen für Amazon EKS Pods.

  1. Erstellen Sie ein Kubernetes Namespace, in dem Ressourcen bereitgestellt werden sollen. Sie können ersetzen my-namespace mit dem Namen eines Namespaces, den Sie verwenden möchten.

    kubectl create namespace my-namespace
  2. Stellen Sie ein Amazon EKS SecurityGroupPolicy in Ihrem Cluster bereit.

    1. Kopieren Sie den folgenden Inhalt auf Ihr Gerät. Sie können ersetzen podSelector mitserviceAccountSelector, wenn Sie lieber wählen möchten Pods basierend auf den Labels von Dienstkonten. Sie müssen den einen oder anderen Selektor angeben. Ein leeres Feld podSelector (Beispiel:podSelector: {}) wählt alle aus Pods im Namespace. Du kannst ändern my-role zum Namen Ihrer Rolle. Ein leeres serviceAccountSelector wählt alle Servicekonten im Namespace aus. Sie können ersetzen my-security-group-policy mit einem Namen für dein SecurityGroupPolicy und my-namespace mit dem Namespace, SecurityGroupPolicy in dem Sie den erstellen möchten.

      Sie müssen ersetzen my_pod_security_group_id mit der ID einer vorhandenen Sicherheitsgruppe. Wenn Sie noch keine Sicherheitsgruppe haben, müssen Sie eine erstellen. Weitere Informationen finden Sie unter EC2Amazon-Sicherheitsgruppen für Linux-Instances im EC2Amazon-Benutzerhandbuch. Sie können eine Sicherheitsgruppe von 1-5 angebenIDs. Wenn Sie mehr als eine ID angeben, gilt die Kombination aller Regeln in allen Sicherheitsgruppen für die ausgewählten 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
      Wichtig

      Die Sicherheitsgruppe oder Gruppen, die Sie für Ihre angeben Pods muss die folgenden Kriterien erfüllen:

      • Sie müssen vorhanden sein. Wenn sie nicht existieren, dann, wenn Sie eine bereitstellen Pod das entspricht dem Selektor, deinem Pod bleibt im Erstellungsprozess stecken. Wenn du das beschreibst Pod, wird eine Fehlermeldung ähnlich der folgenden angezeigt:An error occurred (InvalidSecurityGroupID.NotFound) when calling the CreateNetworkInterface operation: The securityGroup ID 'sg-05b1d815d1EXAMPLE' does not exist.

      • Sie müssen eingehende Kommunikation von der auf Ihre Knoten (forkubelet) angewendeten Sicherheitsgruppe über alle Ports zulassen, für die Sie Sonden konfiguriert haben.

      • Sie müssen ausgehende Kommunikation über TCP und die UDP Ports 53 zu einer Sicherheitsgruppe zulassen, die der Pods (oder Knoten, die Pods läuft (weiter) CoreDNS. Die Sicherheitsgruppe für Ihre CoreDNS Pods muss eingehenden TCP und UDP Port 53-Verkehr von der von Ihnen angegebenen Sicherheitsgruppe zulassen.

      • Sie müssen über die erforderlichen Regeln für eingehenden und ausgehenden Datenverkehr verfügen, um mit anderen zu kommunizieren Pods mit denen sie kommunizieren müssen.

      • Sie müssen Regeln haben, die es ermöglichen Pods um mit dem zu kommunizieren Kubernetes Kontrollebene, wenn Sie die Sicherheitsgruppe mit Fargate verwenden. Am einfachsten erreichen Sie dies, indem Sie die Cluster-Sicherheitsgruppe als eine der Sicherheitsgruppen angeben.

      Sicherheitsgruppenrichtlinien gelten nur für neu geplante Pods. Sie haben keinen Einfluss auf das Laufen Pods.

    2. Die Richtlinie bereitstellen.

      kubectl apply -f my-security-group-policy.yaml
  3. Stellen Sie eine Beispielanwendung mit einer Bezeichnung bereit, die dem entspricht my-role Wert für podSelector den Sie in einem vorherigen Schritt angegeben haben.

    1. Kopieren Sie den folgenden Inhalt auf Ihr Gerät. Ersetzen Sie das example values durch Ihren eigenen und führen Sie dann den geänderten Befehl aus. Wenn du ersetzst my-role, stellen Sie sicher, dass er mit dem Wert übereinstimmt, den Sie in einem vorherigen Schritt für den Selektor angegeben haben.

      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
    2. Stellen Sie die Anwendung mit dem folgenden Befehl bereit. Wenn Sie die Anwendung bereitstellen, Amazon VPC CNI plugin for Kubernetes entspricht der role Bezeichnung und die Sicherheitsgruppen, die Sie im vorherigen Schritt angegeben haben, werden auf die angewendet Pod.

      kubectl apply -f sample-application.yaml
  4. Sehen Sie sich das an Pods mit der Beispielanwendung bereitgestellt. Für den Rest dieses Themas wird dieses Terminal als TerminalA bezeichnet.

    kubectl get pods -n my-namespace -o wide

    Eine Beispielausgabe sieht wie folgt aus.

    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>
    Anmerkung

    Probieren Sie diese Tipps aus, falls vorhanden Pods stecken fest.

    • Falls überhaupt Pods stecken im Waiting Staat fest, dann laufkubectl describe pod my-deployment-xxxxxxxxxx-xxxxx -n my-namespace . Wenn Sie das sehenInsufficient permissions: Unable to create Elastic Network Interface., bestätigen Sie, dass Sie die IAM Richtlinie in einem vorherigen Schritt zur IAM Clusterrolle hinzugefügt haben.

    • Falls vorhanden Pods im Pending Status feststecken, vergewissern Sie sich, dass Ihr Node-Instance-Typ in limits.go aufgeführt ist und dass das Produkt aus der maximalen Anzahl von Branch-Netzwerkschnittstellen, die vom Instance-Typ unterstützt werden, multipliziert mit der Anzahl der Knoten in Ihrer Knotengruppe noch nicht erreicht wurde. Eine m5.large-Instance unterstützt beispielsweise neun Zweigstellen-Netzwerkschnittstellen. Wenn Ihre Knotengruppe fünf Knoten hat, können maximal 45 Zweigstellen-Netzwerkschnittstellen für die Knotengruppe erstellt werden. Der 46. Pod den Sie einsetzen wollen, bleibt bis auf Pending Weiteres bestehen Pod dem Sicherheitsgruppen zugeordnet sind, wurde gelöscht.

    Wenn Sie kubectl describe pod my-deployment-xxxxxxxxxx-xxxxx -n my-namespace ausführen und eine Meldung ähnlich der folgenden Meldung angezeigt wird, kann sie problemlos ignoriert werden. Diese Meldung kann erscheinen, wenn Amazon VPC CNI plugin for Kubernetes versucht, das Host-Netzwerk einzurichten und schlägt fehl, während die Netzwerkschnittstelle erstellt wird. Das Plug-In protokolliert dieses Ereignis, bis die Netzwerkschnittstelle erstellt wird.

    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

    Sie können die maximale Anzahl von nicht überschreiten Pods das kann auf dem Instance-Typ ausgeführt werden. Für eine Liste der maximalen Anzahl von Pods die Sie auf jedem Instance-Typ ausführen können, finden Sie unter eni-max-pods.txt GitHub. Wenn Sie eine löschen Pod dem Sicherheitsgruppen zugeordnet sind, oder löschen Sie den Knoten, dem Pod läuft auf, löscht der VPC Resource Controller die Zweignetzwerkschnittstelle. Wenn Sie einen Cluster löschen mit Pods verwenden Pods Bei Sicherheitsgruppen löscht der Controller die Netzwerkschnittstellen der Zweigstellen nicht, sodass Sie sie selbst löschen müssen. Informationen zum Löschen von Netzwerkschnittstellen finden Sie unter Löschen einer Netzwerkschnittstelle im EC2 Amazon-Benutzerhandbuch.

  5. Rufen Sie in einem separaten Terminal eines der Pods. Für den Rest dieses Themas wird dieses Terminal bezeichnet alsTerminalB. 5df6f7687b-4fbjm Ersetze es durch die ID eines der Pods wurde in Ihrer Ausgabe aus dem vorherigen Schritt zurückgegeben.

    kubectl exec -it -n my-namespace my-deployment-5df6f7687b-4fbjm -- /bin/bash
  6. Überprüfen Sie in der Shell von TerminalB, dass die Beispielanwendung funktioniert.

    curl my-app

    Eine Beispielausgabe sieht wie folgt aus.

    <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> [...]

    Sie haben die Ausgabe erhalten, weil alle Pods Die Ausführung der Anwendung ist der Sicherheitsgruppe zugeordnet, die Sie erstellt haben. Diese Gruppe enthält eine Regel, die den gesamten Verkehr zwischen allen erlaubt Pods dem die Sicherheitsgruppe zugeordnet ist. DNSAusgehender Datenverkehr von dieser Sicherheitsgruppe zur Cluster-Sicherheitsgruppe, die Ihren Knoten zugeordnet ist, ist zulässig. Auf den Knoten wird das ausgeführt CoreDNS Pods, welches dein Pods habe nach einem Namen gesucht.

  7. Entfernen Sie aus TerminalA Ihrer Sicherheitsgruppe die Sicherheitsgruppenregeln, die die DNS Kommunikation mit der Cluster-Sicherheitsgruppe ermöglichen. Wenn Sie die DNS Regeln nicht in einem vorherigen Schritt zur Clustersicherheitsgruppe hinzugefügt haben, ersetzen Sie $my_cluster_security_group_id mit der ID der Sicherheitsgruppe, in der Sie die Regeln erstellt haben.

    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
  8. Versuchen Sie über TerminalB noch einmal, auf die Anwendung zuzugreifen.

    curl my-app

    Eine Beispielausgabe sieht wie folgt aus.

    curl: (6) Could not resolve host: my-app

    Der Versuch schlägt fehl, weil Pod kann nicht mehr auf die zugreifen CoreDNS Pods, denen die Cluster-Sicherheitsgruppe zugeordnet ist. Die Clustersicherheitsgruppe verfügt nicht mehr über die Sicherheitsgruppenregeln, die die DNS Kommunikation mit der Sicherheitsgruppe zulassen, die Ihrer Gruppe zugeordnet ist Pod.

    Wenn Sie versuchen, mit den IP-Adressen, die für eine der folgenden IP-Adressen zurückgegeben wurden, auf die Anwendung zuzugreifen Pods In einem vorherigen Schritt erhalten Sie immer noch eine Antwort, da alle Ports zwischen Pods denen die Sicherheitsgruppe zugeordnet ist und eine Namenssuche nicht erforderlich ist.

  9. Sobald Sie mit dem Experimentieren fertig sind, können Sie die Beispielsicherheitsgruppenrichtlinie, die Anwendung und die Sicherheitsgruppe, die Sie erstellt haben, entfernen. Führen Sie die folgenden Befehle über TerminalA aus.

    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