Work/개발 노트

[k8s] Image Pull 실행 시 ECR 로그인 적용하기

★용호★ 2020. 9. 26. 02:55

여러 팀과 함께 서비스를 운영하다보면 현재 사용 중인 서버가 속한 AWS Account 외에 다른 Account의 ECR에 존재하는 컨테이너 이미지를 Pull 받아야하는 경우가 있다. 이 때 해당 Account에서 ECR의 read only 권한을 가진 IAM User의 Access Key를 사용하여 로그인을 수행한 후 컨테이너 이미지를 Pull 받을 수 있다.

 

먼저 ~/.aws/credentials 파일에 default 또는 별도 profile을 지정하여 Access Key를 등록한다.

 

[ecr-readonly]
aws_access_key_id = <Access Key>
aws_secret_access_key = <Secret Key>

 

다음 명령으로 ECR에 로그인 한다.

 

aws ecr get-login-password --region ap-northeast-2 --profile ecr-readonly | docker login --username AWS --password-stdin <ACCOUNT ID>.dkr.ecr.ap-northeast-2.amazonaws.com

 

로그인에 성공하면 아래와 같이 ~/.docker/config.json 파일에 로그인 정보가 기록된다.

 

{
	"auths": {
		"354304228313.dkr.ecr.ap-northeast-2.amazonaws.com": {
			"auth": "인증토큰"
		}
	},
	"HttpHeaders": {
		"User-Agent": "Docker-Client/19.03.13 (linux)"
	}
}

 

Kubernetes에서는 위에서 진행한 Docker Login의 인증 정보를 사용하여 Private Registry로부터 컨테이너 이미지를 Pull 받기 위해 Secret을 사용한다. 아래와 같이 Secret을 생성한다.

 

kubectl create secret generic regcred \
    --from-file=.dockerconfigjson=~/.docker/config.json \
    --type=kubernetes.io/dockerconfigjson

 

Secret이 정상적으로 생성되면 아래와 같이 Deployment 또는 Pod manifest의 imagePullSecrets에 설정하여 Private Registry의 컨테이너 이미지를 Pull 할 수 있게 된다.

 

apiVersion: v1
kind: Pod
metadata:
  name: private-reg
spec:
  containers:
  - name: private-reg-container
    image: <your-private-image>
  imagePullSecrets:
  - name: regcred

 

대다수의 컨테이너 이미지가 해당 인증 정보를 사용한다면 매번 imagePullSecrets을 설정하는 것이 번거로울 수 있다. 이 때는 Kubernetes의 서비스 어카운트에 imagePullSecrets를 설정하여 기본으로 해당 인증정보를 사용하도록 설정하면 편리하다.

이를 위해 먼저 현재 서비스 어카운트 정보를 확인한다.

 

kubectl get sa

 

현재 사용 중인 서비스 어카운트를 수정한다. (여기서는 서비스 어카운트명이 default)

 

kubectl edit sa default

 

아래와 같이 수정한다.

 

apiVersion: v1
kind: ServiceAccount
metadata:
  creationTimestamp: 2015-08-07T22:02:39Z
  name: default
  namespace: default
  uid: 052fb0f4-3d50-11e5-b066-42010af0d7b6
secrets:
- name: default-token-uudge
imagePullSecrets:
- name: regcred

 

 

이 후 부터는 Deployment 나 Pod에 imagePullSecrets 설정 없이 기본으로 해당 인증을 사용할 수 있다.