Konfigurieren des Amazon VPC CNI plugin for Kubernetes zur Verwendung von IAM-Rollen für Servicekonten - Amazon EKS

Konfigurieren des Amazon VPC CNI plugin for Kubernetes zur Verwendung von IAM-Rollen für Servicekonten

Das Amazon VPC CNI plugin for Kubernetes ist das Netzwerk-Plugin für Pod-Netzwerke in Amazon-EKS-Clustern. Das Plugin ist verantwortlich für die Zuweisung von VPC-IP-Adressen zu Kubernetes-Knoten und für das Konfigurieren der erforderlichen Netzwerke für Pods auf jedem Knoten. Das Plugin:

  • Erfordert AWS Identity and Access Management IAM-Berechtigungen. Die Berechtigungen werden in der von AmazonEKS_CNI_Policy AWS verwalteten Richtlinie angegeben, wenn Ihr Cluster die IPv4-Familie verwendet. Wenn Ihr Cluster die IPv6-Familie verwendet, müssen die Berechtigungen einer von Ihnen erstellten IAM-Richtlinie hinzugefügt werden. Sie können diese Richtlinie der Amazon-EKS-Knoten-IAM-Rolle oder einer separaten IAM-Rolle anfügen. Wir empfehlen Ihnen, sie einer separaten Rolle zuzuweisen, wie in diesem Thema beschrieben.

  • Erstellt ein Kubernetes-Servicekonto namens aws-node und ist so konfiguriert, dass es bei der Bereitstellung verwendet wird. Das Servicekonto ist an eine Kubernetes clusterrole namens aws-node gebunden, der die erforderlichen Kubernetes-Berechtigungen zugewiesen sind.

Anmerkung

Die Pods für das Amazon VPC CNI plugin for Kubernetes haben Zugriff auf die Berechtigungen, die der Amazon-EKS-Knoten-IAM-Rolle zugewiesen sind, es sei denn, Sie blockieren den Zugriff auf IMDS. Weitere Informationen finden Sie unter Beschränken Sie den Zugriff auf das Instance-Profil, das dem Worker-Knoten zugewiesen ist.

Voraussetzungen

Schritt 1: Erstellen Sie die IAM-Rolle für das Amazon VPC CNI plugin for Kubernetes

So erstellen Sie die IAM-Rolle
  1. Ermitteln Sie die IP-Familie Ihres Clusters.

    aws eks describe-cluster --name my-cluster | grep ipFamily

    Die Beispielausgabe lautet wie folgt.

    "ipFamily": "ipv4"

    Die Ausgabe kann stattdessen ipv6 zurückgeben.

  2. Erstellen Sie die IAM-Rolle. Sie können eksctl oder kubectl und die AWS CLI verwenden, um Ihre IAM-Rolle zu erstellen.

    eksctl

    Erstellen Sie eine IAM-Rolle und fügen Sie der Rolle die IAM-Richtlinie mit dem Befehl zu, der der IP-Familie Ihres Clusters entspricht. Der Befehl erstellt einen AWS CloudFormation-Stack und stellt ihn bereit, der eine IAM-Rolle erstellt, die von Ihnen angegebene Richtlinie daran anfügt und das vorhandene aws-node Kubernetes-Servicekonto mit dem ARN der erstellten IAM-Rolle annotiert.

    • IPv4

      Ersetzen Sie my-cluster durch Ihren eigenen Wert.

      eksctl create iamserviceaccount \ --name aws-node \ --namespace kube-system \ --cluster my-cluster \ --role-name "AmazonEKSVPCCNIRole" \ --attach-policy-arn arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy \ --override-existing-serviceaccounts \ --approve
    • IPv6

      Ersetzen Sie my-cluster durch Ihren eigenen Wert. Ersetzen Sie 111122223333 durch den Namen Ihres Clusters und AmazonEKS_CNI_IPv6_Policy durch Ihre IPv6-Richtlinie. Wenn Sie noch keine IPv6-Richtlinie haben, lesen Sie Erstellen Sie eine IAM-Richtlinie für Cluster, die die IPv6-Familie verwendet, um eine zu erstellen. Um IPv6 mit Ihrem Cluster zu verwenden, muss dieser mehrere Anforderungen erfüllen. Weitere Informationen finden Sie unter Tutorial: Zuweisen von IPv6-Adressen zu Pods und services.

      eksctl create iamserviceaccount \ --name aws-node \ --namespace kube-system \ --cluster my-cluster \ --role-name "AmazonEKSVPCCNIRole" \ --attach-policy-arn arn:aws:iam::111122223333:policy/AmazonEKS_CNI_IPv6_Policy \ --override-existing-serviceaccounts \ --approve
    kubectl and the AWS CLI
    1. Zeigen Sie die OIDC-Anbieter-URL Ihres Clusters an.

      aws eks describe-cluster --name my-cluster --query "cluster.identity.oidc.issuer" --output text

      Die Beispielausgabe lautet wie folgt.

      https://oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE

      Wenn keine Ausgabe erfolgt, müssen Sie einen IAM-OIDC-Anbieter für Ihr Cluster erstellen.

    2. Kopieren Sie den folgenden Inhalt in eine Datei namens vpc-cni-trust-policy.json. Ersetzen Sie 111122223333 durch die ID Ihres Kontos und EXAMPLED539D4633E53DE1B71EXAMPLE durch den Wert, der im vorherigen Schritt zurückgegeben wurde. Ersetzen Sie region-code durch die AWS-Region, in der sich Ihr Cluster befindet.

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com", "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:kube-system:aws-node" } } } ] }
    3. Erstellen Sie die -Rolle. Sie können AmazonEKSVPCCNIRole mit einem beliebigen Namen ersetzen, den Sie wählen.

      aws iam create-role \ --role-name AmazonEKSVPCCNIRole \ --assume-role-policy-document file://"vpc-cni-trust-policy.json"
    4. Fügen Sie der Rolle die erforderliche IAM-Richtlinie an. Führen Sie den Befehl aus, der der IP-Familie Ihres Clusters entspricht.

      • IPv4

        aws iam attach-role-policy \ --policy-arn arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy \ --role-name AmazonEKSVPCCNIRole
      • IPv6

        Ersetzen Sie 111122223333 durch den Namen Ihres Clusters und AmazonEKS_CNI_IPv6_Policy durch Ihre IPv6-Richtlinie. Wenn Sie noch keine IPv6-Richtlinie haben, lesen Sie Erstellen Sie eine IAM-Richtlinie für Cluster, die die IPv6-Familie verwendet, um eine zu erstellen. Um IPv6 mit Ihrem Cluster zu verwenden, muss dieser mehrere Anforderungen erfüllen. Weitere Informationen finden Sie unter Tutorial: Zuweisen von IPv6-Adressen zu Pods und services.

        aws iam attach-role-policy \ --policy-arn arn:aws:iam::111122223333:policy/AmazonEKS_CNI_IPv6_Policy \ --role-name AmazonEKSVPCCNIRole
    5. Führen Sie den folgenden Befehl aus und fügen Sie dem aws-node-Servicekonto den ARN der IAM-Rolle hinzu, die Sie zuvor erstellt haben. Ersetzen Sie example values durch Ihre eigenen Werte.

      kubectl annotate serviceaccount \ -n kube-system aws-node \ eks.amazonaws.com/role-arn=arn:aws:iam::111122223333:role/AmazonEKSVPCCNIRole
  3. (Optional) Konfigurieren Sie den von Ihrem Kubernetes-Servicekonto verwendeten AWS Security Token Service-Endpunkttyp. Weitere Informationen finden Sie unter Konfigurieren des AWS Security Token Service-Endpunkts für ein Servicekonto.

Schritt 2: Stellen Sie Amazon VPC CNI plugin for KubernetesPods erneut bereit

  1. Löschen Sie alle vorhandenen Pods, die dem Servicekonto zugeordnet sind, und erstellen Sie sie neu, um die Umgebungsvariablen für Anmeldeinformationen anzuwenden. Die Anmerkung wird nicht auf Pods angewendet, die derzeit ohne die Anmerkung laufen. Mit dem folgenden Befehl werden die vorhandenen aws-node DaemonSet Pods gelöscht und mit der Servicekonto-Anmerkung bereitgestellt.

    kubectl delete Pods -n kube-system -l k8s-app=aws-node
  2. Bestätigen Sie, dass alle Pods neu gestartet wurden.

    kubectl get pods -n kube-system -l k8s-app=aws-node
  3. Beschreiben Sie einen der Pods und überprüfen Sie, ob die Umgebungsvariablen AWS_WEB_IDENTITY_TOKEN_FILE und AWS_ROLE_ARN vorhanden sind. Ersetzen Sie cpjw7 mit dem Namen eines Ihrer Pods, der in der Ausgabe des vorherigen Schritts zurückgegeben wurde.

    kubectl describe pod -n kube-system aws-node-cpjw7 | grep 'AWS_ROLE_ARN:\|AWS_WEB_IDENTITY_TOKEN_FILE:'

    Die Beispielausgabe lautet wie folgt.

    AWS_ROLE_ARN: arn:aws:iam::111122223333:role/AmazonEKSVPCCNIRole AWS_WEB_IDENTITY_TOKEN_FILE: /var/run/secrets/eks.amazonaws.com/serviceaccount/token AWS_ROLE_ARN: arn:aws:iam::111122223333:role/AmazonEKSVPCCNIRole AWS_WEB_IDENTITY_TOKEN_FILE: /var/run/secrets/eks.amazonaws.com/serviceaccount/token

    Zwei Sätze doppelter Ergebnisse werden zurückgegeben, da der Pod zwei Container enthält. Beide Container haben die gleichen Werte.

    Wenn Ihr Pod den AWS-Region-Endpunkt verwendet, dann wird in der vorherigen Ausgabe auch die folgende Zeile zurückgegeben.

    AWS_STS_REGIONAL_ENDPOINTS=regional

Schritt 3: Entfernen Sie die CNI-Richtlinie aus der Knoten-IAM-Rolle

Wenn Ihrem Amazon-EKS-Knoten-IAM-Rolle derzeit die AmazonEKS_CNI_Policy-IAM-Richtlinie (IPv4) oder eine IPv6-Richtlinie zugeordnet ist und Sie eine separate IAM-Rolle erstellt, ihr stattdessen die Richtlinie zugeordnet und sie dem aws-node-Kubernetes-Servicekonto zugewiesen haben, empfehlen wir Ihnen, die Richtlinie mit Befehl AWS CLI, der mit der IP-Familie Ihres Clusters übereinstimmt, aus Ihrer Knotenrolle zu entfernen. Ersetzen Sie AmazonEKSNodeRole durch den Namen Ihrer Knotenrolle.

  • IPv4

    aws iam detach-role-policy --role-name AmazonEKSNodeRole --policy-arn arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy
  • IPv6

    Ersetzen Sie 111122223333 durch den Namen Ihres Clusters und AmazonEKS_CNI_IPv6_Policy durch Ihre IPv6-Richtlinie.

    aws iam detach-role-policy --role-name AmazonEKSNodeRole --policy-arn arn:aws:iam::111122223333:policy/AmazonEKS_CNI_IPv6_Policy

Erstellen Sie eine IAM-Richtlinie für Cluster, die die IPv6-Familie verwendet

Wenn Sie einen Cluster mit Version 1.21 oder höher erstellt haben, der die IPv6-Familie verwendet, und der Cluster Version 1.10.1 oder höher des Amazon VPC CNI plugin for Kubernetes-Add-ons konfiguriert hat, müssen Sie eine IAM-Richtlinie erstellen, die Sie einer IAM-Rolle zuweisen können. Wenn Sie einen vorhandenen Cluster mit 1.21 oder höher haben, den Sie bei der Erstellung nicht mit der IPv6-Familie konfiguriert haben, müssen Sie zur Verwendung von IPv6 einen neuen Cluster erstellen. Weitere Informationen zur Verwendung von IPv6 mit Ihrem Cluster finden Sie unter Tutorial: Zuweisen von IPv6-Adressen zu Pods und services.

  1. Kopieren Sie den folgenden Text und speichern Sie ihn in einer Datei mit dem Namen vpc-cni-ipv6-policy.json.

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:AssignIpv6Addresses", "ec2:DescribeInstances", "ec2:DescribeTags", "ec2:DescribeNetworkInterfaces", "ec2:DescribeInstanceTypes" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "ec2:CreateTags" ], "Resource": [ "arn:aws:ec2:*:*:network-interface/*" ] } ] }
  2. Erstellen Sie die IAM-Richtlinie.

    aws iam create-policy --policy-name AmazonEKS_CNI_IPv6_Policy --policy-document file://vpc-cni-ipv6-policy.json