Konfigurieren des Amazon-VPC-CNI-Plug-Ins zur Verwendung von IAM-Rollen für Servicekonten - Amazon EKS

Konfigurieren des Amazon-VPC-CNI-Plug-Ins zur Verwendung von IAM-Rollen für Servicekonten

Das Amazon VPC CNI-Plug-in für Kubernetes ist das Netzwerk-Plug-In für Pod-Netzwerke in Amazon-EKS-Clustern. Das Plug-in 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 IAM-Berechtigungen, die von der AWS-verwalteten RichtlinieAmazonEKS_CNI_Policy bereitgestellt werden, um AWS-APIs in Ihrem Namen aufzurufen.

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

Anmerkung

Unabhängig davon, ob Sie das VPC-CNI-Plug-in für die Verwendung von IAM-Rollen für Dienstkonten konfigurieren, haben die Pods auch Zugriff auf die dem Amazon-EKS-Knoten-IAM-Rolle zugewiesenen Berechtigungen, es sei denn, Sie blockieren den Zugriff auf IMDS. Weitere Informationen finden Sie unter Einschränken des Zugriffs auf die Anmeldeinformationen des IMDS- und Amazon EC2-Instance-Profils.

Sie können eksctl oder AWS Management Console verwenden, um Ihre CNI-Plugin-IAM-Rolle zu erstellen.

eksctl
  1. Erstellen Sie eine IAM-Rolle und fügen Sie die AmazonEKS_CNI_Policy-verwaltete IAM-Richtlinie mit dem folgenden Befehl an. Ersetzen Sie die <cluster_name> (einschließlich <>) durch Ihren eigenen Wert. Dieser Befehl erstellt einen IAM-OIDC-Anbieter für Ihren Cluster, falls dieser noch nicht vorhanden ist. Anschließend wird ein AWS CloudFormation-Stack bereitgestellt, der eine IAM-Rolle erstellt, die verwaltete AmazonEKS_CNI_Policy AWS-Richtlinie daran anfügt und das vorhandene aws-node-Servicekonto mit dem ARN der IAM-Rolle annotiert.

    eksctl create iamserviceaccount \ --name aws-node \ --namespace kube-system \ --cluster <cluster_name> \ --attach-policy-arn arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy \ --approve \ --override-existing-serviceaccounts
  2. Beschreiben Sie einen der Pods und überprüfen Sie, ob die Umgebungsvariablen AWS_WEB_IDENTITY_TOKEN_FILE und AWS_ROLE_ARN vorhanden sind.

    kubectl exec -n kube-system aws-node-<9rgzw> -c aws-node -- env | grep AWS

    Ausgabe:

    ... AWS_WEB_IDENTITY_TOKEN_FILE=/var/run/secrets/eks.amazonaws.com/serviceaccount/token ... AWS_ROLE_ARN=arn:arn:aws::<111122223333>:role/eksctl-prod-addon-iamserviceaccount-kube-sys-Role1-<V66K5I6JLDGK> ...
AWS Management Console

Prerequisite

Sie müssen einen vorhandenen IAM-OIDC-Anbieter für Ihren Cluster haben. Um zu bestimmen, ob Sie bereits einen solchen erstellen oder erstellen möchten, lesen Sie Erstellen Sie einen IAM-OIDC-Anbieter für Ihren Cluster.

Erstellen einer CNI-Plugin-IAM-Rolle mit der AWS Management Console

  1. Wählen Sie im Navigations-Panel Rollen und Rolle erstellen aus.

  2. Wählen Sie im Abschnitt Select type of trusted entity (Typ der vertrauenswürdigen Entität auswählen) die Option Web identity (Web-Identität) aus.

  3. Im Abschnitt Choose a web identity provider (Webidentitätsanbieter auswählen):

    1. Wählen Sie für Identity provider (Identitätsanbieter) die URL für Ihren Cluster aus.

    2. Wählen Sie für Audience (Zielgruppe) sts.amazonaws.com.

  4. Wählen Sie Next: Permissions aus.

  5. Wählen Sie im Abschnitt Richtlinie anfügen die AmazonEKS_CNI_Policy-Richtlinie aus, die für Ihr Servicekonto verwendet werden soll.

  6. Wählen Sie Next: Tags (Weiter: Tags (Markierungen)) aus.

  7. Auf dem Bildschirm Add tags (optional) (Tags hinzufügen (optional)) können Sie Tags für das Konto hinzufügen. Klicken Sie auf Next: Review (Weiter: Prüfen).

  8. Geben Sie für Rollenname einen Namen für Ihre Rolle ein, z. B. AmazonEKSCNIRole, und wählen Sie dann Rolle erstellen aus.

  9. Nachdem die Rolle erstellt wurde, wählen Sie die Rolle in der Konsole aus, um sie zur Bearbeitung zu öffnen.

  10. Klicken Sie auf der Registerkarte Trust Relationships (Vertrauensbeziehungen) auf Edit Trust Relationship (Vertrauensbeziehungen bearbeiten).

  11. Suchen Sie die Zeile, die wie folgt aussieht:

    "oidc.eks.us-west-2.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E:aud": "sts.amazonaws.com"

    Ändern Sie die Zeile so, dass sie wie die folgende Zeile aussieht. Ersetzen Sie <EXAMPLED539D4633E53DE1B716D3041E> (einschließlich <>) durch die OIDC-Anbieter-ID Ihres Clusters und ersetzen Sie <region-code> durch den Regionscode, in dem sich Ihr Cluster befindet.

    "oidc.eks.<region-code>.amazonaws.com/id/<EXAMPLED539D4633E53DE1B716D3041E>:sub": "system:serviceaccount:kube-system:aws-node"
  12. Wählen Sie Update Trust Policy (Vetrauensrichtlinie aktualisieren) aus, um den Vorgang abzuschließen.

So kommentieren Sie das aws-node-Kubernetes-Dienstkonto mit der IAM-Rolle

  1. Wenn Sie das Amazon EKS-Add-On mit einem Amazon EKS-Cluster der Version 1.18 oder höher verwenden, lesen Sie Aktualisieren des Amazon-VPC-CNI-Amazon-EKS-Add-ons, anstatt dieses Verfahren abzuschließen. Wenn Sie das Amazon VPC CNI Amazon-EKS-Add-on nicht verwenden, verwenden Sie den folgenden Befehl, um das aws-node-Servicekonto mit dem ARN der IAM-Rolle zu versehen, die Sie zuvor erstellt haben. Stellen Sie sicher, dass Sie Ihre eigenen Werte durch das <example values> ersetzen, um es mit Ihren Pods zu verwenden.

    kubectl annotate serviceaccount \ -n kube-system aws-node \ eks.amazonaws.com/role-arn=arn:aws:iam::<AWS_ACCOUNT_ID>:role/<AmazonEKSCNIRole>
  2. Löschen Sie alle vorhandenen Pods, die dem Servicekonto zugeordnet sind, und erstellen Sie sie neu, um die Umgebungsvariablen für Anmeldeinformationen anzuwenden. Der mutierende Webhook wendet sie nicht auf Pods an, die bereits ausgeführt werden. 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
  3. Bestätigen Sie, dass alle Pods neu gestartet wurden.

    kubectl get pods -n kube-system -l k8s-app=aws-node
  4. Beschreiben Sie einen der Pods und überprüfen Sie, ob die Umgebungsvariablen AWS_WEB_IDENTITY_TOKEN_FILE und AWS_ROLE_ARN vorhanden sind.

    kubectl exec -n kube-system aws-node-<9rgzw> -c aws-node -- env | grep AWS

    Ausgabe:

    ... AWS_WEB_IDENTITY_TOKEN_FILE=/var/run/secrets/eks.amazonaws.com/serviceaccount/token ... AWS_ROLE_ARN=arn:arn:aws::<111122223333>:role/eksctl-prod-addon-iamserviceaccount-kube-sys-Role1-<V66K5I6JLDGK> ...

Entfernen Sie die CNI-Richtlinie aus der Knoten-IAM-Rolle

Wenn Ihrem Amazon-EKS-Knoten-IAM-Rolle derzeit die AmazonEKS_CNI_Policy-IAM-Richtlinie zugeordnet ist und Sie eine separate IAM-Rolle erstellt, ihr stattdessen die Richtlinie zugeordnet und sie dem Kubernetes-Dienstkonto aws-node zugewiesen haben, empfehlen wir Ihnen, die Richtlinie aus Ihrem zu entfernen Knotenrolle.

  1. Öffnen Sie die IAM-Konsole unter https://console.aws.amazon.com/iam/.

  2. Wählen Sie im linken Navigationsbereich Roles (Rollen) aus und suchen Sie dann nach Ihrer Knoten-Instance-Rolle.

  3. Wählen Sie die Registerkarte Permissions (Berechtigungen) für Ihre Knoten-Instance-Rolle und dann das X rechts neben der AmazonEKS_CNI_Policy aus.

  4. Wählen Sie Detach (Trennen) aus, um den Vorgang abzuschließen.