Sicherheitsgruppen für Pods - Amazon EKS

Hilf mit, diese Seite zu verbessern

Möchten Sie zu diesem Benutzerhandbuch beitragen? Scrollen Sie zum Ende dieser Seite und wählen Sie Diese Seite bearbeiten am aus GitHub. Ihre Beiträge werden dazu beitragen, unser Benutzerhandbuch für alle zu verbessern.

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.

Sicherheitsgruppen für Pods

Sicherheitsgruppen für Pods integrieren Amazon-EC2-Sicherheitsgruppen in KubernetesPods. Sie können Amazon-EC2-Sicherheitsgruppen verwenden, um Regeln zu definieren, die ein- und ausgehenden Netzwerkverkehr zu und von Pods zulassen, die Sie auf Knoten bereitstellen, die auf vielen Amazon-EC2-Instance-Typen und Fargate ausgeführt werden. Eine ausführliche Erläuterung dieser Funktion finden Sie im Blogbeitrag Einführung in Sicherheitsgruppen für Pods.

Überlegungen

  • Berücksichtigen Sie vor der Bereitstellung von Sicherheitsgruppen für Pods die folgenden Einschränkungen und Bedingungen:

  • Sicherheitsgruppen für Pods können nicht mit Windows-Knoten verwendet werden.

  • Sicherheitsgruppen für Pods können mit für die IPv6-Produktfamilie konfigurierten Clustern verwendet werden, die Amazon-EC2-Knoten enthalten. Hierfür muss mindestens die Version 1.16.0 des Amazon-VPC-CNI-Plug-ins verwendet werden. Sie können Sicherheitsgruppen für Pods mit für die IPv6-Produktfamilie konfigurierten Clustern verwenden, die nur Fargate-Knoten enthalten. Hierfür muss mindestens die Version 1.7.7 des Amazon-VPC-CNI-Plug-ins verwendet werden. Weitere Informationen finden Sie unter IPv6Adressen für ClusterPods, und services.

  • Sicherheitsgruppen für Pods werden von den meisten Nitro-basierten Amazon-EC2-Instance-Familien unterstützt, jedoch nicht von allen Generationen einer Familie. Zum Beispiel werden die Familie und die Generationen m5 c5 r5 m6gc6g,,, und r6g Instance unterstützt. Es werden keine Instance-Typen in der t-Familie unterstützt. Eine vollständige Liste der unterstützten Instance-Typen finden Sie in der limits.go-Datei auf Github. Ihre Knoten müssen von einem der aufgelisteten Instance-Typen sein, die in der Datei mit IsTrunkingCompatible: true gekennzeichnet sind.

  • Wenn Sie auch Pod-Sicherheitsrichtlinien verwenden, um den Zugriff auf die Pod-Mutation einzuschränken, dann muss der eks:vpc-resource-controller Kubernetes-Benutzer im Kubernetes ClusterRoleBinding für das role angegeben werden, dem Ihr psp zugewiesen ist. Bei Verwendung der standardmäßigen Amazon-EKS-Elemente psp, role und ClusterRoleBinding ist dies eks:podsecuritypolicy:authenticated ClusterRoleBinding. Fügen Sie beispielsweise den Benutzer zum subjects:-Abschnitt hinzu, wie im folgenden Beispiel gezeigt:

    [...] subjects: - kind: Group apiGroup: rbac.authorization.k8s.io name: system:authenticated - apiGroup: rbac.authorization.k8s.io kind: User name: eks:vpc-resource-controller - kind: ServiceAccount name: eks-vpc-resource-controller
  • Wenn Sie benutzerdefinierte Netzwerk- und Sicherheitsgruppen für Pods zusammen verwenden, wird anstelle der in ENIConfig angegebenen Sicherheitsgruppe die durch Sicherheitsgruppen für Pods angegebene Sicherheitsgruppe verwendet.

  • Wenn Sie Version 1.10.2 oder älter des Amazon-VPC-CNI-Plugins verwenden und die Einstellung terminationGracePeriodSeconds in Ihre Pod-Spezifikation aufnehmen, darf der Wert der Einstellung nicht Null sein.

  • Wenn Sie Version 1.10 oder eine frühere Version des Amazon-VPC-CNI-Plugins verwenden oder Version 1.11 mit POD_SECURITY_GROUP_ENFORCING_MODE = strict, was die Standardeinstellung ist, dann werden Kubernetes-Services vom Typ NodePort und LoadBalancer, die Instance-Ziele verwenden, für die externalTrafficPolicy auf Local eingestellt ist, nicht für Pods unterstützt, denen Sie Sicherheitsgruppen zuweisen. Weitere Informationen zur Verwendung eines Load Balancers mit Instance-Zielen finden Sie unter Route TCP und UDP Verkehr mit Network Load Balancers.

  • Wenn Sie Version 1.10 des Amazon-VPC-CNI-Plugins oder höher verwenden oder Version 1.11 mit POD_SECURITY_GROUP_ENFORCING_MODE=strict, was die Standardeinstellung ist, ist die Quell-NAT für von Pods mit zugewiesenen Sicherheitsgruppen ausgehenden Datenverkehr deaktiviert, damit Sicherheitsgruppenregeln für ausgehenden Datenverkehr angewendet werden können. Um auf das Internet zuzugreifen, müssen Pods mit zugewiesenen Sicherheitsgruppen auf Knoten gestartet werden, die in einem privaten Subnetz bereitgestellt werden, das mit einem NAT-Gateway oder einer NAT-Instance konfiguriert ist. Pods mit zugewiesenen Sicherheitsgruppen, die in öffentlichen Subnetzen bereitgestellt werden, haben keinen Internetzugriff.

    Wenn Sie Version 1.11 oder höher des Plugins mit POD_SECURITY_GROUP_ENFORCING_MODE=standard verwenden, wird Pod-Datenverkehr, der für außerhalb der VPC bestimmt ist, an die IP-Adresse der primären Netzwerkschnittstelle der Instance weitergeleitet. Für diesen Datenverkehr werden die Regeln in den Sicherheitsgruppen für die primäre Netzwerkschnittstelle anstelle der Regeln in den Pod's-Sicherheitsgruppen verwendet.

  • Um die Calico-Netzwerkrichtlinie mit Pods zu verwenden, denen Sicherheitsgruppen zugewiesen sind, müssen Sie Version 1.11.0 oder höher des Amazon-VPC-CNI-Plugins verwenden und POD_SECURITY_GROUP_ENFORCING_MODE=standard festlegen. Andernfalls wird Datenverkehr zu und von Pods mit zugehörigen Sicherheitsgruppen nicht von den Calico-Netzwerkrichtlinien geregelt, sondern es gelten ausschließlich die Amazon-EC2-Sicherheitsgruppen. Informationen zum Aktualisieren Ihrer Version von Amazon VPC CNI finden Sie unter Arbeiten mit dem Amazon VPC CNI plugin for Kubernetes EKS Amazon-Add-on.

  • Pods, die auf Amazon EC2-Knoten ausgeführt werden, die Sicherheitsgruppen in Clustern verwenden, die Nodelocal DNSCache verwenden, werden nur mit Version 1.11.0 oder höher des Amazon-VPC-CNI-Plugins mit der Einstellung POD_SECURITY_GROUP_ENFORCING_MODE=standard unterstützt. Informationen zum Aktualisieren Ihrer Version des Amazon-VPC-CNI-Plug-ins finden Sie unter Arbeiten mit dem Amazon VPC CNI plugin for Kubernetes EKS Amazon-Add-on.

  • Sicherheitsgruppen für Pods können zu einer höheren Pod-Startlatenz für Pods mit hoher Abwanderung führen. Dies ist auf eine Ratenbegrenzung im Ressourcencontroller zurückzuführen.

Konfigurieren Sie das Amazon VPC CNI plugin for Kubernetes für Sicherheitsgruppen für Pods

Sicherheitsgruppen für Pods bereitstellen

Wenn Sie Sicherheitsgruppen nur für Fargate-Pods verwenden und keine Amazon-EC2-Knoten in Ihrem Cluster haben, fahren Sie mit Schritt Eine Beispielanwendung bereitstellen fort.

  1. Überprüfen Sie Ihre aktuelle Amazon VPC CNI plugin for Kubernetes-Version mit dem folgenden Befehl:

    kubectl describe daemonset aws-node --namespace kube-system | grep amazon-k8s-cni: | cut -d : -f 3

    Eine Beispielausgabe sieht wie folgt aus.

    v1.7.6

    Wenn Ihre Amazon VPC CNI plugin for Kubernetes-Version älter als 1.7.7 ist, aktualisieren Sie das Plugin auf Version 1.7.7 oder höher. Weitere Informationen finden Sie unter Arbeiten mit dem Amazon VPC CNI plugin for Kubernetes EKS Amazon-Add-on.

  2. Fügen Sie die verwaltete AmazonEKSVPCResourceController-IAM-Richtlinie der Cluster-Rolle hinzu, die Ihrem Amazon-EKS-Cluster zugeordnet ist. Die Richtlinie ermöglicht es der Rolle, Netzwerkschnittstellen, ihre privaten IP-Adressen sowie deren An- und Abkopplung an und von Netzwerk-Instances zu verwalten.

    1. Rufen Sie den Namen Ihrer Cluster-IAM-Rolle ab und speichern Sie ihn in einer Variablen. Ersetzen Sie my-cluster mit dem Namen Ihres Clusters.

      cluster_role=$(aws eks describe-cluster --name my-cluster --query cluster.roleArn --output text | cut -d / -f 2)
    2. Fügen Sie der Rolle die -Richtlinie an.

      aws iam attach-role-policy --policy-arn arn:aws:iam::aws:policy/AmazonEKSVPCResourceController --role-name $cluster_role
  3. Aktivieren Sie das Amazon-VPC-CNI-Add-on, um Netzwerkschnittstellen für Pods zu verwalten, indem Sie die ENABLE_POD_ENI-Variable im aws-node DaemonSet auf true setzen. Wenn diese Einstellung auf true festgelegt wurde, erstellt das Add-on für jeden Knoten im Cluster eine benutzerdefinierte cninode-Ressource. Der VPC-Ressourcen-Controller erstellt und verknüpft eine spezielle Netzwerkschnittstelle, die als Trunk-Netzwerkschnittstelle mit der Beschreibung aws-k8s-trunk-eni bezeichnet wird.

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

    Die Trunk-Netzwerkschnittstelle ist in der maximalen Anzahl von Netzwerkschnittstellen enthalten, die vom Instance-Typ unterstützt werden. Eine Liste der maximalen Anzahl von Netzwerkschnittstellen, die von jedem Instance-Typ unterstützt werden, finden Sie unter IP-Adressen pro Netzwerkschnittstelle pro Instance-Typ im Amazon EC2 EC2-Benutzerhandbuch. Wenn an Ihren Knoten bereits die maximale Anzahl an Standardnetzwerkschnittstellen angeschlossen ist, reserviert der VPC-Ressourcencontroller einen Speicherplatz. Sie müssen Ihre laufenden Pods so weit herunterskalieren, dass der Controller eine Standard-Netzwerkschnittstelle trennen und löschen, die Trunk-Netzwerkschnittstelle erstellen und an die Instance anhängen kann.

  4. Mit dem folgenden Befehl können Sie ermitteln, welche Ihrer Knoten über eine benutzerdefinierte Ressource vom Typ CNINode verfügen. Wenn No resources found zurückgegeben wird, warten Sie einige Sekunden und versuchen Sie es dann erneut. Der vorherige Schritt erfordert einen Neustart des Amazon VPC CNI plugin for Kubernetes Pods, was mehrere Sekunden dauert.

    $ kubectl get cninode -A NAME FEATURES ip-192-168-64-141.us-west-2.compute.internal [{"name":"SecurityGroupsForPods"}] ip-192-168-7-203.us-west-2.compute.internal [{"name":"SecurityGroupsForPods"}]

    Wenn Sie VPC-CNI-Versionen verwenden, die älter als 1.15 sind, wurden anstelle der benutzerdefinierten CNINode-Ressource Knotenbezeichnungen verwendet. Mit dem folgenden Befehl können Sie ermitteln, bei welchen Ihrer Knoten die Knotenbezeichnung aws-k8s-trunk-eni auf true festgelegt ist. Wenn No resources found zurückgegeben wird, warten Sie einige Sekunden und versuchen Sie es dann erneut. Der vorherige Schritt erfordert einen Neustart des Amazon VPC CNI plugin for Kubernetes Pods, was mehrere Sekunden dauert.

    kubectl get nodes -o wide -l vpc.amazonaws.com/has-trunk-attached=true -

    Nachdem die Trunk-Netzwerkschnittstelle erstellt wurde, werden Pods sekundäre IP-Adressen von der Trunk- oder Standardnetzwerkschnittstelle zugewiesen. Die Trunk-Schnittstelle wird automatisch gelöscht, wenn der Knoten gelöscht wird.

    Wenn Sie in einem späteren Schritt eine Sicherheitsgruppe für einen Pod bereitstellen, erstellt der VPC-Ressourcen-Controller eine spezielle Netzwerkschnittstelle, die als Zweigstellennetzwerkschnittstelle bezeichnet wird, mit einer Beschreibung von aws-k8s-branch-eni und ordnet ihr die Sicherheitsgruppen zu. Neben den an den Knoten angeschlossenen Standard- und Amtsnetzschnittstellen werden Nebenstellennetzschnittstellen erstellt.

    Wenn Sie Lebend- oder Bereitschaftserkennung verwenden, müssen Sie auch das frühe TCP-Demux deaktivieren, damit das kubelet über TCP eine Verbindung zu Pods auf Zweigstellennetzwerkschnittstellen herstellen kann. Führen Sie den folgenden Befehl aus, um das frühe TCP-Demux zu deaktivieren:

    kubectl patch daemonset aws-node -n kube-system \ -p '{"spec": {"template": {"spec": {"initContainers": [{"env":[{"name":"DISABLE_TCP_EARLY_DEMUX","value":"true"}],"name":"aws-vpc-cni-init"}]}}}}'
    Anmerkung

    Wenn Sie 1.11.0 oder höher des Amazon VPC CNI plugin for Kubernetes-Add-ons verwenden und POD_SECURITY_GROUP_ENFORCING_MODE=standard gilt, wie im nächsten Schritt beschrieben, müssen Sie den vorherigen Befehl nicht ausführen.

  5. Wenn Ihr Cluster NodeLocal DNSCache verwendet oder Sie auf Pods, die eigene Sicherheitsgruppen haben, die Calico-Netzwerkrichtlinie anwenden möchten, oder wenn Sie für Pods, denen Sie Sicherheitsgruppen zuweisen möchten, Kubernetes-Services vom Typ NodePort und LoadBalancer haben, die Instance-Ziele mit einer externalTrafficPolicy auf Local verwenden, dann müssen Sie Version 1.11.0 oder höher des Amazon VPC CNI plugin for Kubernetes-Add-Ons verwenden, und Sie müssen die folgende Einstellung aktivieren:

    kubectl set env daemonset aws-node -n kube-system POD_SECURITY_GROUP_ENFORCING_MODE=standard
    Wichtig
    • Pod-Sicherheitsgruppenregeln werden nicht auf den Datenverkehr zwischen Pods oder zwischen Pods und services, wie beispielsweise kubelet oder nodeLocalDNS, angewendet, die sich auf demselben Knoten befinden. Pods, die verschiedene Sicherheitsgruppen auf demselben Knoten verwenden, können nicht kommunizieren, da sie in verschiedenen Subnetzen konfiguriert sind und das Routing zwischen diesen Subnetzen deaktiviert ist.

    • Für ausgehenden Datenverkehr von Pods an Adressen außerhalb der VPC wird die Netzwerkadresse in die IP-Adresse der primären Netzwerkschnittstelle der Instance übersetzt (es sei denn, Sie haben auch AWS_VPC_K8S_CNI_EXTERNALSNAT=true festgelegt). Für diesen Datenverkehr werden die Regeln in den Sicherheitsgruppen für die primäre Netzwerkschnittstelle anstelle der Regeln in den Pod's-Sicherheitsgruppen verwendet.

    • Damit diese Einstellung auf vorhandene Pods angewendet wird, müssen Sie die Pods oder die Knoten, auf denen die Pods ausgeführt werden, neu starten.

Eine Beispielanwendung bereitstellen

Um Sicherheitsgruppen für Pods zu verwenden, müssen Sie über eine bestehende Sicherheitsgruppe verfügen und auf Ihrem Cluster die Amazon-EKS-SecurityGroupPolicy bereitstellen, wie nachfolgend beschrieben. In den folgenden Schritten wird gezeigt, wie Sie die Sicherheitsgruppenrichtlinie für ein Pod verwenden. Wenn nicht anders angegeben, führen Sie alle Schritte vom selben Terminal aus, da Variablen in den folgenden Schritten verwendet werden, die nicht über Terminals hinweg bestehen bleiben.

Ein Beispiel-Pod mit einer Sicherheitsgruppe bereitstellen
  1. Erstellen Sie einen Kubernetes-Namespace zum Bereitstellen von Ressourcen. Sie können my-namespace durch den Namen eines Namespace ersetzen, 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 podSelector durch serviceAccountSelector ersetzen, wenn Sie Pods lieber basierend auf Servicekontomarkierungen auswählen möchten. Sie müssen den einen oder anderen Selektor angeben. Ein leeres podSelector (Beispiel: podSelector: {}) wählt alle Pods im Namespace aus. Sie können my-role in den Namen Ihrer Rolle ändern. Ein leeres serviceAccountSelector wählt alle Servicekonten im Namespace aus. Sie können my-security-group-policy durch einen Namen für Ihr SecurityGroupPolicy und my-namespace durch den Namespace ersetzen, in dem Sie das SecurityGroupPolicy erstellen möchten.

      Sie müssen my_pod_security_group_id durch die ID einer bestehenden Sicherheitsgruppe ersetzen. Wenn Sie nicht über eine bestehende Sicherheitsgruppe verfügen, müssen Sie eine erstellen. Weitere Informationen finden Sie unter Amazon-EC2-Sicherheitsgruppen für Linux-Instances im Amazon-EC2-Benutzerhandbuch. Sie können 1–5 Sicherheitsgruppen-IDs angeben. Falls 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 Pods angeben, müssen die folgenden Kriterien erfüllen:

      • Sie müssen vorhanden sein. Wenn sie nicht vorhanden sind, bleibt Ihr Pod im Erstellungsprozess hängen, wenn Sie einen Pod bereitstellen, der dem Selektor entspricht. Wenn Sie den Pod beschreiben, 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.

      • Diese müssen eingehende Kommunikation von der auf Ihre Knoten angewendeten Sicherheitsgruppe (für kubelet) über alle Ports erlauben, für die Sie Tests konfiguriert haben.

      • Diese müssen ausgehende Kommunikation über die TCP- und UDP-Ports 53 zu einer Sicherheitsgruppe zulassen, die dem Pods (oder den Knoten, auf denen die Pods ausgeführt werden) zugeordnet ist, auf denen CoreDNS ausgeführt wird. Die Sicherheitsgruppe für Ihr CoreDNS Pods muss eingehenden TCP- und UDP-Port-53-Datenverkehr von der von Ihnen angegebenen Sicherheitsgruppe zulassen.

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

      • Wenn Sie die Sicherheitsgruppe mit Fargate verwenden, stellen Sie sicher, dass sie über Regeln verfügen, die es den Pods ermöglichen, mit der Kubernetes-Steuerebene zu kommunizieren. 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 laufende Pods.

    2. Die Richtlinie bereitstellen.

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

    1. Kopieren Sie den folgenden Inhalt auf Ihr Gerät. Ersetzen Sie die Beispielwerte durch Ihre eigenen, und führen Sie dann den geänderten Befehl aus. Wenn Sie my-role ersetzen, stellen Sie sicher, dass es dem Wert entspricht, 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, entspricht das Amazon VPC CNI plugin for Kubernetes der role-Markierung und die Sicherheitsgruppen, die Sie im vorherigen Schritt angegeben haben, werden auf den Pod angewendet.

      kubectl apply -f sample-application.yaml
  4. Zeigen Sie die Pods an, die mit der Beispielanwendung bereitgestellt wurden. 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
    • Wenn Pods im Waiting-Zustand hängen bleiben, führen Sie kubectl describe pod my-deployment-xxxxxxxxxx-xxxxx -n my-namespace aus. Wenn Sie Insufficient permissions: Unable to create Elastic Network Interface. sehen, bestätigen Sie, dass Sie die IAM-Richtlinie in einem vorherigen Schritt zur IAM-Cluster-Rolle hinzugefügt haben.

    • Wenn Pods im Pending-Status hängen bleiben, überprüfen Sie, ob der Instance-Typ Ihres Knotens in limits.go aufgeführt ist, und dass die maximale Anzahl der vom Instance-Typ unterstützten Zweigstellennetzwerkschnittstellen 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 bereitstellen möchten, bleibt im Pending-Zustand, bis ein anderer Pod mit zugehörigen Sicherheitsgruppen gelöscht wird.

    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 das Amazon VPC CNI plugin for Kubernetes versucht, das Host-Netzwerk einzurichten, und dies fehlschlägt, 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

    Die maximale Anzahl von Pods, die auf dem Instance-Typ ausgeführt werden können, darf nicht überschritten werden. Eine Liste der maximalen Anzahl von Pods, die Sie auf jedem Instance-Typ ausführen können, finden Sie unter eni-max-pods.txt auf GitHub. Wenn Sie einen Pod mit zugeordneten Sicherheitsgruppen oder den Knoten löschen, auf dem der Pod ausgeführt wird, löscht der VPC-Ressourcen-Controller die Zweigstellennetzwerkschnittstelle. Wenn Sie einen Cluster mit Pods löschen, indem Sie Pods für Sicherheitsgruppen verwenden, löscht der Controller die Netzwerkschnittstellen der Zweigstelle nicht, sodass Sie diese selbst löschen müssen. Informationen zum Löschen von Netzwerkschnittstellen finden Sie unter Löschen einer Netzwerkschnittstelle im Amazon EC2 EC2-Benutzerhandbuch.

  5. Setzen Sie in einem separaten Terminal eine Shell in einen der Pods ein. Für den Rest dieses Themas wird dieses Terminal als TerminalB bezeichnet. Ersetzen Sie 5df6f7687b-4fbjm mit der ID eines der Pods, die Sie in der Ausgabe im vorherigen Schritt erhalten haben.

    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 diese Ausgabe erhalten, weil alle Pods, auf denen die Anwendung ausgeführt wird, mit der Sicherheitsgruppe verknüpft sind, die Sie erstellt haben. Diese Gruppe enthält eine Regel, die den gesamten Datenverkehr zwischen allen Pods zulässt, mit denen die Sicherheitsgruppe verknüpft ist. DNS-Datenverkehr wird von dieser Sicherheitsgruppe an die Cluster-Sicherheitsgruppe übertragen, die mit Ihren Knoten verknüpft ist. Auf den Knoten werden CoreDNS-Pods ausgeführt, für die Ihr Pods eine Namenssuche durchgeführt hat.

  7. Entfernen Sie von TerminalA aus die Sicherheitsgruppenregeln, die die DNS-Kommunikation mit der Cluster-Sicherheitsgruppe ermöglichen, aus Ihrer Sicherheitsgruppe. Wenn Sie die DNS-Regeln in einem der vorherigen Schritte nicht zur Cluster-Sicherheitsgruppe 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 der Pod nicht mehr auf die CoreDNS-Pods zugreifen kann, denen die Cluster-Sicherheitsgruppe zugeordnet ist. Die Cluster-Sicherheitsgruppe verfügt nicht mehr über die Sicherheitsgruppenregeln, die eine DNS-Kommunikation von der Sicherheitsgruppe, die Ihrem Pod zugeordnet ist, erlauben.

    Wenn Sie versuchen, über die IP-Adressen auf die Anwendung zuzugreifen, die für einen der Pods in einem vorherigen Schritt zurückgegeben wurden, erhalten Sie dennoch eine Antwort, da zwischen Pods, denen die Sicherheitsgruppe zugeordnet ist, alle Ports erlaubt sind, und eine Namenssuche daher nicht erforderlich ist.

  9. Wenn Sie mit dem Experimentieren fertig sind, können Sie die von Ihnen erstellte Sicherheitsgruppen-Richtlinie, Anwendung und Sicherheitsgruppe 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