Sicherheitsgruppen für Pods - Amazon EKS

Sicherheitsgruppen für Pods

Sicherheitsgruppen für Pods integrieren Amazon-EC2-Sicherheitsgruppen in Kubernetes-Pods. 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.

Considerations

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

  • Ihr Amazon-EKS-Cluster muss Kubernetes-Version 1.17 und Amazon-EKS-Plattformversion eks.3 oder höher ausführen. Sie können keine Sicherheitsgruppen für Pods in Kubernetes-Clustern verwenden, die Sie in Amazon EC2 bereitgestellt haben.

  • Der Datenverkehr zu und von Pods mit zugehörigen Sicherheitsgruppen unterliegt nicht der Durchsetzung von Calico-Netzwerkrichtlinien und ist nur auf die Durchsetzung der Amazon-EC2-Sicherheitsgruppen beschränkt. Die Community bemüht sich, diese Einschränkung aufzuheben.

  • Sie können Sicherheitsgruppen nur für Pods mit Pods verwenden, die auf AWS-Fargate ausgeführt werden, wenn Ihr Cluster 1.18 oder höher ist.

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

  • Sicherheitsgruppen für Pods werden von den meisten Nitro-basierten Amazon-EC2-Instance-Familien unterstützt, einschließlich der m5-, c5-, r5-, p3-, m6g-, c6g-, und r6g-Instance-Familien. Die t3-Instance-Familie wird nicht unterstützt. Eine vollständige Liste der unterstützten Instanzen finden Sie unter Von Amazon EC2 unterstützte Instances und Zweigstellennetzwerkschnittstellen. Ihre Knoten müssen einer der unterstützten Instance-Typen sein.

  • Quell-NAT ist für ausgehenden Datenverkehr von Pods mit zugewiesenen Sicherheitsgruppen deaktiviert, damit ausgehende Sicherheitsgruppenregeln angewendet werden. 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, welche in öffentlichen Subnetzen bereitgestellt werden, können nicht auf das Internet zugreifen.

  • Kubernetes-Dienste vom Typ NodePort und LoadBalancer, die Instance-Ziele mit einem externalTrafficPolicy auf Local verwenden, werden nicht mit Pods unterstützt, denen Sie Sicherheitsgruppen zuweisen. Weitere Informationen zur Verwendung eines Lastenverteilungen mit Instance-Zielen finden Sie unter Netzwerklastenausgleich auf Amazon EKS.

  • Wenn Sie auch Pod-Sicherheitsrichtlinien verwenden, um den Zugriff auf die Pod-Mutation einzuschränken, müssen die Kubernetes-Dienstkonten eks-vpc-resource-controller und vpc-resource-controller in Kubernetes ClusterRoleBinding für das Role angegeben werden, dem Ihr psp zugewiesen ist. Wenn Sie die standardmäßigen Amazon-EKS-psp, -Role, und -ClusterRoleBinding verwenden, ist dies die eks:podsecuritypolicy:authenticated ClusterRoleBinding. Sie würden beispielsweise die Dienstkonten zum Abschnitt subjects: hinzufügen, wie im folgenden Beispiel gezeigt:

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

  • Pods, die Sicherheitsgruppen verwenden, müssen terminationGracePeriodSeconds in ihrer Pod-Spezifikation enthalten. Dies liegt daran, dass das Amazon-EKS-VPC-CNI-Plugin den API-Server abfragt, um die Pod-IP-Adresse abzurufen, bevor das Pod-Netzwerk auf dem Host gelöscht wird. Ohne diese Einstellung entfernt das Plug-In das Pod-Netzwerk auf dem Host nicht.

Sicherheitsgruppen für Pods bereitstellen

Bereitstellen von Sicherheitsgruppen für Pods

  1. Wenn Sie Sicherheitsgruppen nur für Fargate-Pods verwenden und keine Amazon-EC2-Knoten in Ihrem Cluster haben, fahren Sie mit Schritt 4 fort. Überprüfen Sie Ihre aktuelle CNI-Plugin-Version mit dem folgenden Befehl.

    kubectl describe daemonset aws-node --namespace kube-system | grep Image | cut -d "/" -f 2

    Die Ausgabe ähnelt der folgenden Ausgabe.

    amazon-k8s-cni:<1.7.7>

    Wenn Ihre CNI-Plug-In-Version älter als 1.7.7 ist, aktualisieren Sie Ihr CNI-Plug-In auf Version 1.7.7 oder höher. Weitere Informationen finden Sie unter Aktualisieren des Amazon-VPC-CNI-Amazon-EKS-Add-ons.

  2. Fügen Sie die verwaltete AmazonEKSVPCResourceController-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 Instances zu verwalten. Der folgende Befehl fügt die Richtlinie einer Cluster-Rolle namens <eksClusterRole> hinzu.

    aws iam attach-role-policy \ --policy-arn arn:aws:iam::aws:policy/AmazonEKSVPCResourceController \ --role-name <eksClusterRole>
  3. Aktivieren Sie das CNI-Plugin, um Netzwerkschnittstellen für Pods zu verwalten, indem Sie die ENABLE_POD_ENI-Variable im true-DaemonSet auf aws-node setzen. Sobald diese Einstellung auf true gesetzt ist, fügt das Plugin für jeden Knoten im Cluster eine Markierung mit dem Wert vpc.amazonaws.com/has-trunk-attached=true hinzu. 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 Schnittstellen, die von jedem Instance-Typ unterstützt werden, finden Sie unter IP-Adressen pro Netzwerkschnittstelle pro Instance-Typ im Amazon-EC2-Benutzerhandbuch für Linux-Instances. 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 sehen, bei welchen Ihrer Knoten aws-k8s-trunk-eni auf true gesetzt ist.

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

    Nachdem die Trunk-Netzwerkschnittstelle erstellt wurde, können Pods sekundäre IP-Adressen von der Trunk- oder Standardnetzwerkschnittstelle zugewiesen werden. 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 Bereitschafts-Erkennung 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"}]}}}}'
  4. Erstellen Sie einen Namespace zum Bereitstellen von Ressourcen.

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

    1. Speichern Sie die folgende Beispielsicherheitsrichtlinie in einer Datei namens my-security-group-policy.yaml. 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. Ein leeres serviceAccountSelector wählt alle Servicekonten im Namespace aus. Sie müssen 1-5 Sicherheitsgruppen-IDs für groupIds angeben. Falls Sie mehr als eine ID angeben, gilt die Kombination aller Regeln in allen Sicherheitsgruppen für die ausgewählten Pods.

      apiVersion: vpcresources.k8s.aws/v1beta1 kind: SecurityGroupPolicy metadata: name: <my-security-group-policy> namespace: <my-namespace> spec: podSelector: matchLabels: role: <my-role> securityGroups: groupIds: - <sg-abc123>
      Wichtig
      • Die Sicherheitsgruppen, welche Sie in der Richtlinie angeben, 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-abc123>' does not exist.

      • Die Sicherheitsgruppe muss eingehende Kommunikation von der Cluster-Sicherheitsgruppe (für kubelet) über alle Ports zulassen, für die Sie Probes konfiguriert haben.

      • Die Sicherheitsgruppe muss ausgehende Kommunikation mit einer Sicherheitsgruppe zulassen, die eingehenden TCP- und UDP-Port 53 (für CoreDNS-Pods) von ihr zulässt.

      • Wenn Sie die Sicherheitsgruppen-Richtlinie mit Fargate verwenden, stellen Sie sicher, dass Ihre Sicherheitsgruppe über Regeln verfügt, 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.

    2. Die Richtlinie bereitstellen.

      kubectl apply -f my-security-group-policy.yaml
  6. Stellen Sie eine Beispielanwendung mit einem Label bereit, das dem <my-role>-Wert für <podSelector> entspricht, den Sie im vorherigen Schritt angegeben haben.

    1. Speichern Sie den folgenden Inhalt in einer Datei.

      apiVersion: apps/v1 kind: Deployment metadata: name: <my-deployment> namespace: <my-namespace> labels: app: <my-app> spec: replicas: <1> selector: matchLabels: app: <my-app> template: metadata: labels: app: <my-app> role: <my-role> spec: containers: - name: <my-container> image: <my-image> ports: - containerPort: <80>
    2. Stellen Sie die Anwendung mit dem folgenden Befehl bereit. Wenn Sie die Anwendung bereitstellen, entspricht das CNI-Plug-in der role-Markierung und die Sicherheitsgruppen, die Sie im vorherigen Schritt angegeben haben, werden auf den Pod angewendet.

      kubectl apply -f my-security-group-policy.yaml
      Anmerkung
      • Wenn Ihr Pod im Waiting-Zustand hängen bleibt und Sie Insufficient permissions: Unable to create Elastic Network Interface. sehen, wenn Sie den Pod beschreiben, bestätigen Sie, dass Sie die IAM-Richtlinie in einem vorherigen Schritt zur IAM-Cluster-Rolle hinzugefügt haben.

      • Wenn Ihr Pod im Status Pending fest steckt, überprüfen Sie, ob Ihr Knoten-Instance-Typ in Von Amazon EC2 unterstützte Instances und Zweigstellennetzwerkschnittstellen aufgeführt ist und dass die maximale Anzahl der vom Instance-Typ unterstützten Zweigstellennetzwerkschnittstellen nicht mit der Anzahl der Knoten in Ihrer Knotengruppe multipliziert wurde getroffen. 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 CNI-Plug-In versucht, das Host-Netzwerk einzurichten, und dies fehlschlägt, während die Netzwerkschnittstelle erstellt wird. Das CNI-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-59f5f68b58-c89wx>": networkPlugin cni failed to set up pod "<my-deployment-59f5f68b58-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, die Pods für Sicherheitsgruppen verwenden, löscht der Controller die Zweigstellennetzwerkschnittstellen nicht, sodass Sie sie selbst löschen müssen.

Von Amazon EC2 unterstützte Instances und Zweigstellennetzwerkschnittstellen

In der folgenden Tabelle ist die Anzahl der Zweigstellennetzwerkschnittstellen aufgeführt, die Sie mit jedem unterstützten Amazon-EC2-Instance-Typ verwenden können.

Instance-Typ Zweigstellennetzwerkschnittstellen
a1.medium 10
a1.large 9
a1.xlarge 18
a1.2xlarge 38
a1.4xlarge 54
a1.metal 54
c5.large 9
c5.xlarge 18
c5.2xlarge 38
c5.4xlarge 54
c5.9xlarge 54
c5.12xlarge 54
c5.18xlarge 107
c5.24xlarge 107
c5.metal 107
c5a.large 9
c5a.xlarge 18
c5a.2xlarge 38
c5a.4xlarge 54
c5a.8xlarge 54
c5a.12xlarge 54
c5a.16xlarge 107
c5a.24xlarge 107
c5d.large 9
c5d.xlarge 18
c5d.2xlarge 38
c5d.4xlarge 54
c5d.9xlarge 54
c5d.12xlarge 54
c5d.18xlarge 107
c5d.24xlarge 107
c5d.metal 107
c5n.large 9
c5n.xlarge 18
c5n.2xlarge 38
c5n.4xlarge 54
c5n.9xlarge 54
c5n.18xlarge 107
c5n.metal 107
c6g.medium 4
c6g.large 9
c6g.xlarge 18
c6g.2xlarge 38
c6g.4xlarge 54
c6g.8xlarge 54
c6g.12xlarge 54
c6g.16xlarge 107
c6g.metal 107
g4dn.xlarge 39
g4dn.2xlarge 39
g4dn.4xlarge 59
g4dn.8xlarge 58
g4dn.12xlarge 54
g4dn.16xlarge 118
g4dn.metal 107
i3en.large 5
i3en.xlarge 12
i3en.2xlarge 28
i3en.3xlarge 38
i3en.6xlarge 54
i3en.12xlarge 114
i3en.24xlarge 107
i3en.metal 107
inf1.xlarge 38
inf1.2xlarge 38
inf1.6xlarge 54
inf1.24xlarge 107
m5.large 9
m5.xlarge 18
m5.2xlarge 38
m5.4xlarge 54
m5.8xlarge 54
m5.12xlarge 54
m5.16xlarge 107
m5.24xlarge 107
m5.metal 107
m5a.large 9
m5a.xlarge 18
m5a.2xlarge 38
m5a.4xlarge 54
m5a.8xlarge 54
m5a.12xlarge 54
m5a.16xlarge 107
m5a.24xlarge 107
m5ad.large 9
m5ad.xlarge 18
m5ad.2xlarge 38
m5ad.4xlarge 54
m5ad.8xlarge 54
m5ad.12xlarge 54
m5ad.16xlarge 107
m5ad.24xlarge 107
m5d.large 9
m5d.xlarge 18
m5d.2xlarge 38
m5d.4xlarge 54
m5d.8xlarge 54
m5d.12xlarge 54
m5d.16xlarge 107
m5d.24xlarge 107
m5d.metal 107
m5dn.large 9
m5dn.xlarge 18
m5dn.2xlarge 38
m5dn.4xlarge 54
m5dn.8xlarge 54
m5dn.12xlarge 54
m5dn.16xlarge 107
m5dn.24xlarge 107
m5n.large 9
m5n.xlarge 18
m5n.2xlarge 38
m5n.4xlarge 54
m5n.8xlarge 54
m5n.12xlarge 54
m5n.16xlarge 107
m5n.24xlarge 107
m6g.medium 4
m6g.large 9
m6g.xlarge 18
m6g.2xlarge 38
m6g.4xlarge 54
m6g.8xlarge 54
m6g.12xlarge 54
m6g.16xlarge 107
m6g.metal 107
p3.2xlarge 38
p3.8xlarge 54
p3.16xlarge 114
p3dn.24xlarge 107
r5.large 9
r5.xlarge 18
r5.2xlarge 38
r5.4xlarge 54
r5.8xlarge 54
r5.12xlarge 54
r5.16xlarge 107
r5.24xlarge 107
r5.metal 107
r5a.large 9
r5a.xlarge 18
r5a.2xlarge 38
r5a.4xlarge 54
r5a.8xlarge 54
r5a.12xlarge 54
r5a.16xlarge 107
r5a.24xlarge 107
r5ad.large 9
r5ad.xlarge 18
r5ad.2xlarge 38
r5ad.4xlarge 54
r5ad.8xlarge 54
r5ad.12xlarge 54
r5ad.16xlarge 107
r5ad.24xlarge 107
r5d.large 9
r5d.xlarge 18
r5d.2xlarge 38
r5d.4xlarge 54
r5d.8xlarge 54
r5d.12xlarge 54
r5d.16xlarge 107
r5d.24xlarge 107
r5d.metal 107
r5dn.large 9
r5dn.xlarge 18
r5dn.2xlarge 38
r5dn.4xlarge 54
r5dn.8xlarge 54
r5dn.12xlarge 54
r5dn.16xlarge 107
r5dn.24xlarge 107
r5n.large 9
r5n.xlarge 18
r5n.2xlarge 38
r5n.4xlarge 54
r5n.8xlarge 54
r5n.12xlarge 54
r5n.16xlarge 107
r5n.24xlarge 107
r6g.medium 4
r6g.large 9
r6g.xlarge 18
r6g.2xlarge 38
r6g.4xlarge 54
r6g.8xlarge 54
r6g.12xlarge 54
r6g.16xlarge 107
z1d.large 13
z1d.xlarge 28
z1d.2xlarge 58
z1d.3xlarge 54
z1d.6xlarge 54
z1d.12xlarge 107
z1d.metal 107