Konfigurieren Sie ein Kubernetes Dienstkonto für die Übernahme einer IAM-Rolle - Amazon EKS

Helfen Sie 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.

Konfigurieren Sie ein Kubernetes Dienstkonto für die Übernahme einer IAM-Rolle

In diesem Thema wird beschrieben, wie Sie ein Kubernetes Dienstkonto so konfigurieren, dass es eine AWS Identity and Access Management (IAM-) Rolle annimmt. Alle Pods, die für die Verwendung des Servicekontos konfiguriert sind, können dann auf alle AWS-Service zugreifen, für die die Rolle Zugriffsberechtigungen hat.

Voraussetzungen
  • Einen vorhandenen -Cluster. Wenn Sie keine haben, können Sie eine mit einem der Erste Schritte mit Amazon EKS-Leitfäden erstellen.

  • Ein vorhandener IAM OpenID Connect (OIDC)-Anbieter für Ihren Cluster. Informationen zum Feststellen, ob Sie bereits einen haben oder wie Sie einen erstellen können, finden Sie unter Erstellen Sie einen OIDC IAM-Anbieter für Ihren Cluster.

  • Version 2.12.3 oder höher oder Version 1.27.160 oder höher von AWS Command Line Interface (AWS CLI), die auf Ihrem Gerät installiert und konfiguriert ist, oder AWS CloudShell. Um Ihre aktuelle Version zu überprüfen, verwenden Sie aws --version | cut -d / -f2 | cut -d ' ' -f1. Paket-Manager wie yum, apt-get oder Homebrew für macOS sind oft mehrere Versionen hinter der neuesten Version von AWS CLI. Informationen zur Installation der neuesten Version von finden Sie unter Installation, Aktualisierung und Deinstallation der AWS CLI und Schnellkonfiguration mit aws configure im AWS Command Line Interface -Benutzerhandbuch. Die AWS CLI Version, in der installiert ist, AWS CloudShell kann auch mehrere Versionen hinter der neuesten Version liegen. Informationen zur Aktualisierung finden Sie unter Installation AWS CLI in Ihrem Home-Verzeichnis im AWS CloudShell Benutzerhandbuch.

  • Das kubectl-Befehlszeilen-Tool ist auf Ihrem Gerät oder in der AWS CloudShell installiert. Die Version kann der Kubernetes-Version Ihres Clusters entsprechen oder eine Nebenversion älter oder neuer sein. Wenn Ihre Clusterversion beispielsweise 1.29 ist, können Sie kubectl-Version 1.28, 1.29, oder 1.30 damit verwenden. Informationen zum Installieren oder Aktualisieren von kubectl finden Sie unter Installieren oder Aktualisieren von kubectl.

  • Eine vorhandene kubectl config-Datei, die Ihre Clusterkonfiguration enthält. Informationen zum Erstellen einer kubectl config-Datei finden Sie unter Erstellen oder Aktualisieren einer kubeconfig-Datei für einen Amazon-EKS-Cluster.

Verknüpfen Sie eine IAM-Rolle mit einem Kubernetes-Servicekonto wie folgt
  1. Wenn Sie Ihrer IAM-Rolle eine vorhandene IAM-Richtlinie zuordnen möchten, fahren Sie mit dem nächsten Schritt fort.

    Erstellen Sie eine IAM-Richtlinie. Sie können Ihre eigene Richtlinie erstellen oder eine AWS verwaltete Richtlinie kopieren, die bereits einige der benötigten Berechtigungen gewährt, und sie an Ihre spezifischen Anforderungen anpassen. Weitere Informationen finden Sie unter Erstellen von IAM-Richtlinien im IAM-Benutzerhandbuch.

    1. Erstellen Sie eine Datei, die die Berechtigungen für AWS-Services die Personen enthält, auf die Sie zugreifen Pods möchten. Eine Liste aller Aktionen für alle AWS-Services finden Sie in der Service Authorization Reference.

      Sie können den folgenden Befehl ausführen, um eine Beispiel-Richtliniendatei zu erstellen, die schreibgeschützten Zugriff auf einen Amazon-S3-Bucket gewährt. Sie können optional Konfigurationsinformationen oder ein Bootstrap-Skript in diesem Bucket speichern und die Container in Ihrem Pod können die Datei aus dem Bucket lesen und in Ihre Anwendung laden. Wenn Sie diese Beispielrichtlinie erstellen möchten, kopieren Sie den folgenden Inhalt auf Ihr Gerät. Ersetzen Sie my-pod-secrets-bucket durch Ihren Bucket-Namen und führen Sie den Befehl aus.

      cat >my-policy.json <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::my-pod-secrets-bucket" } ] } EOF
    2. Erstellen Sie die IAM-Richtlinie.

      aws iam create-policy --policy-name my-policy --policy-document file://my-policy.json
  2. Erstellen Sie eine IAM-Rolle und verknüpfen Sie sie mit einem Kubernetes-Servicekonto. Sie können entweder eksctl oder AWS CLI verwenden.

    eksctl
    Voraussetzung

    Version 0.183.0 oder höher des eksctl-Befehlszeilen-Tools, das auf Ihrem Computer oder in der AWS CloudShell installiert ist. Informationen zum Installieren und Aktualisieren von eksctl finden Sie in der Dokumentation zu eksctl unter Installation.

    Ersetzen Sie my-service-account durch das Kubernetes-Servicekonto, das eksctl erstellen und mit einer IAM-Rolle verknüpfen soll. Ersetzen Sie default durch den Namen des Clusters, in dem eksctl das Servicekonto erstellen soll. Ersetzen Sie my-cluster durch den Namen Ihres Clusters. Ersetzen Sie my-role durch den Namen der Rolle, mit der das Servicekonto verknüpft werden soll. Wenn es noch nicht vorhanden ist, erstellt eksctl es für Sie. Ersetzen Sie 111122223333 durch Ihre Konto-ID und my-policy durch den Namen einer vorhandenen Richtlinie.

    eksctl create iamserviceaccount --name my-service-account --namespace default --cluster my-cluster --role-name my-role \ --attach-policy-arn arn:aws:iam::111122223333:policy/my-policy --approve
    Wichtig

    Wenn die Rolle oder das Servicekonto bereits vorhanden ist, schlägt der vorherige Befehl möglicherweise fehl. eksctl hat verschiedene Optionen, die Sie in diesen Situationen angeben können. Führen Sie eksctl create iamserviceaccount --help aus, um weitere Informationen zu erhalten.

    AWS CLI
    1. Wenn Sie ein bestehendes Kubernetes-Servicekonto haben, das eine IAM-Rolle annehmen soll, können Sie diesen Schritt überspringen.

      Ein Kubernetes-Service-Konto aktualisieren Kopieren Sie den folgenden Inhalt auf Ihr Gerät. Ersetzen Sie my-service-account durch Ihren Wunschnamen und default durch einen anderen Namespace, falls erforderlich. Wenn Sie default ändern, muss der Namespace bereits vorhanden sein.

      cat >my-service-account.yaml <<EOF apiVersion: v1 kind: ServiceAccount metadata: name: my-service-account namespace: default EOF kubectl apply -f my-service-account.yaml
    2. Setzen Sie Ihre AWS-Konto ID mit dem folgenden Befehl auf eine Umgebungsvariable.

      account_id=$(aws sts get-caller-identity --query "Account" --output text)
    3. Legen Sie des OIDC-Identitätsanbieter Ihres Clusters mit dem folgenden Befehl auf eine Umgebungsvariable fest. Ersetzen Sie my-cluster mit dem Namen Ihres Clusters.

      oidc_provider=$(aws eks describe-cluster --name my-cluster --region $AWS_REGION --query "cluster.identity.oidc.issuer" --output text | sed -e "s/^https:\/\///")
    4. Legen Sie Variablen für den Namespace und den Namen des Servicekontos fest. Ersetzen Sie my-service-account durch das Kubernetes-Servicekonto, das die Rolle annehmen soll. Ersetzen Sie default durch den Namespace des Servicekontos.

      export namespace=default export service_account=my-service-account
    5. Führen Sie den folgenden Befehl aus, um eine Vertrauensrichtlinie für die IAM-Rolle zu erstellen. Wenn Sie allen Servicekonten innerhalb eines Namespaces die Verwendung der Rolle erlauben möchten, kopieren Sie den folgenden Inhalt auf Ihr Gerät. Ersetzen Sie durch StringLike und StringEqualsersetzen Sie $service_account durch. * Sie können mehrere Einträge in den Bedingungen StringEquals und StringLike unten hinzufügen, um mehreren Servicekonten oder Namespaces das Annehmen der Rolle zu erlauben. Damit Rollen von einem anderen AWS-Konto als dem Konto, in dem sich Ihr Cluster befindet, die Rolle übernehmen können, siehe Kontoübergreifende IAM-Berechtigungen für weitere Informationen.

      cat >trust-relationship.json <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::$account_id:oidc-provider/$oidc_provider" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "$oidc_provider:aud": "sts.amazonaws.com", "$oidc_provider:sub": "system:serviceaccount:$namespace:$service_account" } } } ] } EOF
    6. Erstellen Sie die -Rolle. Ersetzen Sie my-role durch einen Namen für Ihre IAM-Rolle und my-role-description durch eine Beschreibung für Ihre Rolle.

      aws iam create-role --role-name my-role --assume-role-policy-document file://trust-relationship.json --description "my-role-description"
    7. Hängen Sie eine IAM-Richtlinie an Ihre Rolle an. Ersetzen Sie my-role durch den Namen Ihrer IAM-Rolle und my-policy durch den Namen einer vorhandenen Richtlinie, die Sie erstellt haben.

      aws iam attach-role-policy --role-name my-role --policy-arn=arn:aws:iam::$account_id:policy/my-policy
    8. Annotieren Sie Ihr Servicekonto mit dem Amazon-Ressourcennamen (ARN) der IAM-Rolle, die das Servicekonto annehmen soll. Ersetzen Sie my-role durch den Namen Ihrer bestehenden IAM-Rolle. Angenommen, Sie haben in einem vorherigen Schritt zugelassen, dass eine Rolle von einem anderen Konto AWS-Konto als dem Konto, in dem sich Ihr Cluster befindet, die Rolle übernimmt. Stellen Sie dann sicher, dass Sie die Rolle AWS-Konto und aus dem anderen Konto angeben. Weitere Informationen finden Sie unter Kontoübergreifende IAM-Berechtigungen.

      kubectl annotate serviceaccount -n $namespace $service_account eks.amazonaws.com/role-arn=arn:aws:iam::$account_id:role/my-role
  3. Stellen Sie sicher, dass die Rolle und das Servicekonto korrekt konfiguriert sind.

    1. Stellen Sie sicher, dass die Vertrauensrichtlinie der IAM-Rolle korrekt konfiguriert ist.

      aws iam get-role --role-name my-role --query Role.AssumeRolePolicyDocument

      Eine Beispielausgabe sieht wie folgt aus.

      { "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:sub": "system:serviceaccount:default:my-service-account", "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com" } } } ] }
    2. Stellen Sie sicher, dass die Richtlinie, die Sie in einem vorherigen Schritt an Ihre Rolle angehängt haben, an die Rolle angehängt ist.

      aws iam list-attached-role-policies --role-name my-role --query AttachedPolicies[].PolicyArn --output text

      Eine Beispielausgabe sieht wie folgt aus.

      arn:aws:iam::111122223333:policy/my-policy
    3. Legen Sie eine Variable fest, um den Amazon-Ressourcennamen (ARN) der Richtlinie zu speichern, die Sie verwenden möchten. Ersetzen Sie my-policy durch den Namen der Richtlinie, für die Sie Berechtigungen überprüfen möchten.

      export policy_arn=arn:aws:iam::111122223333:policy/my-policy
    4. Zeigen Sie die Standardversion der Richtlinie an.

      aws iam get-policy --policy-arn $policy_arn

      Eine Beispielausgabe sieht wie folgt aus.

      { "Policy": { "PolicyName": "my-policy", "PolicyId": "EXAMPLEBIOWGLDEXAMPLE", "Arn": "arn:aws:iam::111122223333:policy/my-policy", "Path": "/", "DefaultVersionId": "v1", [...] } }
    5. Zeigen Sie den Inhalt der Richtlinie an, um sicherzustellen, dass die Richtlinie alle Berechtigungen enthält, die Ihr Pod erfordert. Ersetzen Sie im folgenden Befehl 1 durch die Version, die in der vorherigen Ausgabe zurückgegeben wurde.

      aws iam get-policy-version --policy-arn $policy_arn --version-id v1

      Eine Beispielausgabe sieht wie folgt aus.

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::my-pod-secrets-bucket" } ] }

      Wenn Sie die Beispielrichtlinie in einem vorherigen Schritt erstellt haben, ist Ihre Ausgabe dieselbe. Wenn Sie eine andere Richtlinie erstellt haben, sieht der Beispiel-Inhalt anders aus.

    6. Stellen Sie sicher, dass das Kubernetes-Servicekonto mit der Rolle annotiert ist.

      kubectl describe serviceaccount my-service-account -n default

      Eine Beispielausgabe sieht wie folgt aus.

      Name:                my-service-account
      Namespace:           default
      Annotations:         eks.amazonaws.com/role-arn: arn:aws:iam::111122223333:role/my-role
      Image pull secrets:  <none>
      Mountable secrets:   my-service-account-token-qqjfl
      Tokens:              my-service-account-token-qqjfl
      [...]
  4. (Fakultativ)Den AWS Security Token Service Endpunkt für ein Dienstkonto konfigurieren. AWS empfiehlt die Verwendung eines regionalen AWS STS Endpunkts anstelle des globalen Endpunkts. Dies reduziert die Latenz, bietet integrierte Redundanz und erhöht die Gültigkeit der Sitzungstoken.

Nächster Schritt

Für Pods die Verwendung eines Kubernetes Dienstkontos konfigurieren