Wie behebe ich Probleme beim dynamischen Erstellen eines persistenten Kubernetes-Volume-Objekts mithilfe des Amazon-EFS-CSI-Controllers?

Lesedauer: 5 Minute
0

Ich erhalte Fehler, wenn ich einen Amazon-Elastic-Kubernetes-Service (Amazon EKS)-Pod erstelle, der den Persistent Volume Claim verwendet. Das persistente Volume wird dynamisch erstellt und befindet sich im Zustand Ausstehend.

Lösung

Der Amazon-Elastic-File-System (Amazon EFS)-CSI-Treiber verwendet die Funktion AWS-Identity-and-Access-Management-Rolle (IAM) für Servicekonto (IRSA). Für diese Funktion müssen verschiedene Komponenten, einschließlich des OpenID-Connect-Providers (OIDC), der IAM-Rolle und der Zugriffsberechtigungen, korrekt konfiguriert sein. Diese Komponenten werden mithilfe der IAM-Rollenrichtlinie und des Kubernetes-Servicekontos konfiguriert. Probieren Sie je nach Fehler die folgenden Schritte zur Fehlerbehebung aus.

Hinweis: Wenn Sie beim Ausführen von AWS-CLI-Befehlen Fehler erhalten, stellen Sie sicher, dass Sie die neueste Version der AWS CLI verwenden.

storageclass.storage.k8s.io "<STORAGE_CLASS_NAME>" not found

Dieser Fehler weist darauf hin, dass die Speicherklasse, auf die der Parameter storageClassName in Ihrer PersistentVolumeClaim-Objektdefinition verweist, nicht existiert und erstellt werden muss.

Gehen Sie zur Behebung dieses Fehlers folgendermaßen vor:

1.    Erstellen Sie ein Kubernetes-Speicherklassenobjekt.

2.    Laden Sie ein Speicherklassenmanifest für Amazon EFS herunter:

curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-efs-csi-driver/master/examples/kubernetes/dynamic_provisioning/specs/storageclass.yaml

3.    Bearbeiten Sie die heruntergeladene Datei. Suchen Sie die folgende Anweisung, und ersetzen Sie dann den Wert für fileSystemId durch Ihre Dateisystem-ID.

fileSystemId: fs-582a03f344f0fc633 # Replace the filesystem id

4.    Stellen Sie die Speicherklasse bereit:

kubectl apply -f storageclass.yaml

failed to provision volume with StorageClass "<STORAGE_CLASS_NAME>": rpc error: code = InvalidArgument desc = File System does not exist: Resource was not found

Dieser Fehler weist darauf hin, dass die fileSystemId, auf die das Speicherklassenobjekt verweist, in der Region entweder nicht existiert oder falsch ist.

Um diesen Fehler zu beheben, überprüfen Sie, ob das Amazon-EFS-Dateisystem, auf das in der Speicherklasse verwiesen wird, korrekt ist und in der Region existiert:

kubectl get storageclass `kubectl get pvc ${PVC_NAME} -o jsonpath='{.spec.storageClassName}'` -o jsonpath='{.parameters.fileSystemId}'

Hinweis: Stellen Sie sicher, dass Sie PVC_NAME durch den Namen Ihres PersistentVolumeClaim ersetzen.

Wenn das zurückgegebene EFS-Dateisystem (fileSystemId) in der Region nicht existiert, löschen Sie das Kubernetes-Speicherklassenobjekt. Erstellen Sie es dann erneut, indem Sie die richtige Dateisystem-ID für das Feld fileSystemId angeben.

failed to provision volume with StorageClass "<STORAGE_CLASS_NAME>": rpc error: code = Internal desc = Failed to fetch File System info: Describe File System failed: WebIdentityErr: failed to retrieve credentials caused by: InvalidIdentityToken: No OpenIDConnect provider found in your account for https://oidc.eks.<REGION-CODE>.amazonaws.com/id/<OIDC ID> status code: 400, request id: <REQUEST ID>

Dieser Fehler weist darauf hin, dass die angegebene IAM-OIDC-Identität nicht in IAM für den Amazon-EKS-Cluster erstellt wurde.

1.    Rufen Sie die OIDC-Anbieter-ID Ihres Clusters ab und speichern Sie sie in einer Variablen:

oidc_id=$(aws eks describe-cluster --name ${CLUSTER_NAME} --query "cluster.identity.oidc.issuer" --output text | cut -d '/' -f 5); echo $oidc_id

Hinweis: Stellen Sie sicher, dass Sie CLUSTER_NAME durch den Namen Ihres Clusters ersetzen.

2.    Erstellen Sie einen IAM-OIDC-Identitätsanbieteranbieter für Ihren Cluster:

eksctl utils associate-iam-oidc-provider --cluster ${CLUSTER_NAME} –-approve

Hinweis: Wenn Sie das Dienstprogramm eksctl nicht verwenden können, um den IAM-OIDC-Anbieter zu erstellen, verwenden Sie die AWS-Managementkonsole.

failed to provision volume with StorageClass "<STORAGE_CLASS_NAME>": rpc error: code = Unauthenticated desc = Access Denied. Please ensure you have the right AWS permissions: Access denied

Dieser Fehler weist darauf hin, dass die IRSA nicht über die erforderlichen Zugriffsberechtigungen verfügt (Beispiel: elasticfilesystem:CreateAccessPoint).

1.    Rufen Sie das Servicekonto ab, das von der EFS-CSI-Controller-Bereitstellung verwendet wird:

kubectl get deploy -n kube-system efs-csi-controller -o=jsonpath={'.spec.template.spec.serviceAccount'}

2.    Suchen Sie die IAM-Rolle, die vom Servicekonto verwendet wird:

kubectl get sa -n kube-system ${SERVICE_ACCOUNT} -oyaml -o=jsonpath={'.metadata.annotations.eks\.amazonaws\.com/role-arn'}

3.    Laden Sie das IAM-Richtliniendokument von GitHub herunter:

curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-efs-csi-driver/master/docs/iam-policy-example.json

4.    Erstellen Sie die IAM-Richtlinie, falls sie nicht existiert:

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

5.    Hängen Sie diese IAM-Richtlinie an die IAM-Rolle an, die Sie zuvor abgerufen haben, und versehen Sie sie mit dem Servicekonto, das von der EFS-CSI-Controller-Bereitstellung verwendet wird.

aws iam attach-role-policy --policy-arn arn:aws:iam::${ACCOUNT_ID}:policy/AmazonEKS_EFS_CSI_Driver_Policy --role-name ${IAM_ROLE_NAME}

Hinweis:

Sie können die Konto-ID abrufen, indem Sie den folgenden Befehl ausführen:

aws sts get-caller-identity --query "Account" --output text

Sie können die IAM-Rolle abrufen, indem Sie den folgenden Befehl ausführen:

echo $IAM_ROLE_ARN | cut -d "/" -f2

Failed to fetch File System info: Describe File System failed: WebIdentityErr: failed to retrieve credentials caused by: AccessDenied: Not authorized to perform sts:AssumeRoleWithWebIdentity

Dieser Fehler wird aus einem der folgenden Gründe angezeigt:

  • The IAM permission sts:AssumeRoleWithWebIdentity isn't provided.
  • The IAM OIDC identity provider listed in the trust relationship document that's attached to the IAM role isn't correct.
  • The Kubernetes service account (example: system:serviceaccount:kube-system:efs-csi-controller-sa) mentioned doesn't match the one that's used by the EFS CSI controller deployment.

Gehen Sie wie folgt vor, um diesen Fehler zu beheben:

1.    Rufen Sie die OIDC-Anbieter-ID Ihres Clusters ab und speichern Sie sie in einer Variablen.

oidc_id=$(aws eks describe-cluster --name ${CLUSTER_NAME} --query "cluster.identity.oidc.issuer" --output text | cut -d '/' -f 5); echo ${oidc_id}

Stellen Sie sicher, dass Sie CLUSTER_NAME durch den Namen Ihres Clusters ersetzen.

2.    Stellen Sie sicher, dass die IAM-OIDC-Anbieter-ID im AWS-Konto vorhanden ist:

aws iam list-open-id-connect-providers | grep $oidc_id | cut -d "/" -f4

3.    Lesen Sie das Dokument zur Vertrauensstellung, das der IAM-Rolle beigefügt ist:

aws iam get-role --role-name ${IAM_ROLE_NAME} --output json --query "Role.AssumeRolePolicyDocument"

Stellen Sie sicher, dass die Aktion sts:AssumeRoleWithWebIdentity zulässig ist. Stellen Sie außerdem sicher, dass die IAM-OIDC-ID mit der OIDC-ID übereinstimmt, die durch den vorherigen Befehl zurückgegeben wurde.

Hinweis:

Sie können die IAM-Rolle abrufen, indem Sie den folgenden Befehl ausführen:

echo $IAM_ROLE_ARN | cut -d "/" -f2

Ähnliche Informationen

IAM-Rollen für Servicekonten

Amazon-EFS-CSI-Treiber

AWS OFFICIAL
AWS OFFICIALAktualisiert vor einem Jahr