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 dieIPv6
-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
m6g
c6g
,,, undr6g
Instance unterstützt. Es werden keine Instance-Typen in dert
-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 KubernetesClusterRoleBinding
für dasrole
angegeben werden, dem Ihrpsp
zugewiesen ist. Bei Verwendung der standardmäßigen Amazon-EKS-Elementepsp
,role
undClusterRoleBinding
ist dieseks:podsecuritypolicy:authenticated
ClusterRoleBinding
. Fügen Sie beispielsweise den Benutzer zumsubjects:
-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 EinstellungterminationGracePeriodSeconds
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 Version1.11
mitPOD_SECURITY_GROUP_ENFORCING_MODE
=strict
, was die Standardeinstellung ist, dann werden Kubernetes-Services vom TypNodePort
undLoadBalancer
, die Instance-Ziele verwenden, für dieexternalTrafficPolicy
aufLocal
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 Version1.11
mitPOD_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 mitPOD_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 undPOD_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 EinstellungPOD_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.
-
Ü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 Version1.7.7
oder höher. Weitere Informationen finden Sie unter Arbeiten mit dem Amazon VPC CNI plugin for Kubernetes EKS Amazon-Add-on. -
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. -
Rufen Sie den Namen Ihrer Cluster-IAM-Rolle ab und speichern Sie ihn in einer Variablen. Ersetzen Sie
mit dem Namen Ihres Clusters.my-cluster
cluster_role=$(aws eks describe-cluster --name
my-cluster
--query cluster.roleArn --output text | cut -d / -f 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
-
-
Aktivieren Sie das Amazon-VPC-CNI-Add-on, um Netzwerkschnittstellen für Pods zu verwalten, indem Sie die
ENABLE_POD_ENI
-Variable imaws-node
DaemonSet auftrue
setzen. Wenn diese Einstellung auftrue
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 Beschreibungaws-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.
Mit dem folgenden Befehl können Sie ermitteln, welche Ihrer Knoten über eine benutzerdefinierte Ressource vom Typ
CNINode
verfügen. WennNo 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 benutzerdefiniertenCNINode
-Ressource Knotenbezeichnungen verwendet. Mit dem folgenden Befehl können Sie ermitteln, bei welchen Ihrer Knoten die Knotenbezeichnungaws-k8s-trunk-eni
auftrue
festgelegt ist. WennNo 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 undPOD_SECURITY_GROUP_ENFORCING_MODE
=standard
gilt, wie im nächsten Schritt beschrieben, müssen Sie den vorherigen Befehl nicht ausführen.-
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 TypNodePort
undLoadBalancer
haben, die Instance-Ziele mit einerexternalTrafficPolicy
aufLocal
verwenden, dann müssen Sie Version1.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
odernodeLocalDNS
, 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
-
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
-
Stellen Sie ein Amazon EKS
SecurityGroupPolicy
in Ihrem Cluster bereit.-
Kopieren Sie den folgenden Inhalt auf Ihr Gerät. Sie können
podSelector
durchserviceAccountSelector
ersetzen, wenn Sie Pods lieber basierend auf Servicekontomarkierungen auswählen möchten. Sie müssen den einen oder anderen Selektor angeben. Ein leerespodSelector
(Beispiel:podSelector: {}
) wählt alle Pods im Namespace aus. Sie könnenmy-role
in den Namen Ihrer Rolle ändern. Ein leeresserviceAccountSelector
wählt alle Servicekonten im Namespace aus. Sie könnenmy-security-group-policy
durch einen Namen für IhrSecurityGroupPolicy
undmy-namespace
durch den Namespace ersetzen, in dem Sie dasSecurityGroupPolicy
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
EOFWichtig
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
- undUDP
-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 eingehendenTCP
- undUDP
-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.
-
-
Die Richtlinie bereitstellen.
kubectl apply -f
my-security-group-policy.yaml
-
-
Stellen Sie eine Beispielanwendung mit einem Label bereit, die dem
-Wert fürmy-role
entspricht, den Sie in einem vorherigen Schritt angegeben haben.podSelector
-
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 Siemy-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 -
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
-
-
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 7m51s192.168.53.48
ip-192-168-33-28
.region-code
.compute.internal <none> <none> my-deployment-5df6f7687b
-j9fl4
1/1 Running 0 7m51s192.168.70.145
ip-192-168-92-33
.region-code
.compute.internal <none> <none> my-deployment-5df6f7687b
-rjxcz
1/1 Running 0 7m51s192.168.73.207
ip-192-168-92-33
.region-code
.compute.internal <none> <none> my-deployment-5df6f7687b
-zmb42
1/1 Running 0 7m51s192.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 Siekubectl describe pod
aus. Wenn Sie
-nmy-deployment-xxxxxxxxxx-xxxxx
my-namespace
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 inlimits.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 imPending
-Zustand, bis ein anderer Pod mit zugehörigen Sicherheitsgruppen gelöscht wird.
Wenn Sie
kubectl describe pod
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.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 containerDie 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. -
-
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
mit der ID eines der Pods, die Sie in der Ausgabe im vorherigen Schritt erhalten haben.5df6f7687b
-4fbjm
kubectl exec -it -n my-namespace my-deployment-
-- /bin/bash5df6f7687b
-4fbjm
-
Ü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.
-
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
mit der ID der Sicherheitsgruppe, in der Sie die Regeln erstellt haben.$my_cluster_security_group_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 -
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.
-
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