Dev/DevOps

Kaniko

TrendPilot 2025. 3. 10. 09:40
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 하는지 로그 및 하버 확인

 

감사합니다.