Amazon EFS CSI 컨트롤러를 사용하여 동적으로 Kubernetes 영구 볼륨 객체를 생성할 때 발생하는 문제를 해결하려면 어떻게 해야 하나요?

4분 분량
0

영구 볼륨 클레임을 사용하는 Amazon Elastic Kubernetes Service(Amazon EKS) 포드를 생성할 때 오류가 발생합니다. 영구 볼륨은 동적으로 생성되며 보류 중 상태입니다.

해결 방법

Amazon Elastic File System(Amazon EFS) CSI 드라이버는 서비스 계정(IRSA) 기능에 대한 AWS Identity and Access Management(IAM) 역할을 사용합니다. 이 기능을 사용하려면 OpenID Connect(OIDC) 공급자, IAM 역할 및 액세스 권한을 비롯한 다양한 구성 요소가 올바르게 구성되어 있어야 합니다. 이러한 구성 요소는 IAM 역할 정책과 Kubernetes 서비스 계정을 사용하여 구성됩니다. 표시되는 오류에 따라 다음 문제 해결 단계를 시도합니다.

참고: AWS CLI 명령을 실행할 때 오류가 발생하는 경우 최신 버전의 AWS CLI를 사용하고 있는지 확인하세요.

storageclass.storage.k8s.io '<STORAGE_CLASS_NAME>'을(를) 찾을 수 없음

이 오류는 PersistentVolumeClaim 객체 정의에서 storageClassName 파라미터가 참조하는 스토리지 클래스가 존재하지 않으므로 생성해야 함을 나타냅니다.

이 오류를 해결하려면 다음을 수행하세요.

1.    Kubernetes 스토리지 클래스 객체를 생성합니다.

2.    Amazon EFS용 스토리지 클래스 매니페스트를 다운로드합니다.

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

3.    다운로드한 파일을 편집합니다. 다음 명령문을 찾은 다음 fileSystemId 값을 파일 시스템 ID로 바꿉니다.

fileSystemId: fs-582a03f344f0fc633 # Replace the filesystem id

4.    스토리지 클래스 배포

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

이 오류는 스토리지 클래스 객체에서 참조하는 fileSystemId가 리전에 존재하지 않거나 올바르지 않음을 나타냅니다.

이 오류를 해결하려면 스토리지 클래스에서 참조하는 Amazon EFS 파일 시스템이 올바르고 리전에 존재하는지 확인하세요.

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

참고: 반드시 PVC_NAME을 PersistentVolumeClaim의 이름으로 바꿔야 합니다.

반환된 EFS 파일 시스템(fileSystemId)이 리전에 존재하지 않는 경우 Kubernetes 스토리지 클래스 객체를 삭제하세요. 그런 다음 fileSystemId 필드에 올바른 파일 시스템 ID를 포함하여 다시 생성하세요.

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>

이 오류는 제공된 IAM OIDC 자격 증명이 Amazon EKS 클러스터용 IAM에서 생성되지 않았음을 나타냅니다.

1.    클러스터의 OIDC 공급자 ID를 검색하고 변수에 저장합니다.

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

참고: CLUSTER_NAME을 클러스터의 이름으로 바꿔야 합니다.

2.    클러스터에 대한 IAM OIDC 자격 증명 공급자을 생성합니다.

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

참고: eksctl 유틸리티를 사용하여 IAM OIDC 공급자를 생성할 수 없는 경우 AWS Management Console을 사용하세요.

failed to provision volume with StorageClass "<STORAGE_CLASS_NAME>": rpc error: code = Unauthenticated desc = Access Denied. 올바른 AWS 권한이 있는지 확인하세요. 액세스가 거부되었습니다.

이 오류는 IRSA에 필요한 액세스 권한이 없음을 나타냅니다 (예: elasticfilesystem:CreateAccessPoint).

1.    EFS CSI 컨트롤러 배포에서 사용하는 서비스 계정을 검색합니다.

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

2.    서비스 계정에서 사용하는 IAM 역할을 찾습니다.

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

3.    GitHub에서 IAM 정책 문서를 다운로드합니다.

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

4.    IAM 정책이 없는 경우 IAM 정책을 생성합니다.

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

5.    이 IAM 정책을 EFS CSI 컨트롤러 배포에서 사용하는 서비스 계정으로 주석을 달고 이전에 검색한 IAM 역할에 연결합니다.

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

참고:

다음 명령을 실행하여 계정 ID를 검색할 수 있습니다.

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

다음 명령을 실행하여 IAM 역할을 검색할 수 있습니다.

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

다음 이유 중 하나로 인해 이 오류가 발생합니다.

  • IAM 권한 sts:AssumeRoleWithWebIdentity가 제공되지 않습니다.
  • IAM 역할에 첨부된 신뢰 관계 문서에 나열된 IAM OIDC ID 공급자가 올바르지 않습니다.
  • 언급된 Kubernetes 서비스 계정(예: system:serviceaccount:kube-system:efs-csi-controller-sa)이 EFS CSI 컨트롤러 배포에서 사용하는 계정과 일치하지 않습니다.

이 오류를 해결하려면 다음을 수행합니다.

1.    클러스터의 OIDC 공급자 ID를 검색하고 변수에 저장합니다.

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

CLUSTER_NAME을 클러스터의 이름으로 바꿔야 합니다.

2.    IAM OIDC 공급자 ID가 AWS 계정에 존재하는지 확인합니다.

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

3.    IAM 역할에 첨부된 신뢰 관계 문서를 검토합니다.

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

작업 sts:AssumeRoleWithWebIdentity가 허용되는지 확인하세요. 또한 IAM OIDC ID가 이전 명령에서 반환된 OIDC ID와 일치하는지 확인하세요.

참고:

다음 명령을 실행하여 IAM 역할을 검색할 수 있습니다.

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

관련 정보

서비스 계정의 IAM 역할

Amazon EFS CSI 드라이버

AWS 공식
AWS 공식업데이트됨 일 년 전