빠른 개발을 지원하는 K8s와 CI/CD

애자일은 비즈니스 환경에서 민첩한 접근 방식을 강조하여, 능동적인 대응과 적응의 중요성을 강조합니다. K8s와 CI/CD는 현대 소프트웨어 개발에서 필수적인 요소로, 개발 및 운영 효율성을 향상시키고 빠른 시장 진입을 가능하게 합니다.Kubernetes(K8s)는 컨테이너화된 애플리케이션의 효율적인 배포와 관리를 지원하는 오케스트레이션 플랫폼입니다. CI/CD는 지속적인 통합 및 배포를 의미하며, 코드 품질을 유지하고 서비스를 신속하게 출시할 수 있게 해줍니다. 코드 컨테이너화는 애플리케이션 코드를 컨테이너 이미지로 패키징하는 과정을 말합니다. 애플리케이션 컨테이너화의 증가로 Kubernetes(K8s)의 활용성이 더욱 증가하고 있습니다. 이 과정은 개발 및 운영 환경의 일관성을 보장하며, Jib, Kaniko, Ko 등의 도구를 사용하여 쉽게 구현할 수 있습니다.또한, CI/CD 파이프라인 구축에 활용되는 GitLab, GitLab Runner, Container Registry, Argo CD와 Kubernetes(K8s)는 실무 현장에서 높은 실용성을 가지고 강력한 역할을 수행하고 있습니다. 이러한 도구들은 실제로 현장에서 많이 사용되며, 효과적인 개발 및 배포를 지원합니다.

I. 서론

애자일(agile)은 우리말로 민첩함을 의미하며 애자일 컨설턴트인 Craig & Bas는 “경쟁적인 비즈니스 환경에 능동적으로 대응하고 적응하는 능력을 지향하는 가치와 원리”라고 정의하고 있으며 단순한 프랙티스 차원이 아니라 사고방식(mindset)이라는 것을 강조하고 있습니다. 최근까지 애플리케이션의 컨테이너화가 가속화되는 흐름이 주류로 자리잡고 있는 상황에서 K8s의 실용성이 증가하고 있어 애자일에 긍정적 영향력 관점에서 살펴보고자 합니다. 본 글에서는 K8s와 CI/CD의 개념과 중요성에 대해 살펴보고, 코드 컨테이너화 및 배포 자동화 도구에 대한 설명과 함께 실제로 구축된 CI/CD 파이프라인 사례를 소개하고자 합니다. 이를 통해 보다 구체적으로 이해하실 수 있도록 도움을 드리겠습니다.

II. K8s, CI/CD의 개념 및 중요성

Kubernetes(K8s)는 컨테이너 오케스트레이션 플랫폼으로, 여러 개의 컨테이너화 된 애플리케이션을 효율적으로 배포, 관리, 확장할 수 있도록 도와줍니다. K8s는 클러스터 형태로 구성되며, 컨테이너화 된 애플리케이션의 배포와 관리를 자동화하고, 확장성과 가용성을 제공합니다.

CI/CD는 Continuous Integration(지속적인 통합)과 Continuous Deployment(지속적인 배포)의 합성어로, 소프트웨어를 지속적으로 통합하고 배포하는 개발방법론입니다. CI는 개발자들이 작성한 코드를 자동으로 빌드하고 테스트하여 통합하는 과정을 의미하며, CD는 통합된 코드를 자동으로 배포하여 실제 서비스 환경에 적용하는 과정을 의미합니다.

K8s와 CI/CD는 개발과 배포의 생산성과 안정성을 크게 향상시킵니다. K8s는 애플리케이션을 컨테이너화하여 효율적으로 관리할 수 있으며, 확장성과 가용성을 제공하여 안정적인 서비스 운영을 가능하게 합니다. CI/CD는 개발자들이 작성한 코드를 자동으로 빌드하고 테스트하여 품질을 유지하며, 자동 배포를 통해 빠른 속도로 새로운 기능을 출시하고자 하는 서비스 요구를 만족할 수 있습니다. K8s와CI/CD는 현대 소프트웨어 개발에서 필수적인 요소로 인정받고 있습니다. K8s와 CI/CD를 활용하면 개발자들이 겪게되는 통합 지옥(integration hell)을 해결하여 애플리케이션을 효율적으로 배포하여 개발자 경험을 향상시킵니다. 이를 통해 개발과 운영의 효율성을 극대화할 수 있으며, 더 나은 사용자 경험과 빠른 시장 진입을 이끌어낼 수 있습니다. 현대의 소프트웨어 개발 환경에서 빠른 개발과 배포는 기업의 경쟁력을 향상시키고 혁신을 이끌어내는 핵심 요소이므로 개발 프로세스에 적극적으로 도입하여 현대적인 개발 방법론을 실현해 보는 것은 다음과 같은 혜택을 누릴 수 있게 해 줄 것입니다. 경쟁사들과의 경쟁에서 우위를 점하고, 사용자들에게 더 나은 제품과 서비스를 제공해 줄 수 있습니다. 기업의 혁신을 촉진시키며, 새로운 아이디어와 실험을 빠르게 시도하고 피드백을 받을 수 있는 환경을 제공합니다. 이를 통해 고객 만족도를 높이기 위해 사용자들의 요구사항을 신속하게 반영하고, 새로운 기능을 제공하여 더 나은 서비스 경험을 제공할 수 있습니다. 빠른 개발과 배포는 현대 소프트웨어개발에서 더 이상 선택 사항이 아닙니다. 기업은 경쟁력을 유지하고 혁신을 이끌어내기 위해 빠른 개발과 배포를 적극적으로 추구해야 합니다. 이를 위해 적절한 도구를 도입하여 DevOps를 실천하는 것이 중요합니다.

III. 코드 컨테이너화와 배포 자동화 도구

코드의 컨테이너화는 애플리케이션 코드를 컨테이너 이미지로 패키징하는 것을 의미합니다. 이는 개발자들이 애플리케이션의 종속성과 환경 설정을 컨테이너 이미지에 포함시켜, 개발 환경과 운영 환경 간의 일관성을 유지할 수 있도록 합니다. 또한, 컨테이너 이미지는 이식성이 뛰어나며, 다양한 환경에서 동일한 방식으로 실행될 수 있습니다. 코드의 컨테이너화의 주요 장점은 다음과 같습니다.

(일관성 있는 개발 및 배포 환경) 컨테이너 이미지는 실행 환경과 독립적이므로, 개발 환경과 운영 환경 간의 일관성을 유지할 수 있습니다.

(더 빠른 개발 및 배포) 컨테이너 이미지는 가볍고 빠르게 생성되며, 개발자들은 이미지를 빌드하고 배포하는 과정을 간소화할 수 있습니다.

(확장성과 유연성) 컨테이너 이미지는 가볍고 이식성이 높아서, 클라우드나 온프레미스 환경에서 쉽게 실행하고 확장할 수 있습니다.

코드의 컨테이너화는 개발 및 배포 과정을 효율적으로 관리하고, 일관성 있는 실행 환경을 유지하는데 도움을 주는 Jib, Kaniko, Ko 등의 도구는 코드의 컨테이너화를 쉽게 구현할 수 있는 기능을 제공하므로, 개발자들은 이를 활용하여 개발과 운영의 효율성을 극대화할 수 있습니다.

Jib는 Google에서 개발한 도구로 애플리케이션 코드를 컨테이너 이미지로 빌드하고, 이를Docker 데몬 없이도 직접적으로 컨테이너 레지스트리에 배포할 수 있는 기능을 제공합니다. 또한, Jib는 캐시 기능을 통해 이미지 빌드 속도를 향상시키고, 레이어 분리 기능을 통해 이미지의 크기를 최적화할 수 있습니다. Gradle과 Maven을 지원합니다. Kaniko는 Google에서 개발한 도구로 Docker 데몬 없이도 컨테이너 이미지를 빌드할 수 있는 기능을 제공합니다. Kaniko는 컨테이너 내부에서 이미지를 빌드하므로, 빌드에 사용되는 파일과 환경 설정은 컨테이너 내부에만 존재하게 됩니다. 이는 보안성과 격리성을 높여줍니다. 또한, Kaniko는 다중 스테이지 빌드를 지원하여 이미지 빌드 과정을 세분화하고, 레이어 캐싱을 통해 빌드 속도를 최적화할 수 있습니다. Ko는 Google에서 개발한 도구로 Go 언어로 작성된 프로젝트를 컨테이너 이미지로 빌드할 수 있는 기능을 제공합니다. Go 언어의 패키지 의존성을 자동으로 분석하여 컨테이너 이미지를 구성하므로, 개발자들은 별도의 Dockerfile을 작성하지 않아도 됩니다. 또한, Ko는 빌드 결과물을 단일 실행 파일로 패키징하므로 이미지 크기를 최소화하고 실행 환경을 단순화할 수 있습니다.

GitLab Runner는 CI/CD 실행 에이전트입니다. GitLab CI/CD는 .gitlab-ci.yml 파일을 사용하여 파이프라인의 작업을 정의하고, GitLab Runner를 통해 실행합니다. GitLab Runner는 애플리케이션의 빌드, 테스트, 배포 등의 작업을 수행하는 CI/CD 파이프라인의 일부로 사용됩니다. GitLab Runner는 다양한 환경(그림1의 사례에서는 K8s리소스를 활용)에서 실행될 수 있으며, GitLab CI/CD 파이프라인과 연동하여 정의된 작업들을 실행합니다.

Argo CD는 GitOps를 기반으로 한 컨테이너화된 애플리케이션의 배포를 관리하는 도구입니다. Argo CD는 Git 리포지토리에 저장된 애플리케이션의 상태를 추적하고, 변경 사항을 감지하여 자동으로 배포를 수행합니다. 이를 통해 애플리케이션의 배포 프로세스를 자동화하고, 안정적인 배포를 보장합니다. Argo CD는 Kubernetes 클러스터에서 애플리케이션의 배포를 관리하는 데 특히 유용합니다.

IV. CI/CD 파이프라인 구축의 실용적인 사례

CI/CD 파이프라인은 애플리케이션의 빌드, 테스트, 배포를 자동으로 수행하여 개발자들의 생산성을 향상시키고 소프트웨어의 품질을 유지할 수 있도록 지원합니다. CI/CD 파이프라인을 그림1과 같이 GitLab, GitLab-Runner, Registry, ArgoCD 도구를 활용해서 구성하면 지속적인 소스 빌드와 배포에 관한 자동화를 편리하게 실현할 수 있습니다.

<자료> 집필자 작성, 2023.

[그림 1] K8s로의 배포 자동화를 위한 CI/CD 파이프라인 구성

K8s로 배포 자동화를 위해 구성한 CI/CD 파이프라인 수행 절차 사례를 살펴보도록 하겠습니다. 크게 두 가지로 나눠서 볼 수 있습니다. 첫 번째는 컨테이너 이미지를 Registry에 Push하기까지의 CI 과정이고, 두 번째는 Argo CD를 사용하여 배포를 완료하는 CD 과정입니다.

구분내용
1) GitLab 소스 코드 저장소– 개발 과정을 통해 소스 코드를 저장소인 GitLab에 repo 생성
2) GitLab-Runner– 소스 코드를 읽어서 GitLab-Runner가 빌드 수행
3) Registry– GitLab-Runner가 빌드한 컨테이너 이미지를 Registry에 Push하여 저장
4) GitLab 인프라 코드 저장소– K8s에 서비스용으로 배포할 인프라 코드(yaml)를 작성하여 GitLab repo로 저장
5) ArgoCD의 인프라 코드 읽기– 인프라 코드를 배포하기 위해 ArgoCD가 인프라 코드 저장소의 내용을 읽음
6) ArgoCD의 인프라 코드 배포– 인프라 코드를 배포하기 위해 ArgoCD가 K8s에 요청을 전달
7) Registry의 컨테이너 이미지 배포– ArgoCD가 요청한 내용에 따라 컨테이너 이미지를 Registry로부터 배포

[표 1] CI/CD 파이프라인 수행 절차

<자료> 집필자 작성, 2023년

우선 소스 코드 저장소를 통해 repo를 생성하는 단계부터 시작합니다. GitLab-Runner는 소스 repo의 소스를 읽어서 빌드를 수행합니다. 많은 빌드 환경이 있지만 K8s환경에서의 구성이 일관성 있고 편리합니다. GitLab-Runner가 빌드한 컨테이너 이미지는 컨테이저 저장소 Registry에 자동으로 저장됩니다. Jib/Kaniko/Ko 등이 있어 도커 환경 구성에 대한 부담 없이 소스 코드에서 바로 컨테이너 이미지를 빌드해서 Registry에 Push해 줄 수 있습니다. 이렇게 CI 과정이 마무리가 되었습니다. 이제 CD과정을 위해 GitLab에다 인프라 소스용 repo를 만들고 CI단계에서 저장한 컨테이너 이미지를 정보를 포함하는 yaml을 작성합니다. CD를 위해 Argo CD가 역할을 충실하게 제공해 줍니다. 인프라 코드 repo에서 yaml 파일을 읽어서 서비스를 제공하는 K8s클러스터에 배포를 진행해 줍니다. 물론 자동화도 가능합니다. 인프라 코드의 yaml 변화를 감지하여 자동으로 배포할 수 있는 기능을 제공합니다. 일반적으로 이 기능은 개발 단계에서 활용되며, 상용 환경에는 직접적으로 적용하지 않습니다. 상용 환경에서도 ArgoCD를 사용하여 배포하는 것이 편리하므로, 자동 배포가 아니더라도 기존 방식에 비해 개발자의 부담을 상당 부분 줄여줍니다. K8s와 CI/CD 환경을 도입하여 기존의 개발 방식과 비교했을 때, 아래의 예시를 통해 생산성이 향상되었음을 체감할 수 있습니다. 배포까지의 전체 시간을 비교해보면, 생산성이 50% 이상 향상될 것으로 기대할 수 있습니다.

구분기존의 개발 방식(Jenkins+VM)K8s와 CI/CD환경에서의 개발 방식
소스 코드 컴파일3분1분
패키징 및 이미지 빌드5분2분
패키지 배포10분3분
롤백 시간15분3분

[표 2] 기존의 개발 방식과 K8s와 CI/CD환경에서의 수행 시간 측면의 비교(예시)

<자료> 집필자 작성, 2023년

V. 결론 : 애자일로 승부하라

애자일 시대인 경쟁적인 비즈니스 환경에서 능동적으로 대응하고 적응하는 역량이 필요합니다. 애플리케이션의 컨테이너화를 지원하는 훌륭한 CI도구와 GitOps를 통해 애플리케이션의 배포를 관리해 주는 훌륭한 CD 도구를 경험했습니다. 개발자들은 도커 환경을 구성할 필요 없이 CI를 손쉽게 실행하고, CD 도구를 통해 Git 리포지토리의 변경 사항을 감지하여 애플리케이션을 업데이트하고 배포할 수 있습니다. 이를 통해 개발자들은 소프트웨어의 개발과 배포를 자동화하고, 일관성 있고 안정적인 환경에서 애플리케이션을 실행할 수 있게 되었습니다. 글로벌하게 최고 성공을 거두고 있는 일론 머스크의 일 잘하는 5가지 원칙 중 3가지(단순화하고 최적화하라, 속도를 높여 주기를 단축하라, 자동화하라)를 만족시키고 있는 것으로 보입니다. K8s와 CI/CD 환경을 구성하는데 필요한 도구를 조합하면 개발자들은 문제 해결에 집중하고 창의적인 사고를 발휘하는 데 더욱 집중할 수 있으며, 민첩한 대응이 필요한 비즈니스 환경에서 글로벌 경쟁력을 확보할 수 있을 것으로 기대됩니다.


[참고문헌]

[1] “애자일 프로젝트 관리 개념 및 적용방안에 관한 연구” 이재왕, 2010.

[2] “CI/CD(CI CD, 지속적통합/지속적배포): 개념, 툴, 구축, 차이 (redhat.com)“, 2023.

[3] “GitHub – GoogleContainerTools/jib: 🏗 Build container images for your Java applications.

[4] “GitHub – GoogleContainerTools/kaniko: Build Container Images In Kubernetes

[5] “ko: Easy Go Containers

[6] “컨테이너 빌드 도구 선택을 위한 특성 및 성능 비교 (Kaniko, Buildah, Buildkit) (sk.com)”, 2023.

[7] “일론 머스크의 일 잘하는 5가지 원칙 | GeekNews (hada.io)“, 2023.