k8s kaniko pod를 통한 conatinaer image 생성 및 harbor저장소 업로드
k8s 1.24부터 docker를 삭제 함에 따라 더이상 설치시에 도커를 설치 하지 않는다.
문제는 그럴경우 containerd는 이미지를 컨테이너로 실행만 하는 역할을 해서 반대로 이미지를
만들어 낼 수 없다.
그리고 k8s 클러스터를 만들고 ci/cd 파이프 라인을 만드는 일련의 과정중 harbor 저장소에 업로드를 위한 작업이 생각보다
많고 저장소에 정상 업로드 되는지도 확인을 해야 된다. 과거와 다르게 요즘은 https를 많이 쓰다보니 특히 on-premise환경
의 private cloud에서는 https 인증서 문제로 인해 서버 to 서버가 정상적으로 연결 안되는 경우가 많다.
harbor 역시 2. 대로 올라가면서 자체 인증서 crt 파일을 다운할 수 있게 제공 하고는 있지만 확실히 귀찮다. 그러다 보니 이걸 꼭 url을 줘야 되는지도 그렇고 그러면 또 dns나 hostalias를 줘야 되는 피곤함도 있고 개발환경만 구축하거나 내부에서만 할때는 그렇게 까지 할 필요가 있나 싶다 그럴때 단독 pod를 통해 이미지 빌드 및 저장소 업로드 테스트 혹은 외부 개별 솔루션을 내부에서 이미지화 할때 kaniko 라는 pod를 쓰면 유용한거 같다.
사전에 필요한건 당연히 k8s, nfs, harbor, 업로드할 소스,dockerfile 이다
일단 다양한 방법이 있는데 압축 파일을 지정된 위치에 두고 pod가 읽어 들여서 이미지로 만들고 저장소까지 밀어 넣는걸 했다.
pvc를 미리 생성 해 두고 물론 스토리지 클래스필요
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: kaniko-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 8Gi
storageClassName: nfs-client
그런 다음 저장소에 업로드 하기 위한 k8s secret이 필요하다
kubectl create secret docker-registry regcred -n kaniko --docker-server='[harbor주소(프로토콜없이ex:192.168.0.1:30001)]' --docker-username='admin' --docker-password='[저장소비번]' --docker-email='[사용자메일]'
secret/regcred created
그런 다음 스프링부트의 예를 들면 빌드 export를 개발도구에서 하면 jar 파일이 나오고 이걸 dockerfile과 함께 디렉토리 체로 tar.gz 로 묶는다.
ex)tar -C demo -zcvf context.tar.gz .
당연히 저 demo라는 디렉토리 안에는 dockerfile과 jar 파일이 존재
이렇게 압축된 context.tar.gz 파일을 연결된 pvc에 원하는 명칭의 디렉토리를 만들고 옮겨둔다. 그리고 나서 최종 pod yml을 이용해 이미지 빌드 및 push를 한다.
아 당연히 저장소에서는 미리 해당 명칭의 프로젝트명으로 프로젝트를 만들어 둬야 된다.
apiVersion: v1
kind: Pod
metadata:
name: kaniko
spec:
containers:
- name: kaniko
image: gcr.io/kaniko-project/executor:latest
args: ["--dockerfile=Dockerfile",
"--context=tar://[디렉토리]/context.tar.gz",
"--destination=[저장소주소]/[프로젝트명]/demo1:v0.0.1",
"--skip-tls-verify=true",
"--insecure=true"] # replace with your dockerhub account
volumeMounts:
- name: kaniko-secret
mountPath: /kaniko/.docker
- name: dockerfile-storage
mountPath: /workspace
restartPolicy: Never
volumes:
- name: kaniko-secret
secret:
secretName: regcred
items:
- key: .dockerconfigjson
path: config.json
- name: dockerfile-storage
persistentVolumeClaim:
claimName: kaniko-pvc
저 야물을 실행하면 된다. 저장소 주소는 앞에도 이야기 했지만 프로토콜은 뺀다
저기에 context를 git을 바라볼수도 있다. 그게 좀 더 심플 할거 같은데 테스트는 안해봣다 애시당초 목적이 저장소와 이미지 빌드 여부이니까