티스토리 뷰

728x90

docker hub와 같은 public 저장소에 docker image를 저장하지 못하는 경우가 있다. 대부분 사설 저장소를 사용하겠지만...나는 로컬이미지를 사용하고 싶었다. 이럴 때는 로컬 이미지를 tar 파일로 변환하여 컨테이너를 실행 시킬 서버에서 tar 파일을 다시 image로 변경한다.

 

docker image -> tar 변경

- 예시에서는 test:0.1 이미지를 test-0.1.tar 파일로 저장한다.

$ docker save -o [파일명] [이미지명]

예) docker save -o C:\Users\injeong\Desktop\test-0.1.tar test:0.1

tar -> docker image 변경

$ docker load -i [파일명]

예) docker load -i /home/ubuntu/test-0.1.tar

 

이미지 확인

$ docker images

 

 

 

그럼 나는 로컬에 이미지를 만들었으니까 바로 파드를 만들 수 있을까? 정답은 🙅‍♀️

 

쿠버네티스는 containerd를 runtime으로 사용하기 때문에 도커 이미지를 인식 할 수 없다.

아래처럼 test.yaml 파일을 만들고 파드를 생성 할 때 이미지 정책을 설정 하지 않고 pod를 그대로 만드는 경우에는 ImagePullBackOff 에러가, 이미지 정책을 Never로 놓고 만드는 경우에는 ErrImageNeverPull 에러가 발생한다.

 

[참고] kubernetes image pulling policy

https://kubernetes.io/docs/concepts/containers/images/

 

Images

A container image represents binary data that encapsulates an application and all its software dependencies. Container images are executable software bundles that can run standalone and that make very well defined assumptions about their runtime environmen

kubernetes.io

 

- IfNotPresent : 로컬에 이미지가 존재하지 않는 경우에만 이미지를 저장소에서 다운로드한다.

- Always : 항상 이미지를 저장소에서 다운로드 받는다.

- Never : 로컬에 존재하는 이미지를 사용한다.

 

test.yaml 생성

apiVersion: v1
kind: Pod
metadata:
  name: test
  labels:
    app: test
spec:
  containers:
    - name: test
      image: test:0.1
      imagePullPolicy: Never

 

파드 생성

kubectl apply -f test.yaml

 

파드 내용 확인하기

kubectl describe pod [파드명]

예) kubectl describe pod test

좌 :  ImagePullBackOff  우 :  ErrImageNeverPull 

 

 

그럼 쿠버네티스가 내 로컬에 있는 이미지를 활용해서 파드를 만들기 위해서는 어떻게 해야할까?

 

docker image를 containerd image로 변경 해주는 작업이 필요하다.

이때, 주의 할 점은 containerd는 namespace가 존재한다는 것이다.

기본은 default 이며, 쿠버네티스는 namespace k8s.io를 사용한다.

따라서, 우리는 k8s.io 네임스페이스에 이미지를 import 시켜줘야한다. default에 이미지를 import 하는 경우에는 쿠버네티스가 사용 할 수 없기 때문에 ImagePullBackOff 혹은 ErrImageNeverPull 가 발생한다.

 

tar -> containerd image로 변경

1. Containerd 네임스페이스 확인

- containerd가 기본적으로 사용하는 GRCP는 /run/containerd/containerd.sock 이다.

- 나는 rancher를 사용하여 쿠버네티스를 설치하여 GRCP가 /run/k3s/containerd/containerd.sock 에 생성되서 -a 옵션을 사용하여 명시해줬다. -> 환경 변수를 통해 변경해줄 수 있다.

 

[변경방법] 해당 방법은 임시적인 방법이다.

export CONTAINERD_ADDRESS=[containerd.sock경로]
export CONTAINERD_ADDRESS=/run/k3s/containerd/containerd.sock

 

- namespce k8s.io를 확인 할 수 있다.

$ ctr namespace ls
$ ctr -a /run/k3s/containerd/containerd.sock namespace ls

 

2. tar-> Containerd image를 k8s.io 네임스페이스로 가져오기

$ ctr --namespace k8s.io image import [이미지명.tar]
$ ctr -a /run/k3s/containerd/containerd.sock --namespace k8s.io image import [이미지명.tar]

 

 

3. k8s.io 네임스페이스에서 사용가능한 이미지 확인

- docker.io/library/test:0.1 이미지를 확인 할 수 있다.

$ ctr -a /run/k3s/containerd/containerd.sock --namespace k8s.io images ls | grep test:0.1

 

 

[주의점] 모든 node에 이미지가 존재해야한다.

- repository를 사용하는 경우 쿠버네티스가 알아서 repo에서 이미지를 다운받아 오지만, 이 경우는 이미지를 직접 넣어주기 때문에, pod가 실행 될 수 있는 모든 node에 이미지가 존재해야한다. 모든 node에서 image를 import 해주자.

 

이제 로컬 이미지를 사용하여 파드를 생성할 수 있다.

다시 한번 test.yaml을 실행시켜주면 정상적으로 파드가 실행 된 것을 확인 할 수 있다.

 

파드 만들기

$ kubectl apply -f [yaml 파일]

예) kubectl apply -f /home/ubuntu/test.yaml

 

파드 확인하기

$ kubectl describe pod [파드명]

예) kubectl describe pod test

https://github.com/kubernetes-sigs/cri-tools/issues/546

 

Crictl not support load images? · Issue #546 · kubernetes-sigs/cri-tools

I don't see the command for load or tag [root@kube-master01 ~]# crictl -h NAME: crictl - client for CRI USAGE: crictl [global options] command [command options] [arguments...] VERSION: v1.16.1 COMM...

github.com

 

 

containerd에 namespace가 있다는 것을 몰라서 엄청 삽질을 했다. 뭐든지 바탕이 되는 프로그램에 대한 기본 이해가 중요 한 것 같다🥹

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함