클라우드 타고 포트와 파도
article thumbnail

기존 방식: 로컬 환경에서 수동 이미지 푸시 

기존에는 이미지 업로드를 위해 로컬 환경에서 직접 스크립트를 실행해야 했습니다. 다음과 같은 방식으로 이미지들을 프라이빗 레지스트리(Nexus)에서 Pull한 뒤, Oracle Cloud Infrastructure Registry(OCIR)로 Push했습니다.

 

기존 스크립트 (push_image.sh)

  • Nexus에서 이미지 목록을 pull
  • 태깅 후 ocir로 push
  • 이미지 정리 및 로그아웃 처리
#!/bin/bash
...
IMAGES="prod:xxxxx ... prod:xxxx"
...
docker login $PULL_URL -u $PULL_ID -p $PULL_PW
pull_images $PULL_URL
docker logout $PULL_URL

docker login $PUSH_URL -u $PUSH_ID -p $PUSH_PW
push_images $PULL_URL $PUSH_URL/$PUSH_OCIR
docker logout $PUSH_URL

 

실행 명령어:

/bin/bash push_images.sh {OCI_ID} {OCI_AUTH_TOKEN}

 

문제점

  • 개발자의 로컬 환경에 Docker가 설치되어 있어야함
  • 보안 인증 정보를 직접 노출하거나 입력해야함
  • 자동화가 어려움 -> 배포 프로세스와 분리됨
  • 로컬 환경별 설정 차이로 인한 환경 의존성 발생

 

개선방식:  kubernetes job을 이용한 이미지 업로드 자동화 

이를 해결하기 위해 Kubernetes Job을 사용하여 이미지 업로드를 자동화하는 구조로 개선했습니다.

 

개선 목표

  • CI/CD 파이프라인과 연동 가능한 구조
  • 로컬 환경 불필요, 어디서든 배포 가능
  • OCI 인증정보는 Job 내부에서 처리하여 보안성 확보
  • 업로드 대상 이미지만 변수로 받아 유연한 배포 처리

 

구성 요소

  • ConfigMap

스크립트를 ConfigMap으로 정의하여 Job이 사용할 수 있도록 구성합니다.

apiVersion: v1
kind: ConfigMap
metadata:
  name: img-uploader
data:
  img-upload.sh: |
    #!/bin/bash
    ...
    function parsing_arguments(){ ... }
    function pull_images(){ ... }
    function push_images(){ ... }
    main $@
    
  run.sh: |
    #!/bin/bash
    apk add bash
    /bin/bash /tmp/img-upload.sh $PUSH_IMG

 

  • Job yaml

docker:dind를 사용해 Docker-in-Docker 환경을 구성하고, 이미지 업로드를 실행하는 Job을 정의합니다.

apiVersion: batch/v1
kind: Job
metadata:
  name: img-uploader
  annotations:
    argocd.argoproj.io/hook: Sync
spec:
  backoffLimit: 20
  template:
    spec:
      volumes:
      - name: docker
        emptyDir: {}
      - name: img-upload-script
        configMap:
          name: img-uploader-cfm
          items:
          - key: img-upload.sh
            path: img-upload.sh
      - name: run-script
        configMap:
          name: img-uploader-cfm
          items:
          - key: run.sh
            path: run.sh
      containers:
      - name: img-uploader
        image: docker
        command: ["sh", "/tmp/run.sh"]
        env:
        - name: PUSH_IMG
          value: "prod:xxxxxxxx0"
        volumeMounts:
        - name: img-upload-script
          mountPath: /tmp/img-upload.sh
          subPath: img-upload.sh
        - name: run-script
          mountPath: /tmp/run.sh
          subPath: run.sh
      - name: dind-daemon
        image: docker:dind
        command: ["dockerd", "--host", "", "", ""]
        securityContext:
          privileged: true
        volumeMounts:
        - name: docker 
          mountPath: /certs
      restartPolicy: Never

 

동작 방식 요약

1. img-upload.sh 스크립트는 ConfigMap을 통해 Job에 주입됨

2. PUSH_IMG 환경 변수에 업로드할 이미지를 전달

3. dind-daemon 컨테이너에서 Docker 데몬 구동 (Docker-in-Docker)

4. 이미지 Pull → Tag → Push 후 삭제까지 자동화 수행

 

마무리

이번 이미지 업로드 개선은 단순히 스크립트를 Job으로 옮긴 수준이 아니라, 배포 자동화를 실현하는 중요한 전환점이었습니다. 기존에는 DevOps가 직접 로컬에서 실행하고 인증을 처리했지만, 이제는 Kubernetes 환경에서 Job으로 실행되어, 사람의 개입 없이도 안정적으로 이미지 업로드가 이루어집니다.

이제 GitOps나 Argo CD 같은 CI/CD 시스템과 쉽게 연동할 수 있으며, 업로드할 이미지를 환경변수로 넘기는 방식으로 운영의 유연성도 확보했습니다. 민감 정보도 Kubernetes Secret으로 관리 가능해 보안도 강화할 수 있습니다.

무엇보다 실수를 줄이고 반복 작업을 없애며, 시스템 중심의 자동화된 운영이 가능해졌다는 점이 가장 큰 성과입니다. 앞으로 Secret 적용, GitOps 연동, 이미지 검증 자동화까지 확장하면 지속 가능한 클라우드 운영의 기반이 완성될 것입니다.

 

profile

클라우드 타고 포트와 파도

@cloudwave

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!