IAM-Rollen Kubernetes-Servicekonten zuweisen - Amazon EKS

Unterstützung für die Verbesserung dieser Seite beitragen

Um zu diesem Benutzerhandbuch beizutragen, klicken Sie auf den Link Diese Seite auf GitHub bearbeiten, der sich im rechten Bereich jeder Seite befindet.

IAM-Rollen Kubernetes-Servicekonten zuweisen

In diesem Thema wird erläutert, wie Sie ein Kubernetes-Servicekonto so konfigurieren, dass es eine AWS Identity and Access Management (IAM)-Rolle übernimmt. Alle Pods, welche für die Verwendung des Servicekontos konfiguriert sind, können dann auf alle AWS-Services zugreifen, für welche die Rolle über Zugriffsberechtigungen verfügt.

Voraussetzungen

  • Einen vorhandenen -Cluster. Falls Sie noch kein Service-Konto haben, können Sie eines erstellen, indem Sie einer der Anleitungen in Erste Schritte mit Amazon EKS folgen.

  • Ein vorhandener Anbieter für IAM OpenID Connect (OIDC) 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 IAM-OIDC-Anbieter für Ihren Cluster.

  • Version 2.12.3 oder höher oder die Version 1.27.160 oder höher der AWS-Befehlszeilenschnittstelle (AWS-CLI), die auf Ihrem Gerät oder in AWS CloudShell installiert und konfiguriert sein muss. 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 der AWS CLI. Um die neueste Version zu installieren, lesen Sie Installation und Schnellkonfiguration mit aws configure im Benutzerhandbuch zur AWS-Befehlszeilenschnittstelle. Die in AWS CloudShell installierte AWS-CLI-Version kann auch mehrere Versionen hinter der neuesten Version liegen. Informationen zum Aktualisieren finden Sie unter Installieren der AWS CLI in Ihrem Stammverzeichnis im AWS-CloudShell-Benutzerhandbuch.

  • Das kubectl-Befehlszeilen-Tool ist auf Ihrem Gerät oder in AWS CloudShell installiert. Die Version kann mit der Kubernetes-Version Ihres Clusters identisch sein oder bis zu einer 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 kubectl und eksctl einrichten.

  • Eine vorhandene kubectl config-Datei, die Ihre Clusterkonfiguration enthält. Informationen zum Erstellen einer kubectl config-Datei finden Sie unter kubectl mit einem EKS-Cluster durch Erstellen einer kubeconfig-Datei verbinden.

Schritt 1: IAM-Richtlinie erstellen

Wenn Sie Ihrer IAM-Rolle eine vorhandene IAM-Richtlinie zuordnen möchten, fahren Sie mit dem nächsten Schritt fort.

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

  2. Erstellen Sie eine Datei, welche die Berechtigungen für die AWS-Services enthält, auf die Ihre Pods Zugriff haben sollen. Eine Liste aller Aktionen für alle AWS-Services finden Sie unter Referenz zur Service-Autorisierung.

    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
  3. Erstellen Sie die IAM-Richtlinie.

    aws iam create-policy --policy-name my-policy --policy-document file://my-policy.json

Schritt 2: IAM-Rolle erstellen und zuordnen

Erstellen Sie eine IAM-Rolle und ordnen Sie diese einem Kubernetes-Servicekonto zu. Sie können entweder eksctl oder die AWS CLI verwenden.

Rolle erstellen und zuordnen (eksctl)

Dieser eksctl-Befehl erstellt ein Kubernetes-Servicekonto im angegebenen Namespace, erstellt eine IAM-Rolle (sofern diese nicht bereits vorhanden ist) mit dem angegebenen Namen, fügt der Rolle eine vorhandene IAM-Richtlinie-ARN hinzu und annotiert das Servicekonto mit der IAM-Rollen-ARN. Denken Sie daran, die Beispiel-Platzhalterwerte in diesem Befehl durch Ihre spezifischen Werte zu ersetzen. Informationen zum Installieren und Aktualisieren von eksctl finden Sie in der Dokumentation zu eksctl unter Installation.

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.

Rolle erstellen und zuordnen (AWS-CLI)

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

  1. Erstellen Sie ein Kubernetes-Servicekonto. 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. Legen Sie Ihre AWS-Konto-ID mit dem folgenden Befehl auf eine Umgebungsvariable fest.

    account_id=$(aws sts get-caller-identity --query "Account" --output text)
  3. Legen Sie den OIDC-Identitätsanbieter Ihres Clusters mit dem folgenden Befehl auf eine Umgebungsvariable fest. Ersetzen Sie my-cluster durch den 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, dem Sie die Rolle übernehmen möchten. 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 StringEquals durch StringLike und ersetzen 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. Weitere Informationen dazu, wie Sie Rollen aus einem anderen AWS-Konto als dem Konto, in dem sich Ihr Cluster befindet, die Rolle übernehmen lassen, finden Sie unter Authentifizierung bei einem anderen Konto mit IRSA.

    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 vorhandenen IAM-Rolle. Angenommen, Sie haben in einem vorherigen Schritt einer Rolle aus einem anderen AWS-Konto als dem Konto, in dem sich Ihr Cluster befindet, erlaubt, die Rolle zu übernehmen. Stellen Sie dann sicher, dass Sie das AWS-Konto und die Rolle des anderen Kontos angeben. Weitere Informationen finden Sie unter Authentifizierung bei einem anderen Konto mit IRSA.

    kubectl annotate serviceaccount -n $namespace $service_account eks.amazonaws.com/role-arn=arn:aws:iam::$account_id:role/my-role
  9. (Optional) Konfigurieren Sie den Service-Endpunkt des AWS-Sicherheits-Tokens für ein Servicekonto. 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.

Schritt 3: Konfiguration bestätigen

  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. Überprüfen Sie den Inhalt der Richtlinie, um sicherzustellen, dass sie alle Berechtigungen enthält, die Ihr Pod benötigt. 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 [...]

Nächste Schritte