Wie behebe ich Fehler bei einem OIDC-Anbieter und IRSA in Amazon EKS?

Letzte Aktualisierung: 15.11.2021

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

Kurzbeschreibung

Um Probleme mit dem OpenID Connect (OIDC)-Anbieter und den IAM-Rollen für Dienstkonten (IRSA) in Amazon EKS zu beheben, führen Sie die Schritte in einem der folgenden Abschnitte aus:

  • Prüfen Sie, ob Sie einen vorhandenen IAM-OIDC-Anbieter für Ihren Cluster haben
  • Prüfen Sie, ob Ihre IAM-Rolle über eine angehängte erforderliche IAM-Richtlinie mit erforderlichen Berechtigungen verfügt
  • Stellen Sie sicher, dass die Vertrauensbeziehungen der IAM-Rolle korrekt eingestellt sind
  • Prüfen Sie, ob Sie ein Dienstkonto erstellt haben
  • Stellen Sie sicher, dass das Dienstkonto über die richtigen IAM-Rollenanmerkungen verfügt
  • Stellen Sie sicher, dass Sie den serviceAccountName in Ihrem Pod korrekt angegeben haben
  • Überprüfen Sie die Umgebungsvariablen und Berechtigungen
  • Stellen Sie sicher, dass die Anwendung ein unterstütztes AWS-SDK verwendet
  • Prüfen Sie den Pod-Benutzer und die Gruppe
  • Bauen Sie Pods nach
  • Stellen Sie sicher, dass das Publikum richtig ist
  • Stellen Sie sicher, dass Sie den richtigen Fingerabdruck konfiguriert haben
  • Überprüfen Sie für die AWS-Region China die Umgebungsvariable AWS_DEFAULT_REGION

Auflösung

Prüfen Sie, ob Sie einen vorhandenen IAM-OIDC-Anbieter für Ihren Cluster haben

Wenn bereits ein Anbieter existiert, erhalten Sie einen Fehler.

Beispiel:

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

1.    Prüfen Sie die OIDC-Anbieter-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.    Listen Sie die IAM-OIDC-Anbieter in Ihrem Konto auf. Ersetzen Sie EXAMPLED539D4633E53DE1B716D3041E (schließen Sie < >ein) durch den vom vorherigen Befehl zurückgegebenen Wert:

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 vorhergehende 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. Sehen Sie,Erstellen Sie einen IAM-OIDC-Anbieter für Ihren Cluster

Prüfen Sie, ob Ihre IAM-Rolle über eine angehängte erforderliche IAM-Richtlinie mit 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 überprüfen möchten.

4.    Überprüfen Sie auf der Registerkarte Berechtigungen, ob dieser Rolle die erforderliche Richtlinie beigefügt ist.

Stellen Sie sicher, dass die Vertrauensbeziehungen der IAM-Rolle korrekt eingestellt sind

Mit der AWS-Managementkonsole:

1.    Öffnen Sie die IAM-Konsole.

2.    Wählen Sie im Navigationsbereich Rollen aus.

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

4.    Wählen Sie die Registerkarte Vertrauensbeziehungen, um zu überprüfen, ob 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"
        }
      }
    }
  ]
}

Mit der AWS CLI:

Um Vertrauensbeziehungen zu überprüfen, führen Sie den folgenden Befehl mit Ihrem Rollennamen aus:

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

Hinweis: Ersetzen Sie EKS-IRSA durch Ihren IAM-Rollennamen.

Suchen Sie im Ausgabe-JSON 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: Stellen Sie sicher, dass Sie die richtige AWS-Region, den Namen des Kubernetes-Servicekontos und den richtigen Kubernetes-Namespace angegeben haben.

Prüfen Sie, ob Sie ein Dienstkonto erstellt haben

Verwenden Sie den folgenden Befehl:

$ kubectl get sa -n YOUR_NAMESPACE

Hinweis: Ersetzen Sie YOUR_NAMESPACE durch Ihren Kubernetes-Namespace.

Beispielausgabe:

NAME      SECRETS   AGE
default   1         28d
irsa      1         66m

Wenn Sie kein Dienstkonto haben, lesen Sie Konfigurieren von Dienstkonten für Pods (von der Kubernetes-Website).

Stellen Sie sicher, dass das Dienstkonto über die richtigen IAM-Rollenanmerkungen verfügt

Verwenden Sie den folgenden Befehl:

$ kubectl describe sa irsa -n YOUR_NAMESPACE

Hinweis: Ersetzen Sie irsa durch Ihren Kubernetes-Dienstkontonamen. Ersetzen Sie YOUR_NAMESPACE durch Ihren Kubernetes-Namespace.

Beispielausgabe:

Name:                irsa
Namespace:           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

Verwenden Sie den folgenden Befehl:

$ 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-2
AWS_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.11
Java — 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 sehen Sie unter Verwenden eines unterstützten AWS-SDK.

Prüfen Sie den Pod-Benutzer und die Gruppe

Verwenden Sie den folgenden Befehl:

$ kubectl exec -it POD_NAME -- id
uid=0(root) gid=0(root) groups=0(root)

Hinweis: Standardmäßig verfügen nur Container, die als root ausgeführt werden, über die richtigen Dateisystemberechtigungen zum Lesen der Webidentitätstokendatei.

Wenn Ihre Container nicht als root ausgeführt werden, können Sie die folgenden Fehler erhalten:

Error: PermissionError: [Errno 13] Permission denied: ‘/var/run/secrets/eks.amazonaws.com/serviceaccount/token

-oder-

WebIdentityErr: failed fetching WebIdentity token: \ncaused by: WebIdentityErr: unable to read file at /var/run/secrets/eks.amazonaws.com/serviceaccount/token\ncaused by: open /var/run/secrets/eks.amazonaws.com/serviceaccount/token: permission denied

Um die richtigen Dateisystemberechtigungen bereitzustellen, stellen Sie sicher, dass Ihre Container als root ausgeführt werden. Stellen Sie für Cluster 1.18 oder niedriger den folgenden Sicherheitskontext für die Container in Ihrem Manifest bereit:

apiVersion: apps/v1
kind: Deployment
metadata:
 name: my-app
spec:
 template:
    metadata:
      labels:
        app: my-app
    spec:
      serviceAccountName: my-app
      containers:
      - name: my-app
        image: my-app:latest
      securityContext:
        fsGroup: 1337
...

Hinweis: Die fsGroup-ID ist frei wählbar. Sie können eine beliebige gültige Gruppen-ID auswählen. Die vorhergehende Sicherheitskontext-Einstellung ist für Cluster 1.19 oder höher nicht erforderlich.

Bauen Sie Pods nach

Wenn Sie Pods erstellt haben, bevor Sie IRSA angewendet haben, erstellen Sie die Pods neu.

Beispielbefehl:

$ kubectl rollout restart deploy nginx

Beispielausgabe:

deployment.apps/nginx restarted

Für daemonsets oder statefulsets-Bereitstellungen können Sie den folgenden Befehl verwenden:

$ kubectl rollout restart deploy DEPLOYMENT_NAME

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

Beispielbefehl zum Löschen:

$ kubectl delete pod POD_NAME

Beispielbefehl zum Neuerstellen:

$ kubectl apply -f SPEC_FILE

Hinweis: Ersetzen Sie SPEC_FILE durch den Pfad und den Namen Ihrer Kubernetes-Manifestdatei.

Stellen Sie sicher, dass das Publikum richtig ist

Wenn Sie den OIDC-Anbieter mit der falschen Zielgruppe erstellt haben, wird der folgende Fehler angezeigt:

Error - An error occurred (InvalidIdentityToken) when calling the AssumeRoleWithWebIdentity operation: Incorrect token audience

Prüfen Sie den IAM-Identitä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, kann der folgende Fehler angezeigt werden:

failed to retrieve credentials caused by: InvalidIdentityToken: OpenIDConnect provider's HTTPS certificate doesn't match configured thumbprint

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

Überprüfen Sie für die AWS-Region China die Umgebungsvariable AWS_DEFAULT_REGION

Wenn Sie IRSA für einen Pod oder Daemonset verwenden, der in einem Cluster in der AWS-Region China bereitgestellt wird, legen Sie die Umgebungsvariable AWS_DEFAULT_REGION in der Pod-Spezifikation fest. Wenn Sie dies nicht tun, kann der Pod oder Daemonset den folgenden Fehler erhalten:

An error occurred (InvalidClientTokenId) when calling the GetCallerIdentity operation: The security token included in the request is invalid

Verwenden Sie das folgende Beispiel, um die Umgebungsvariable AWS_DEFAULT_REGION zu Ihrer Pod- oder Daemonset-Spezifikation hinzuzufügen:

apiVersion: apps/v1
kind: 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"
...

War dieser Artikel hilfreich?


Benötigen Sie Hilfe zur Fakturierung oder technischen Support?