Docker Hub 에 있는 이미지가 아닌 사내, 혹은 서비스에서 제공하는 Container Registry 를 사용 할 경우 보통은 암호가 설정되어 있다.
암호가 설정 된 Registry 는 Docker 환경에선 docker login {레지스트리 주소} 명령어로 로그인하여 사용할 수 있으나, Kubernetes 환경에서는 모든 노드에서 로그인을 해 주기는 어렵다.
이 때, Kubernetes 의 Secret 이라는 리소스를 통해 클러스터 내에 레지스트리의 계정을 공유할 수 있다.
아래와 같이 설정하여 Registry 에 쓸 Secret 을 생성할 수 있다.
# regcred 라는 이름을 가진 dockerconfigjson 타입의 Secret 을 생성하는 명령어
kubectl create secret \
docker-registry regcred \
-n <namespace> \
--docker-server=<your-registry-server> \
--docker-username=<your-name> \
--docker-password=<your-pword> \
--docker-email=<your-email>
만약 docker login 명령어로 로그인 했던 적이 있다면 docker login 정보가 담긴 config.json 파일을 이용해서 생성 할 수도 있다. 이 파일은 여러 Registry 의 Credential 을 가질 수 있다. (여러 Registry 를 한번에 지원할 수 있다.)
# regcred 라는 이름을 가진 dockerconfigjson 타입의 Secret 을 파일을 사용하여 생성하는 명령어
# 보통 사용자의 기본 디렉터리 아래 .docker/config.json 에 존재한다 (~/.docker/config.json)
kubectl create secret generic regcred \
--from-file=.dockerconfigjson=<path/to/.docker/config.json> \
--type=kubernetes.io/dockerconfigjson
만약 YAML 파일로 사용하고 싶다면 아래와 같이 작성하면 된다.
# awesomeapps 네임스페이스 안에 regcred 라는 이름의 dockerconfigjson Secret 을 정의
apiVersion: v1
kind: Secret
metadata:
name: regcred
namespace: awesomeapps
data:
# 이 텍스트는 config.json 을 base64 로 인코딩한 데이터이다.
.dockerconfigjson: ewoJImF1dGhzIjogewoJCSIxNzIuMzAuMS43MCI6IHsKCQkJImF1dGgiOiAiYTJ0d1lYSnJPa0ZCY1d0eWNuVmtjbUl4SVE9PSIKCQl9Cgl9Cn0=
type: kubernetes.io/dockerconfigjson
apiVersion: v1
kind: Pod
metadata:
# Secret 과 Pod 는 같은 Namespace 에 있어야 한다
name: private-reg
spec:
containers:
- name: private-reg-container
image: <your-private-image>
# Pod spec 에 아래와 같이 지정한다
imagePullSecrets:
- name: regcred
Docker 는 기본적으로 HTTPS 를 사용하여 Registry 와 통신한다. 만약 사내 Registry 나 직접 실행한 Registry 에 HTTPS 를 적용하지 않았다면 해당 저장소를 이용할 수 없다.
이때, 아래 방법을 사용하면 HTTP 저장소를 Docker 나 Kubernetes 의 Worker Node 에서 사용할 수 있다.
만약 Kubernetes 에서 아래 방법을 사용한다면 모든 노드에 해당 설정을 적용해야 한다.
/etc/docker/daemon.json 파일을 열어 아래와 같이 입력한다. 없으면 생성한다.
{
"insecure-registries": [
"<YOUR-INSECURE-REGISTRY-WITHOUT-SCHEME>",
"172.30.1.70"
]
}
만약 이미 다른 데이터가 있다면 아래와 같이 적절하게 합친다.
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2",
"insecure-registries": [
"<YOUR-INSECURE-REGISTRY-WITHOUT-SCHEME>",
"172.30.1.70"
]
}