Wie behebe ich Probleme mit einem OIDC-Anbieter und IRSA in Amazon EKS?

Lesedauer: 6 Minute
0

Meine Pods können die AWS Identity and Access Management (IAM)-Rollenberechtigungen mit dem Amazon Elastic Kubernetes Service (Amazon EKS)-Kontotoken nicht verwenden.

Behebung

Überprüfen Sie, ob Sie bereits einen IAM-OIDC-Anbieter für Ihren Cluster haben

Wenn bereits ein Anbieter existiert, erhalten Sie eine Fehlermeldung ähnlich der folgenden: „WebIdentityErr: failed to retrieve credentials\ncaused by: InvalidIdentityToken: No OpenIDConnect provider found in your account for https://oidc.eks.eu-west-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E\n\tstatus code: 400“;

Gehen Sie wie folgt vor, um zu überprüfen, ob Sie bereits einen IAM-OIDC-Anbieter haben:

  1. Überprüfen Sie die OIDC-Provider-URL Ihres Clusters:

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

    Beispielausgabe:

    https://oidc.eks.us-west-2.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E
  2. Führen Sie die IAM-OIDC-Anbieter in Ihrem Konto auf. Ersetzen Sie EXAMPLED539D4633E53DE1B716D3041E durch den Wert, den der vorherige Befehl zurückgegeben hat:

    aws iam list-open-id-connect-providers | grep EXAMPLED539D4633E53DE1B716D3041E

    Beispielausgabe:

    "Arn": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.us-west-2.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E"

Wenn der Befehl eine Ausgabe zurückgibt, haben Sie bereits einen Anbieter für Ihren Cluster. Wenn der Befehl keine Ausgabe zurückgibt, müssen Sie einen IAM-OIDC-Anbieter erstellen.

Überprüfen Sie, ob Ihre IAM-Rolle über die erforderlichen Berechtigungen und eine angehängte IAM-Richtlinie verfügt

**Hinweis:**Wenn bei der Ausführung von AWS Command Line Interface (AWS CLI)-Befehlen Fehler auftreten, finden Sie weitere Informationen unter Troubleshoot AWS CLI errors. Stellen Sie außerdem sicher, dass Sie die neueste Version von AWS CLI verwenden.

Gehen Sie wie folgt vor, um zu überprüfen, ob Ihre IAM-Rolle über die erforderlichen Berechtigungen verfügt:

  1. Öffnen Sie die IAM-Konsole.
  2. Wählen Sie im Navigationsbereich Rollen aus.
  3. Wählen Sie die Rolle aus, die Sie verifizieren möchten.
  4. Vergewissern Sie sich auf der Registerkarte Berechtigungen, dass die erforderliche Richtlinie an die Rolle angehängt ist.
  5. Stellen Sie sicher, dass die IAM-Rollenvertrauensbeziehungen korrekt eingerichtet sind.

Gehen Sie wie folgt vor, um zu überprüfen, ob Ihrer IAM-Rolle eine Richtlinie angehängt ist:

  1. Öffnen Sie die IAM-Konsole.

  2. Wählen Sie im Navigationsbereich Rollen aus.

  3. Wählen Sie die Rolle aus, die Sie überprüfen möchten.

  4. Wählen Sie das Register Vertrauensbeziehungen aus. Stellen Sie sicher, dass das Format Ihrer Richtlinie dem Format der folgenden JSON-Richtlinie entspricht:

    {  "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Federated": "arn:aws:iam::ACCOUNT_ID:oidc-provider/oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E"
          },
          "Action": "sts:AssumeRoleWithWebIdentity",
          "Condition": {
            "StringEquals": {
              "oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E:sub": "system:serviceaccount:SERVICE_ACCOUNT_NAMESPACE:SERVICE_ACCOUNT_NAME",
              "oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E:aud": "sts.amazonaws.com"
            }
          }
        }
      ]
    }

    Um Vertrauensbeziehungen zu überprüfen, führen Sie den Befehl get-role in der AWS Command Line Interface (AWS CLI) aus:

    $ aws iam get-role --role-name EKS-IRSA

    **Hinweis:**Ersetzen Sie EKS-IRSA durch Ihren IAM-Rollennamen.
    Suchen Sie in der JSON-Ausgabe nach dem Abschnitt AssumeRolePolicyDocument.
    Beispielausgabe:

    {  "Role": {
        "Path": "/",
        "RoleName": "EKS-IRSA",
        "RoleId": "AROAQ55NEXAMPLELOEISVX",
        "Arn": "arn:aws:iam::ACCOUNT_ID:role/EKS-IRSA",
        "CreateDate": "2021-04-22T06:39:21+00:00",
        "AssumeRolePolicyDocument": {
          "Version": "2012-10-17",
          "Statement": [
            {
              "Effect": "Allow",
              "Principal": {
                "Federated": "arn:aws:iam::ACCOUNT_ID:oidc-provider/oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E"
              },
              "Action": "sts:AssumeRoleWithWebIdentity",
              "Condition": {
                "StringEquals": {
                  "oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E:aud": "sts.amazonaws.com",
                  "oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E:sub": "system:serviceaccount:SERVICE_ACCOUNT_NAMESPACE:SERVICE_ACCOUNT_NAME"
                }
              }
            }
          ]
        },
        "MaxSessionDuration": 3600,
        "RoleLastUsed": {
          "LastUsedDate": "2021-04-22T07:01:15+00:00",
          "Region": "AWS_REGION"
        }
      }
    }

    Hinweis: Aktualisieren Sie je nach Anwendungsfall die AWS-Region, den Namen des Kubernetes-Dienstkontos und den Kubernetes-Namespace.

Prüfen Sie, ob Sie ein Dienstkonto erstellt haben

Führen Sie folgenden Befehl aus:

$ kubectl get sa -n YOUR_NAMESPACE

Hinweis: Ersetzen Sie YOUR_NAMESPACE druch Ihren Kubernetes-Namespace.

Beispielausgabe:

NAME      SECRETS   AGEdefault   1         28d
irsa      1         66m

Wenn Sie kein Dienstkonto haben, finden Sie weitere Informationen unter Dienstkonten für Pods konfigurieren auf der Kubernetes-Website.

Stellen Sie sicher, dass das Dienstkonto die richtigen IAM-Rollenanmerkungen enthält

Führen Sie den folgenden Befehl aus, um zu überprüfen, ob Ihr Dienstkonto über die richtigen IAM-Rollenanmerkungen verfügt:

$ kubectl describe sa irsa -n YOUR_NAMESPACE

Hinweis: Ersetzen Sie irsa durch Ihren Kubernetes-Dienstkontonamen und YOUR\ _NAMESPACE durch Ihren Kubernetes-Namespace.

Beispielausgabe:

Name:                irsaNamespace:           default
Labels:              none
Annotations:         eks.amazonaws.com/role-arn: arn:aws:iam::ACCOUNT_ID:role/IAM_ROLE_NAME
Image pull secrets:  none
Mountable secrets:   irsa-token-v5rtc
Tokens:              irsa-token-v5rtc
Events:              none

Stellen Sie sicher, dass Sie den ServiceAccountName in Ihrem Pod korrekt angegeben haben

Führen Sie den folgenden Befehl aus, um den serviceAccountName zu überprüfen:

$ kubectl get pod POD_NAME  -o yaml -n YOUR_NAMESPACE| grep -i serviceAccountName:

**Hinweis:**Ersetzen Sie POD\ _NAME und YOUR_NAMESPACE durch Ihren Kubernetes-Pod und Namespace.

Beispielausgabe:

serviceAccountName: irsa

Überprüfen Sie die Umgebungsvariablen und Berechtigungen

Suchen Sie in den Umgebungsvariablen des Pods nach AWS_ROLE_ARN und AWS_WEB_IDENTITY_TOKEN_FILE:

$ kubectl -n YOUR_NAMESPACE exec -it POD_NAME -- env | grep AWS

Beispielausgabe:

AWS_REGION=ap-southeast-2AWS_ROLE_ARN=arn:aws:iam::111122223333:role/EKS-IRSA
AWS_WEB_IDENTITY_TOKEN_FILE=/var/run/secrets/eks.amazonaws.com/serviceaccount/token
AWS_DEFAULT_REGION=ap-southeast-2

Stellen Sie sicher, dass die Anwendung ein unterstütztes AWS-SDK verwendet

Die SDK-Version muss größer oder gleich den folgenden Werten sein:

Java (Version 2) — 2.10.11Java — 1.11.704
Go — 1.23.13
Python (Boto3) — 1.9.220
Python (botocore) — 1.12.200
AWS CLI — 1.16.232
Node — 3.15.0
Ruby — 2.11.345
C++ — 1.7.174
.NET — 3.3.659.1
PHP — 3.110.7

Informationen zur neuesten unterstützten SDK-Version finden Sie unter Verwenden eines unterstützten AWS-SDK.

Pods neu erstellen

Wenn Sie Pods erstellt haben, bevor Sie IRSA angewendet haben, führen Sie den folgenden Befehl aus, um die Pods neu zu erstellen:

$ kubectl rollout restart deploy nginx

Beispielausgabe:

deployment.apps/nginx restarted

Führen Sie für Daemonsets- oder Statefulsets-Bereitstellungen den folgenden Befehl aus:

$ kubectl rollout restart deploy DEPLOYMENT_NAME

Wenn Sie nur einen Pod erstellt haben, müssen Sie den Pod löschen und neu erstellen:

  1. Führen Sie den folgenden Befehl aus, um den Pod zu löschen:
    $ kubectl delete pod POD_NAME
    Hinweis: Ersetzen Sie POD\ _NAME durch den Namen Ihres Pods.
  2. Führen Sie den folgenden Befehl aus, um den Pod neu zu erstellen:
    $ kubectl apply -f SPEC_FILE
    **Hinweis:**Ersetzen Sie SPEC\ _FILE durch den Dateipfad und den Dateinamen Ihres Kubernetes-Manifests.

Stellen Sie sicher, dass die Zielgruppe korrekt ist

Wenn Sie den OIDC-Anbieter mit der falschen Zielgruppe erstellt haben, erhalten Sie die folgende Fehlermeldung: „Error - An error occurred (InvalidIdentityToken) when calling the AssumeRoleWithWebIdentity operation: Incorrect token audience“.

Überprüfen Sie den IAM-dentitätsanbieter für Ihren Cluster. Ihre ClientIDList ist sts.amazonaws.com:

$ aws iam get-open-id-connect-provider --open-id-connect-provider-arn arn:aws:iam::ACCOUNT_ID:oidc-provider/oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E

Beispielausgabe:

{  "Url": "oidc.eks.AWS_REGION.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E",
  "ClientIDList": [
    "sts.amazonaws.com"
  ],
  "ThumbprintList": [
    "9e99a48a9960b14926bb7f3b02e22da2b0ab7280"
  ],
  "CreateDate": "2021-01-21T04:29:09.788000+00:00",
  "Tags": []
}

Stellen Sie sicher, dass Sie den richtigen Fingerabdruck konfiguriert haben

Wenn der im IAM-OIDC konfigurierte Fingerabdruck nicht korrekt ist, erhalten Sie die folgende Fehlermeldung: „failed to retrieve credentials caused by: InvalidIdentityToken: OpenIDConnect provider's HTTPS certificate doesn't match configured thumbprint“.

Um automatisch den richtigen Fingerabdruck zu konfigurieren, verwenden Sie eksctl oder die AWS-Managementkonsole, um den IAM-Identitätsanbieter zu erstellen. Weitere Möglichkeiten, einen Fingerabdruck zu erhalten, finden Sie unter Abrufen des Fingerabdrucks für einen OpenID Connect-Identitätsanbieter.

Überprüfen Sie für die AWS-Region China die Umgebungsvariable AWS\ _DEFAULT\ _REGION

Für einen IRSA-angewendeten Pod oder Daemonset, das in einem Cluster in der AWS-Region China bereitgestellt wird, legen Sie die Umgebungsvariable AWS_DEFAULT_REGION in der Pod-Spezifikation fest. Wenn Sie diese Variable nicht festlegen, wird für den Pod oder Daemonset möglicherweise die folgende Fehlermeldung angezeigt: “An error occurred (InvalidClientTokenId) when calling the GetCallerIdentity operation: The security token included in the request is invalid.“

Um die Umgebungsvariable AWS_DEFAULT_REGION zu Ihrer Pod- oder Daemonset-Spezifikation hinzuzufügen, führen Sie einen Befehl aus, der dem folgenden Beispiel ähnelt:

apiVersion: apps/v1kind: Deployment
metadata:
  name: my-app
spec:
  template:
    metadata:
      labels:
        app: my-app
    spec:
      serviceAccountName: my-app
      containers:
      - name: my-app
        image: my-app:latest
        env:
        - name: AWS_DEFAULT_REGION
          value: "AWS_REGION"
...
AWS OFFICIAL
AWS OFFICIALAktualisiert vor 8 Monaten