backend

쿠버네티스에서 로컬 이미지 사용하기: Running local docker image in kubernetes

seul chan 2020. 3. 20. 08:52
  • Minikube는 우선적으로 docker image를 pull 해 와서 사용한다. 하지만 보통 개발 공부를 하다 보면 로컬에서 빌드 된 이미지를 사용하여 minikube pod에 띄우는 경우가 많은데, 이런 경우에 image를 찾을 수 없다는 다음 에러를 만나게 된다
  • (사실 tutorial을 잘 따라하였다면 이런 문제를 만나지 않겠지만) 혹시 비슷한 문제를 겪는 분들을 위해 기록해둔다
$ docker build -t <image>:<tag> .
$ kubectl run --image=<image>:<tag>

Failed to pull image "<image_name>": rpc error: code = Unknown desc = Error response from daemon: pull access denied for cms, repository does not exist or may require 'docker login': denied: requested access to the resource is denied 
  • 요약하자면, 해당 문제는 쿠버네티스 pod에서 사용하는 docker 환경에서 이미지가 빌드되지 않고 로컬 환경에서 빌드되어 해당 이미지를 찾지 못해 생기는 문제이다.
  • 로컬에서 도커 이미지를 확인해보자
# minikube 시작
$ minikube start

# 로컬 도커 이미지 목록 확인
$ docker images
...(로컬 도커 이미지 목록)

# 미니쿠베 쉘 접속
$ minikube ssh

                         _             _
            _         _ ( )           ( )
  ___ ___  (_)  ___  (_)| |/')  _   _ | |_      __
/' _ ` _ `\| |/' _ `\| || , <  ( ) ( )| '_`\  /'__`\
| ( ) ( ) || || ( ) || || |\`\ | (_) || |_) )(  ___/
(_) (_) (_)(_)(_) (_)(_)(_) (_)`\___/'(_,__/'`\____)

# 미니쿠베 내 도커 이미지 목록
# 위에서 확인한 도커 이미지와는 전혀 별개의 환경임을 알 수 있다.
$ docker images
REPOSITORY                                TAG                 IMAGE ID            CREATED             SIZE
cms                                       0.1.0               5e53a1d7f1ad        6 hours ago         1.06GB
k8s.gcr.io/kube-proxy                     v1.17.3             ae853e93800d        4 weeks ago         116MB
k8s.gcr.io/kube-controller-manager        v1.17.3             b0f1517c1f4b        4 weeks ago         161MB
k8s.gcr.io/kube-apiserver                 v1.17.3             90d27391b780        4 weeks ago         171MB
k8s.gcr.io/kube-scheduler                 v1.17.3             d109c0821a2b        4 weeks ago         94.4MB
kubernetesui/dashboard                    v2.0.0-beta8        eb51a3597525        3 months ago        90.8MB
k8s.gcr.io/coredns                        1.6.5               70f311871ae1        4 months ago        41.6MB
kindest/kindnetd                          0.5.3               aa67fec7d7ef        4 months ago        78.5MB
k8s.gcr.io/etcd                           3.4.3-0             303ce5db0e90        4 months ago        288MB
kubernetesui/metrics-scraper              v1.0.2              3b08661dc379        4 months ago        40.1MB
python                                    3.7.3               34a518642c76        9 months ago        929MB
k8s.gcr.io/pause                          3.1                 da86e6ba6ca1        2 years ago         742kB
gcr.io/k8s-minikube/storage-provisioner   v1.8.1              4689081edb10        2 years ago         80.8MB

위 문제를 해결하기 위해 docker env를 minikube로 설정해 준다.

$ eval $(minikube docker-env)

다시 확인해 보면 위의 kube에서 확인했던 이미지와 동일한 이미지를 볼 수 있다.

$ docker images
REPOSITORY                                TAG                 IMAGE ID            CREATED             SIZE
cms                                       0.1.0               5e53a1d7f1ad        6 hours ago         1.06GB
k8s.gcr.io/kube-proxy                     v1.17.3             ae853e93800d        4 weeks ago         116MB
k8s.gcr.io/kube-controller-manager        v1.17.3             b0f1517c1f4b        4 weeks ago         161MB
k8s.gcr.io/kube-apiserver                 v1.17.3             90d27391b780        4 weeks ago         171MB
k8s.gcr.io/kube-scheduler                 v1.17.3             d109c0821a2b        4 weeks ago         94.4MB
kubernetesui/dashboard                    v2.0.0-beta8        eb51a3597525        3 months ago        90.8MB
k8s.gcr.io/coredns                        1.6.5               70f311871ae1        4 months ago        41.6MB
kindest/kindnetd                          0.5.3               aa67fec7d7ef        4 months ago        78.5MB
k8s.gcr.io/etcd                           3.4.3-0             303ce5db0e90        4 months ago        288MB
kubernetesui/metrics-scraper              v1.0.2              3b08661dc379        4 months ago        40.1MB
python                                    3.7.3               34a518642c76        9 months ago        929MB
k8s.gcr.io/pause                          3.1                 da86e6ba6ca1        2 years ago         742kB
gcr.io/k8s-minikube/storage-provisioner   v1.8.1              4689081edb10        2 years ago         80.8MB

이제 해당 쉘에서 이미지를 빌드하면 kube 도커 환경에서 빌드가 된다.

$ docker build -t <image>:<tag> .

$ kubectl run --image=<image>:<tag>

그래도 잘 되지 않는다면 --image-pull-policy=Never 옵션과 함께 사용해보자

$ kubectl run --image=<image>:<tag> --image-pull-policy=Never