Kaniko
Docker 없이
Image build 가 가능하다고?
CI/CD 환경에서 Docker 없이 컨테이너 이미지를 빌드할 수 있는 Kaniko를 활용하여, Persistent Volume (PV)과 Persistent Volume Claim (PVC)을 통해 호스트의 특정 경로(Server 내 hostPath)를 마운트하고, Docker 인증 정보를 Secret으로 저장한 후 Kaniko Pod를 실행하는 방법을 정리해보겠습니다.
1. PV 및 PVC 설정
Kaniko는 기본적으로 컨테이너 내부에서 동작하기 때문에 빌드 컨텍스트를 제공해야 합니다. 이를 위해 Kubernetes의 PV와 PVC를 활용하여 서버의 특정 디렉터리를 Kaniko Pod에서 접근할 수 있도록 설정합니다.
1.1 PV 생성
먼저 Persistent Volume을 생성합니다.
apiVersion: v1
kind: PersistentVolume
metadata:
name: dockerfile
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
storageClassName: local-storage
hostPath:
path: "/home/kaniko/gitea"
1.2 PVC 생성
PV와 연결될 PVC를 생성합니다.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: dockerfile-claim
namespace: jenkins
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 8Gi
storageClassName: local-storage
2. Docker 인증 정보 설정 (Secret 생성)
Kaniko가 프라이빗 레지스트리에 이미지를 푸시할 수 있도록 인증 정보를 Kubernetes Secret으로 저장합니다.
일반적으로 Docker CLI를 사용하여 이미지를 빌드하고 푸시할 경우, Docker 데몬이 ~/.docker/config.json을 참조하여 인증을 처리합니다. 하지만 Kaniko는 Docker 데몬 없이 컨테이너 이미지를 빌드하기 때문에, 인증 정보를 수동으로 제공해야 합니다.
config.json
파일은 레지스트리에 로그인할 때 생성되는 파일로, 인증 정보를 포함하고 있습니다.
{
"auths": {
"192.168.60.162": {
"username": "{docker login ID}", # ID 원본 값
"password": "{docker login PW}", # PW 원본 값
"auth": "{docker login ID:docker login PW}" # ID:PW 인코딩 값
}
}
}
이 값을 활용하여 다음과 같이 Secret을 생성합니다.
apiVersion: v1
kind: Secret
metadata:
name: regcred2
namespace: jenkins
type: Opaque
data:
.dockerconfigjson: {docker 인증 정보 인코딩 값}
# json 인코딩 값은 위 설명한 docker.json 전체 파일을 인코딩한 값입니다.
3. Kaniko Pod 실행
이제 Kaniko Pod를 실행하여 Docker 이미지를 빌드하고 프라이빗 레지스트리에 푸시할 수 있습니다.
apiVersion: v1
kind: Pod
metadata:
name: kaniko
namespace: jenkins
spec:
containers:
- name: kaniko
image: gcr.io/kaniko-project/executor:latest
args: ["--dockerfile=/workspace/dockerfile",
"--context=dir://workspace",
"--destination={docker 주소}/kaniko/python:v1.0",
"--skip-tls-verify",
"--insecure",
"--verbosity=debug"] # replace with your dockerhub account
volumeMounts:
- name: kaniko-secret
mountPath: /kaniko/.docker
- name: dockerfile-claim
mountPath: /workspace
restartPolicy: Never
volumes:
- name: kaniko-secret
secret:
secretName: regcred
items:
- key: .dockerconfigjson
path: config.json
- name: dockerfile-claim
persistentVolumeClaim:
claimName: dockerfile-claim
4. 실행 및 검증
이제 Kaniko Pod를 실행하고 로그를 확인하여 정상적으로 빌드 및 푸시가 이루어졌는지 확인합니다.
kubectl apply -f pv.yaml
kubectl apply -f pvc.yaml
kubectl apply -f kaniko-secret.yaml
kubectl apply -f kaniko-pod.yaml
kubectl logs -f pod/kaniko-builder
정상적으로 실행되면 지정한 프라이빗 레지스트리에 my-app:latest 이미지가 업로드됩니다.
이와 같은 방식으로 Kubernetes 환경에서 Kaniko를 활용하여 손쉽게 컨테이너 이미지를 빌드하고 관리할 수 있습니다.
하버에 정상적으로 push 된 레포지토리
위 과정 요약 정리
1. PV, PVC 생성 (hostPath 로 dockerfile 경로 지정을 위함)
2. Secret 생성 (도커 인증을 위함)
3. pod 생성
3-1. 파드 로그 확인
- mount 안될 경우는 debug-pod 생성하여 hostPath 지정 확인
- dockerfile 정상적으로 읽는지 확인
4. 이미지 정상적으로 build & push 하는지 로그 및 하버 확인
감사합니다.