로컬 쿠버네티스를 위한 로컬 컨테이너 저장소 만들기

Table of Content

왜? 로컬에 따로 컨테이너 저장소를 만들까?

공개할 수 있는 이미지라면 도커허브를 최우선적으로 고려하면 되겠다. 다만 보안이 필요한 소스코드가 담긴 서비스 이미지라면 도커 허브에 올리는 경우 치명적일 수 있으니 다른 방법을 고려해야한다.

메이저 클라우드 서비스에서 제공하는 컨테이너 저장소를 사용해도 된다. 이름은 조금씩 다르지만 ECR, ACR, GCR을 사용하면 된다. 권한을 설정하는게 조금 귀찮기는 하지만 Stage나 Production 환경을 구축하는 당연히 해야할 일이고 자주 있는 일은 아니다.

다만 위와 같은 운영이 아닌 개발 과정에서 서비스를 컨테이너화 하여 쿠버네티스에서 제대로 동작하는지 확인하고 싶을 때가 있는데, 이 경우에도 메이저 클라우드에서 제공하는 저장소를 사용한다면 너무너무 귀찮을것 같다.(Push를 할때도 권한을 설정해야 하겠지만, 로컬 쿠버네티스 네에서도 권한을 설정해야 하므로…)

우리의 관심사는 오롯이 만들어진 서비스의 컨테이너가 K8s 클러스터에 프로비저닝 되었을 때 잘 동작하는지 확인하기 위해서다.(외부에서 혹은 내부 서비스에서 접근은 할 수 있는지 등등)

쿠버네티스에서 이미지를 받아오는 방법

그 전에 쿠버네티스에서 이미지를 받아오는 방법을 먼저 알아야 한다. 내 머리에서 나온게 아니라 Kubernetes 공식 문서에서 나온 사실이기 때문에 더 가치가 있을 것이다.

Link

:

따라서 같은 ubuntu 이미지라도 k8s는 이미지 태그가

컨테이너 저장소 만들기

따라서 우리는 로컬에 컨테이너 저장소를 만들 필요가 있다. 도커 허브에 있는 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