Table of Content
왜? 로컬에 따로 컨테이너 저장소를 만들까?
공개할 수 있는 이미지라면 도커허브를 최우선적으로 고려하면 되겠다. 다만 보안이 필요한 소스코드가 담긴 서비스 이미지라면 도커 허브에 올리는 경우 치명적일 수 있으니 다른 방법을 고려해야한다.
메이저 클라우드 서비스에서 제공하는 컨테이너 저장소를 사용해도 된다. 이름은 조금씩 다르지만 ECR, ACR, GCR을 사용하면 된다. 권한을 설정하는게 조금 귀찮기는 하지만 Stage나 Production 환경을 구축하는 당연히 해야할 일이고 자주 있는 일은 아니다.
다만 위와 같은 운영이 아닌 개발 과정에서 서비스를 컨테이너화 하여 쿠버네티스에서 제대로 동작하는지 확인하고 싶을 때가 있는데, 이 경우에도 메이저 클라우드에서 제공하는 저장소를 사용한다면 너무너무 귀찮을것 같다.(Push를 할때도 권한을 설정해야 하겠지만, 로컬 쿠버네티스 네에서도 권한을 설정해야 하므로…)
우리의 관심사는 오롯이 만들어진 서비스의 컨테이너가 K8s 클러스터에 프로비저닝 되었을 때 잘 동작하는지 확인하기 위해서다.(외부에서 혹은 내부 서비스에서 접근은 할 수 있는지 등등)
쿠버네티스에서 이미지를 받아오는 방법
그 전에 쿠버네티스에서 이미지를 받아오는 방법을 먼저 알아야 한다. 내 머리에서 나온게 아니라 Kubernetes 공식 문서에서 나온 사실이기 때문에 더 가치가 있을 것이다.
- 이미지는 레지스트리 호스트 이름을 포함할 수 있다.
- 이미지는 포트 번호도 포함할 수 있다.
- 레지스트리 호스트 이름을 지정하지 않으면, 쿠버네티스는 도커 퍼블릭 레지스트리를 의미한다고 가정한다.
:
따라서 같은 ubuntu 이미지라도 k8s는 이미지 태그가
- ubuntu 라고 쓰는 경우 도커 허브에서 이미지를 pull 하려 할 것이고
- localhost:5000/ubuntu라고 써있는 경우는 로컬호스트에서
- {container이름}.azurecr.io의 경우 Azure에서 다운 받으려고 할 것이다.
컨테이너 저장소 만들기
따라서 우리는 로컬에 컨테이너 저장소를 만들 필요가 있다. 도커 허브에 있는 registry 이미지(공식 이미지)를 사용할 것이다.
도커 허브에서 저장소 이미지를 받아서 서비스한다.
$ docker run -d -p 5000:5000 --restart always --name registry registry:2
$ docker ps
로 확인해보면 localhost:5000
으로 동작하고 있음을 알 수 있다.
$ docker ps
> CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9459b4c6f5f1 registry:2 "/entrypoint.sh /etc…" 6 seconds ago Up 5 seconds 0.0.0.0:5000->5000/tcp registry
프라이빗 이미지를 로컬 컨테이너 저장소에 푸쉬
이미지를 따로 준비하지 않고 기존에 사용하고 있는 이미지를 쓰기 위해서 개인적으로 도커허브에 올려놓은 asfrom30/echo-node
를 사용한다.(서비스를 컨테이너화 하였다면 해당 이미지를 사용하면 된다.)
$ docker pull asfrom30/echo-node
$ docker images | grep asfrom30/echo-node
> asfrom30/echo-node latest 0ac720a41cc2 2 months ago 944MB
태그 이름을 변경하고 푸쉬하면 된다.
$ docker tag asfrom30/echo-node localhost:5000/echo-node
$ docker images | grep echo-node
> asfrom30/echo-node latest 0ac720a41cc2 2 months ago 944MB
localhost:5000/echo-node latest 0ac720a41cc2 2 months ago 944MB
$ docker push
> docker push localhost:5000/echo-node
로컬 쿠버네티스가 로컬 컨테이너 저장소에서 이미지를 가져오는지 확인.
Yaml 파일에 아래와 같이 기술한다.
apiVersion: v1
kind: ReplicationController
metadata:
name: echo-node
spec:
replicas: 1
selector:
app: echo-node
template:
metadata:
name: echo-node
labels:
app: echo-node
spec:
containers:
- name: echo-node
image: localhost:5000/echo-node
ports:
- containerPort: 80
위에서 저장한 Yaml을 쿠버네티스에 적용한다.
$ kubectl apply -f ./replictaion-controller.yaml
> replicationcontroller/echo-node created
잘 되었으면 아래와 같이 Running
을 확인 할 수 있다.
$ kubectl get pods
> NAME READY STATUS RESTARTS AGE
echo-node-j7l2v 1/1 Running 1 83s
만약 이미지를 제대로 가져오지 못했다면
만약 이미지를 제대로 가져오지 못했다면 아래와 같은 ErrImagePull
에러가 발생할 것이다.
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
echo-node-2k775 0/1 ErrImagePull 0 6s