나는 ArgoCD를 통해 내 로컬에 Minikube 클러스터 환경이 구성되도록 만들었다. 그리고 Dockerhub Public image를 가져오던 기존방식에서 AWS ECR의 image를 pull 하는 방식으로 바꿔보았고, 이 과정에서 발생한 문제에 대해 알게된 원인과 해결방법을 기록해보았다.
기존 공식문서에서 제공하고있는 ECR 로그인 자격증명 생성 명령어는 다음과 같다.
aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin {AWS Account ID}.dkr.ecr.ap-northeast-2.amazonaws.com
그러나 이를 활용해도 에러 내용에는 변함이 없었다. 처음 확인했던 방법으로는 위 내용을 입력하면 ~/.aws/config 파일 내용이 갱신된다고 한다. 그래서 이 내용을 통해 Kubernetes Secret을 생성하라고 하는데, 갱신되는 내용 자체가 없었다. 두번째로 알게된 방법이 그나마 해결될 수 있었고 그 방법은 다음과 같다. (Secret을 생성한다는 점은 동일하다)
해결방법
kubectl create secret docker-registry ecr-registry \
--docker-server=https://{AWS Account ID}.dkr.ecr.ap-northeast-2.amazonaws.com \
--docker-username=AWS \
--docker-password=$(aws ecr get-login-password) \
--docker-email={Email정보}
# 시크릿 생성 확인
kubectl get secret
# Deployment 재시작
설명
AWS ECR에서 이미지를 Pull 하기 위해서 AWS의 자격증명을 Kubernetes 시크릿으로 저장해야한다.
kubectl create secret docker-registry: 위 패스워드를 Kubernetes 시크릿으로 생성.--docker-server: Amazon ECR의 레포지토리 주소를 전체 포함하지 않고, ECR 서비스의 베이스 URL만 포함해야 한다. 즉, 개별 이미지의 주소나 프로젝트 디렉토리 경로를 포함하지 않는 것이 일반적. AWS ECR 레포지토리를 가리키는 베이스 URL이며, 여기에 개별 이미지나 프로젝트 폴더를 추가하지 않는다.--docker-email:용자 이메일 주소는 시크릿 생성에 필요하지 않으나 오류를 방지하기 위해 제공될 수 있다.aws ecr get-login-password: ECR 로그인 패스워드 획득. 서브쉘($(...))을 사용하여aws ecr get-login-password명령의 출력을--docker-password옵션의 인자로 바로 전달하는 방식이다.