프라이빗 레지스트리에서 이미지 받아오기
이 페이지는 프라이빗 컨테이너 레지스트리나 리포지터리로부터 이미지를 받아오기 위해 시크릿(Secret)을 사용하는 파드를 생성하는 방법을 보여준다. 현재 많은 곳에서 프라이빗 레지스트리가 사용되고 있다. 여기서는 예시 레지스트리로 Docker Hub을 사용한다.
시작하기 전에
-
쿠버네티스 클러스터가 필요하고, kubectl 커맨드-라인 툴이 클러스터와 통신할 수 있도록 설정되어 있어야 한다. 이 튜토리얼은 컨트롤 플레인 호스트가 아닌 노드가 적어도 2개 포함된 클러스터에서 실행하는 것을 추천한다. 만약, 아직 클러스터를 가지고 있지 않다면, minikube를 사용해서 생성하거나 다음의 쿠버네티스 플레이그라운드 중 하나를 사용할 수 있다.
-
이 실습을 수행하기 위해,
docker
명령줄 도구와 도커 ID 및 비밀번호가 필요하다. -
다른 프라이빗 컨테이너 레지스트리를 사용하는 경우, 해당 레지스트리를 위한 명령줄 도구 및 레지스트리 로그인 정보가 필요하다.
도커 허브 로그인
노트북에 프라이빗 이미지를 받아오기 위하여 레지스트리 인증을 필수로 수행해야 한다.
docker
도구를 사용하여 도커 허브에 로그인한다. 자세한 정보는
도커 ID 계정의 로그 인 섹션을 참조한다.
docker login
프롬프트가 나타나면, 도커 ID를 입력한 다음, 사용하려는 자격증명(액세스 토큰, 또는 도커 ID의 비밀번호)을 입력한다.
로그인 프로세스를 수행하면 권한 토큰 정보를 가지고 있는 config.json
파일이 생성되거나 업데이트된다. 쿠버네티스가 이 파일을 어떻게 해석하는지 참고한다.
config.json
파일을 확인하자.
cat ~/.docker/config.json
하단과 유사한 결과를 확인할 수 있다.
{
"auths": {
"https://index.docker.io/v1/": {
"auth": "c3R...zE2"
}
}
}
auth
항목이 아닌, 저장소의 이름을 값으로 사용하는 credsStore
항목을 확인할 수 있다.
기존의 자격 증명을 기반으로 시크릿 생성하기
쿠버네티스 클러스터는 프라이빗 이미지를 받아올 때, 컨테이너 레지스트리에 인증하기 위하여
kubernetes.io/dockerconfigjson
타입의 시크릿을 사용한다.
만약 이미 docker login
을 수행하였다면,
이 때 생성된 자격 증명을 쿠버네티스 클러스터로 복사할 수 있다.
kubectl create secret generic regcred \
--from-file=.dockerconfigjson=<path/to/.docker/config.json> \
--type=kubernetes.io/dockerconfigjson
오브젝트에 대한 더 세밀한 제어(새로운 시크릿에 대한 네임스페이스나 레이블을 지정하는 등)가 필요할 경우, 시크릿을 사용자 정의한 후에 저장할 수도 있다. 다음을 확인하자.
- 데이터 항목의 이름을
.dockerconfigjson
으로 설정한다 - 도커 구성 파일을 base64로 인코딩하고 그 문자열을
data[".dockerconfigjson"]
필드에 자르지 않고 한 줄로 이어서 붙여넣는다 type
을kubernetes.io/dockerconfigjson
으로 설정한다
예:
apiVersion: v1
kind: Secret
metadata:
name: myregistrykey
namespace: awesomeapps
data:
.dockerconfigjson: UmVhbGx5IHJlYWxseSByZWVlZWVlZWVlZWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGx5eXl5eXl5eXl5eXl5eXl5eXl5eSBsbGxsbGxsbGxsbGxsbG9vb29vb29vb29vb29vb29vb29vb29vb29vb25ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubmdnZ2dnZ2dnZ2dnZ2dnZ2dnZ2cgYXV0aCBrZXlzCg==
type: kubernetes.io/dockerconfigjson
만약 error: no objects passed to create
메세지가 출력될 경우, base64로 인코딩된 문자열이 유효하지 않음을 의미한다.
또한 Secret "myregistrykey" is invalid: data[.dockerconfigjson]: invalid value ...
메세지가 출력될 경우,
base64로 인코딩된 문자열이 정상적으로 디코딩되었으나, .docker/config.json
파일로 파싱되지 못한 것을 의미한다.
커맨드 라인에서 자격 증명을 통하여 시크릿 생성하기
regcred
라는 이름의 시크릿을 생성하자.
kubectl create secret docker-registry regcred --docker-server=<your-registry-server> --docker-username=<your-name> --docker-password=<your-pword> --docker-email=<your-email>
아래의 각 항목에 대한 설명을 참고한다.
<your-registry-server>
은 프라이빗 도커 저장소의 FQDN 주소이다. 도커허브(DockerHub)는https://index.docker.io/v1/
를 사용한다.<your-name>
은 도커 사용자의 계정이다.<your-pword>
은 도커 사용자의 비밀번호이다.<your-email>
은 도커 사용자의 이메일 주소이다.
이를 통해 regcred
라는 시크릿으로 클러스터 내에서 도커 자격 증명을 생성했다.
kubectl
이 구동 중인 동안 사용자의 PC의 다른 사용자들에게
보일 수도 있다.
시크릿 regcred
검증하기
방금 생성한 regcred
시크릿의 내용을 확인하기 위하여, YAML 형식으로 시크릿을 확인하자.
kubectl get secret regcred --output=yaml
결과는 다음과 같다.
apiVersion: v1
kind: Secret
metadata:
...
name: regcred
...
data:
.dockerconfigjson: eyJodHRwczovL2luZGV4L ... J0QUl6RTIifX0=
type: kubernetes.io/dockerconfigjson
.dockerconfigjson
필드의 값은 도커 자격 증명의 base64 인코딩 결과이다.
.dockerconfigjson
필드의 값을 확인하기 위하여, 시크릿 데이터를 읽을 수 있는
형식으로 변경한다.
kubectl get secret regcred --output="jsonpath={.data.\.dockerconfigjson}" | base64 --decode
결과는 다음과 같다.
{"auths":{"your.private.registry.example.com":{"username":"janedoe","password":"xxxxxxxxxxx","email":"jdoe@example.com","auth":"c3R...zE2"}}}
auth
필드의 값을 확인하기 위하여, base64로 인코딩된 데이터를 읽을 수 있는 형식으로 변경한다.
echo "c3R...zE2" | base64 --decode
결과로, 사용자 이름과 비밀번호가 :
로 연결되어 아래와 같이 표현된다.
janedoe:xxxxxxxxxxx
참고로 시크릿 데이터에는 사용자의 로컬에 있는 ~/.docker/config.json
파일과 유사한 인증 토큰이 포함되어 있다.
이를 통해 regcred
라는 시크릿으로 클러스터 내에서 도커 자격 증명을 생성했다.
시크릿을 사용하는 파드 생성하기
다음은 regcred
에 있는 도커 자격 증명에 접근해야 하는 예제 파드의 매니페스트이다.
apiVersion: v1
kind: Pod
metadata:
name: private-reg
spec:
containers:
- name: private-reg-container
image: <your-private-image>
imagePullSecrets:
- name: regcred
위 파일을 컴퓨터에 다운로드한다.
curl -L -O my-private-reg-pod.yaml https://k8s.io/examples/pods/private-reg-pod.yaml
my-private-reg-pod.yaml
파일 안에서, <your-private-image>
값을 다음과 같은 프라이빗 저장소 안의 이미지 경로로 변경한다.
your.private.registry.example.com/janedoe/jdoe-private:v1
프라이빗 저장소에서 이미지를 받아오기 위하여, 쿠버네티스에서 자격 증명이 필요하다.
구성 파일의 imagePullSecrets
필드를 통해 쿠버네티스가
regcred
라는 시크릿으로부터 자격 증명을 가져올 수 있다.
시크릿을 사용해서 파드를 생성하고, 파드가 실행되는지 확인하자.
kubectl apply -f my-private-reg-pod.yaml
kubectl get pod private-reg
다음 내용
- 시크릿에 대해 더 배워 보기
- 프라이빗 레지스트리 사용에 대해 더 배워 보기.
- 서비스 어카운트에 풀 시크릿(pull secret) 추가하기에 대해 더 배워 보기.
- kubectl create secret docker-registry에 대해 읽어보기.
- 파드의 컨테이너 정의의
imagePullSecrets
필드에 대해 읽어보기
Items on this page refer to third party products or projects that provide functionality required by Kubernetes. The Kubernetes project authors aren't responsible for those third-party products or projects. See the CNCF website guidelines for more details.
You should read the content guide before proposing a change that adds an extra third-party link.