Amazon EKS와 관련된 Amazon ECR 문제를 해결하려면 어떻게 해야 하나요?
최종 업데이트 날짜: 2023년 1월 17일
Amazon Elastic Kubernetes Service(Amazon EKS)를 사용할 때 Amazon Elastic Container Registry(Amazon ECR)에서 이미지를 가져올 수 없습니다.
간략한 설명
Amazon ECR에서 이미지를 가져올 수 없는 이유는 다음과 같습니다.
- Amazon ECR 엔드포인트와 통신할 수 없습니다.
- 작업자 노드의 노드 인스턴스 역할에 적절한 권한이 없습니다.
- 인터페이스 VPC 엔드포인트를 생성하지 않았습니다.
이러한 문제를 해결하려면 사용 사례에 따라 다음 중 하나 이상을 수행합니다.
- 작업자 노드와 Amazon ECR 엔드포인트 사이의 통신 문제를 해결합니다.
- 작업자 노드의 노드 인스턴스 역할을 업데이트합니다.
- 리포지토리 정책이 올바른지 확인합니다.
- EKS가 다른 AWS 계정에 있는 경우 리포지토리 정책에서 액세스를 허용하는지 확인합니다.
- 인터페이스 VPC 엔드포인트를 생성합니다.
- AWS Fargate 실행 역할이 올바로 구성되었는지 확인합니다.
해결 방법
작업자 노드와 Amazon ECR 엔드포인트 간의 통신 문제 해결
작업자 노드가 Amazon ECR 엔드포인트와 통신할 수 없는 경우 다음 오류 메시지가 표시됩니다.
Failed to pull image "ACCOUNT.dkr.ecr.REGION.amazonaws.com/imagename:tag": rpc error: code = Unknown desc =
Error response from daemon: Get https://ACCOUNT.dkr.ecr.REGION.amazonaws.com/v2/: net/http:
request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
이 오류를 해결하려면 다음을 확인하세요.
- 작업자 노드의 서브넷에는 인터넷에 대한 경로가 있습니다. 서브넷과 연결된 라우팅 테이블을 확인합니다.
- 작업자 노드와 연결된 보안 그룹은 아웃바운드 인터넷 트래픽을 허용합니다.
- 네트워크 ACL(액세스 제어 목록)에 대한 수신 및 송신 규칙은 인터넷에 대한 액세스를 허용합니다.
작업자 노드의 인스턴스 IAM 역할 업데이트
작업자 노드의 인스턴스 AWS Identity and Access Management(IAM) 역할에 Amazon ECR에서 이미지를 가져오는 데 필요한 권한이 없다고 가정해 보겠습니다. 그러면 Amazon EKS 포드에서 다음과 같은 오류를 표시합니다.
Warning Failed 14s (x2 over 28s) kubelet, ip-000-000-000-000.us-west-2.compute.internalFailed to pull image "ACCOUNT.dkr.ecr.REGION.amazonaws.com/imagename:tag": rpc error: code = Unknown desc = Error response from daemon: Get https://ACCOUNT.dkr.ecr.REGION.amazonaws.com/v2/imagename/manifests/tag: no basic auth credentials
Warning Failed 14s (x2 over 28s) kubelet, ip-000-000-000-000.us-west-2.compute.internal Error: ErrImagePull
Normal BackOff 2s (x2 over 28s) kubelet, ip-000-000-000-000.us-west-2.compute.internal Back-off pulling image "ACCOUNT.dkr.ecr.REGION.amazonaws.com/imagename:tag"
Warning Failed 2s (x2 over 28s) kubelet, ip-000-000-000-000.us-west-2.compute.internal Error: ImagePullBackOff
이 오류를 해결하려면 작업자 노드가 AmazonEC2ContainerRegistryReadOnly AWS Identity and Access Management(IAM) 관리형 정책을 사용하는지 확인하세요. 또는 작업자 노드의 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스 프로파일을 다음 IAM 권한으로 업데이트합니다.
"ecr:GetAuthorizationToken",
"ecr:BatchCheckLayerAvailability",
"ecr:GetDownloadUrlForLayer",
"ecr:GetRepositoryPolicy",
"ecr:DescribeRepositories",
"ecr:ListImages",
"ecr:DescribeImages",
"ecr:BatchGetImage",
"ecr:GetLifecyclePolicy",
"ecr:GetLifecyclePolicyPreview",
"ecr:ListTagsForResource",
"ecr:DescribeImageScanFindings"
중요: 중복 정책을 생성하는 대신 AmazonEC2ContainerRegistryReadOnly 정책을 사용하는 것이 좋습니다.
업데이트된 인스턴스 IAM 역할은 작업자 노드에 Amazon ECR에 액세스하고 kubelet을 통해 이미지를 가져올 수 있는 권한을 부여합니다. kubelet은 Amazon ECR 자격 증명을 가져오고 주기적으로 새로 고치는 작업을 담당합니다. 자세한 내용은 Kubernetes 이미지(Kubernetes 웹사이트)를 참고하세요.
리포지토리 정책이 올바른지 확인
리포지토리 정책은 개별 Amazon ECR 리포지토리에 대한 액세스를 제어하는 IAM 정책의 하위 집합입니다. IAM 정책은 일반적으로 전체 Amazon ECR 서비스에 대한 권한을 적용하는 데 사용되지만, 특정 리소스에 대한 액세스도 제어할 수 있습니다.
1. 기본 계정에 대한 Amazon ECR 콘솔을 엽니다.
2. ECR 리포지토리가 포함된 AWS 리전으로 이동합니다.
3. 탐색 창에서 [Repositories(리포지토리)]를 선택한 다음 확인하려는 리포지토리를 선택합니다.
4. 탐색 창에서 Permissions(권한)를 선택한 다음 리포지토리에 올바른 권한이 있는지 확인합니다.
이 예시 정책에서는 특정 IAM 사용자가 리포지토리 및 리포지토리 내 이미지를 설명하도록 허용합니다.
{
"Version": "2008-10-17",
"Statement": [
{
"Sid": "ECR Repository Policy",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:user/MyUsername"
},
"Action": [
"ecr:DescribeImages",
"ecr:DescribeRepositories"
]
}
]
}
EKS가 다른 AWS 계정에 있는 경우 리포지토리 정책에서 액세스를 허용하는지 확인합니다.
다른 AWS 계정의 컨테이너 이미지에 액세스할 수 없는 경우 다음 오류가 발생하며 kubelet이 실패합니다.
Failed to pull image "cross-aws-account-id:.dkr.ecr.REGION.amazonaws.com/repo-name:image-tag": rpc error: code = Unknown desc = Error response from daemon: pull access denied for arn:aws:ecr:REGION:cross-aws-account-id:repository/repo-name, repository does not exist or may require 'docker login': denied: User: arn:aws:sts::<aws-account-containing-eks-cluster>:assumed-role/<node-instance-role-for-worker-node is not authorized to perform: ecr:BatchGetImage on resource: arn:aws:ecr:REGION:cross-aws-account-id:repository/repo-name
다음 예제 정책은 한 AWS 계정의 인스턴스 IAM 역할이 다른 AWS 계정의 ECR 리포지토리에서 컨테이너 이미지를 설명하고 가져올 수 있도록 허용합니다.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:role/eksctl-cross-account-ecr-access-n-NodeInstanceRole"
},
"Action": [
"ecr:GetAuthorizationToken",
"ecr:BatchCheckLayerAvailability",
"ecr:GetDownloadUrlForLayer",
"ecr:GetRepositoryPolicy",
"ecr:DescribeRepositories",
"ecr:ListImages",
"ecr:DescribeImages",
"ecr:BatchGetImage",
"ecr:GetLifecyclePolicy",
"ecr:GetLifecyclePolicyPreview",
"ecr:ListTagsForResource",
"ecr:DescribeImageScanFindings"
],
"Resource": "*"
}
]
}
참고: 인스턴스 프로파일 ARN이 아닌 ECR 정책에서 인스턴스 IAM 역할의 ARN을 사용하십시오.
인터페이스 VPC 엔드포인트 생성
Amazon ECR에서 이미지를 가져오려면 인터페이스 VPC 엔드포인트를 구성해야 합니다. Amazon ECR 인터페이스 VPC 엔드포인트(AWS PrivateLink)의 Amazon ECS용 VPC 엔드포인트 생성 섹션을 참조하세요.
Fargate 포드 실행 역할이 올바로 구성되었는지 확인
Amazon 호스팅 리포지토리에서 이미지를 가져올 때 Fargate CoreDNS 포드가 ImagePullBackOff 상태에서 움직이지 않으면 다음과 같은 오류 메시지가 표시됩니다.
Warning Failed 27s (x2 over 40s) kubelet Failed to pull image "151284513677.dkr.ecr.eu-central-1.amazonaws.com/coredns:latest ": rpc error: code = Unknown desc = failed to pull and unpack image "151284513677.dkr.ecr.eu-central-1.amazonaws.com/coredns:latest ": failed to resolve reference "151284513677.dkr.ecr.eu-central-1.amazonaws.com/coredns:latest ": pulling from host 151284513677.dkr.ecr.eu-central-1.amazonaws.com failed with status code [manifests latest]: 401 Unauthorized
이 오류를 해결하려면 Fargate 포드 실행 역할이 AmazonEKSFargatePodExecutionRolePolicy를 사용하도록 설정해야 합니다. 해당 역할에 다음과 비슷한 신뢰 정책도 연결되어 있어야 합니다.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Condition": {
"ArnLike": {
"aws:SourceArn": "arn:aws:eks:example-region:1111222233334444:fargateprofile/example-cluster/*"
}
},
"Principal": {
"Service": "eks-fargate-pods.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
참고:
정책에서 다음 항목을 바꿔야 합니다.
- example-region을 AWS 리전 이름으로
- 1111222233334444를 계정 번호로
- example-cluster를 클러스터 이름으로