Jenkins – Kubernetes 클러스터 배포 가이드

이 포스트는 오픈 소스 CI(Continuous Integration / 지속적인 통합) 도구인 Jenkins 에 대해 알아보고, Jenkins를 Kubernetes 클러스터에 Helm 차트를 활용하여 배포하는 방법에 관해 설명합니다.

목차

1. Jenkins란?
 1-1. CI/CD란?

 1-2. Jenkins의 핵심 기능
2. 버전 정보
3. Jenkins 배포
4. 결론

1. Jenkins 란?

Jenkins는 오픈 소스 CI(Continuous Integration / 지속적인 통합) 도구로, 소프트웨어 개발 및 배포의 자동화 과정을 도와줍니다. Jenkins는 주로 코드 빌드, 테스트, 품질 검사 등의 CI 작업을 자동화하며, 다양한 플러그인 혹은 다른 애플리케이션과 통합하여 CI/CD 파이프라인을 구성할 수 있습니다.

Jenkins의 핵심 역할은 지속적인 통합(CI)입니다. 개발자가 코드 변경을 Git과 같은 버전 관리 시스템에 푸시할 때마다 Jenkins는 자동으로 빌드하고 테스트하여, 코드 품질을 지속적으로 유지할 수 있게 돕습니다. Jenkins는 개발팀이 코드 변경 사항을 빠르게 통합하고, 버그를 조기에 발견할 수 있도록 도와줍니다.

1-1. CI/CD란?

CI/CD는 소프트웨어 개발 및 배포 과정에서 자동화된 워크플로우를 통해 코드의 품질을 유지하고, 빠른 피드백을 제공하는 방법론입니다. CI는 지속적인 통합(Continuous Integration)을 의미하고, CD는 지속적인 배포(Continuous Deployment)를 의미합니다. 이들은 함께 작동하여, 개발자가 작성한 코드를 자동으로 빌드하고 테스트한 후, 배포하는 과정을 자동화합니다.

  • 지속적인 통합(CI): 개발자는 코드 변경을 중앙 저장소에 자주 푸시합니다. CI는 코드가 푸시될 때마다 자동으로 빌드하고 테스트를 실행하여, 코드 통합에 발생할 수 있는 문제를 조기에 발견할 수 있도록 돕습니다. CI는 소프트웨어의 품질을 유지하고, 버그를 빠르게 식별할 수 있는 중요한 역할을 합니다.
  • 지속적인 배포(CD): CI를 통해 빌드된 코드를 자동으로 프로덕션 환경에 배포하는 프로세스를 의미합니다. 이는 개발자가 코드 변경을 푸시하면, 자동으로 해당 변경 사항이 운영 환경에 반영되도록 하는 방법입니다.

CI/CD는 반복적인 수작업을 줄이고, 코드 품질을 지속적으로 유지하며, 빠른 피드백을 제공하는 중요한 역할을 합니다. 이를 통해 소프트웨어 개발 및 배포 과정이 더 효율적이고 신속하게 이루어지며, 버그를 조기에 발견하고 해결할 수 있습니다.

1-2. Jenkins의 핵심 기능

CI(지속적 통합)

  • 개발자들이 코드 변경 사항을 자주 병합하고 빌드하여 통합 문제를 조기에 발견할 수 있도록 합니다.
  • 코드 변경이 발생할 때마다 자동으로 빌드를 실행하고, 테스트를 수행하여 품질을 유지할 수 있습니다.
  • 다양한 소스 코드 관리 시스템(Git, SVN 등)과의 연동을 지원합니다.

파이프라인

  • Jenkins Pipeline을 통해 복잡한 워크플로우를 코드로 정의하고 관리할 수 있습니다(Pipeline as Code).
  • Jenkinsfile을 코드로 작성하여 파이프라인을 정의하고, 이를 버전 관리 시스템(Git 등)에 저장하여 관리할 수 있습니다.
  • 선언적(Declarative) 파이프라인과 스크립트(Scripted) 파이프라인 두 가지 문법을 지원합니다.

플러그인

  • 2,000개 이상의 플러그인을 통해 다양한 도구와 통합이 가능합니다.
  • 빌드 도구(Maven, Gradle), 테스트 프레임워크, 클라우드 플랫폼, 컨테이너 기술 등과 연동됩니다.
  • 자체 플러그인 개발도 가능하여 기업 고유의 요구사항을 충족시킬 수 있습니다.

분산 빌드 환경

  • 마스터/에이전트 아키텍처를 통해 빌드 작업을 여러 시스템에 분산시킬 수 있습니다.
  • 다양한 운영체제 환경에서 빌드 및 테스트를 수행할 수 있습니다.
  • 클라우드 환경에서 동적으로 빌드 에이전트를 생성하고 관리할 수 있습니다.

보안 및 권한 관리

  • 사용자 인증 및 권한 관리 기능을 제공합니다.
  • LDAP, Active Directory 등과 연동하여 기업 내 인증 시스템을 활용할 수 있습니다.
  • Jenkins 기본 제공 기능 또는 Role-Based Access Control(RBAC) 플러그인을 활용하여 프로젝트별 세밀한 권한 설정이 가능합니다.

2. 버전 정보

  • Kubernetes: v1.32.2
  • Jenkins: 2.492.1
  • Jenkins chart: jenkins-5.8.17

3. Jenkins 배포

Jenkins를 Kubernetes 클러스터에 배포하는 경우 Helm을 사용해 배포합니다.
Helm의 설치 방법 및 사용 방법은 Helm – Kubernetes 패키지 매니저 포스트를 참고하세요.

Helm 명령어를 사용하여 Jenkins 리포지토리를 추가합니다.

$ helm repo add jenkins https://charts.jenkins.io
$ helm repo update

다음 명령어를 통해 차트의 정보를 확인할 수 있습니다.

$ helm search repo jenkins

NAME            CHART VERSION   APP VERSION     DESCRIPTION                                       
jenkins/jenkins 5.8.17          2.492.1         Jenkins - Build great things at any scale! As t...

Helm 차트를 통한 배포 시, values.yaml 파일을 통해 배포 설정을 구성할 수 있습니다. 다음 명령어를 사용해 설정 파일을 저장합니다.

$ helm show values jenkins/jenkins > jenkins_values.yaml

Kubernetes 클러스터에 배포 시, Pod의 종료에도 Jenkins의 설정 데이터를 저장하고 유지하기 위해 클러스터의 PVC 사용 설정이 필요합니다. yaml 파일의 persistence 항목에서 해당 설정을 구성할 수 있습니다.

persistence:
  # 기본적으로 PVC 사용 설정
  enabled: true

  # 클러스터에 사전 구성된 PVC 이름을 명시하여 사용
  existingClaim:

  # storageClass 리소스를 통한 PVC 구성 시 해당 리소스 이름 명시
  storageClass:

  annotations: {}
  labels: {}
  # PVC access mode 설정. 클러스터의 PVC 설정과 일치해야 bound됨
  accessMode: "ReadWriteOnce"
  # PVC 크기 설정. 클러스터의 PVC 설정과 일치해야 bound됨
  size: "8Gi"

yaml 파일을 통해 구성할 수 있는 전체 설정의 상세한 값은 Jenkins helm chart 문서를 참고하세요.

yaml 파일에 설정 값 구성이 완료되면, 명령어를 통해 차트를 설치하여 Kubernetes 클러스터에 배포합니다.

$ helm install jenkins jenkins/jenkins -f jenkins_values.yaml -n ci

Pulled: ghcr.io/jenkinsci/helm-charts/jenkins:5.8.17
Digest: sha256:f773e86c8c9bbca3343b84d62e79e7fe350684be17618f1357e39cc6fea2df2a
NAME: jenkins
LAST DEPLOYED: Tue Mar 11 06:55:33 2025
NAMESPACE: ci
STATUS: deployed
REVISION: 1
NOTES:
1. Get your 'admin' user password by running:
  kubectl exec --namespace ci -it svc/jenkins -c jenkins -- /bin/cat /run/secrets/additional/chart-admin-password && echo
2. Get the Jenkins URL to visit by running these commands in the same shell:
  echo http://127.0.0.1:8080
  kubectl --namespace ci port-forward svc/jenkins 8080:8080

3. Login with the password from step 1 and the username: admin
4. Configure security realm and authorization strategy
5. Use Jenkins Configuration as Code by specifying configScripts in your values.yaml file, see documentation: http://127.0.0.1:8080/configuration-as-code and examples: https://github.com/jenkinsci/configuration-as-code-plugin/tree/master/demos

For more information on running Jenkins on Kubernetes, visit:
https://cloud.google.com/solutions/jenkins-on-container-engine

For more information about Jenkins Configuration as Code, visit:
https://jenkins.io/projects/jcasc/


NOTE: Consider using a custom image with pre-installed plugins

jenkins 이름으로 jenkins_values.yaml 파일을 사용하여 ci 네임스페이스에 배포합니다.

출력의 1번 항목의 명령어를 통해서 최초 admin 계정의 비밀번호를 확인할 수 있습니다.

$ kubectl exec --namespace ci -it svc/jenkins -c jenkins -- /bin/cat /run/secrets/additional/chart-admin-password && echo

배포된 Jenkins를 확인할 수 있습니다.

$ helm list -n ci

NAME    NAMESPACE       REVISION        UPDATED                                 STATUS          CHART           APP VERSION
jenkins ci              1               2025-03-11 06:55:33.586547585 +0000 UTC deployed        jenkins-5.8.17  2.492.1    
$ kubectl get all -n ci

NAME            READY   STATUS    RESTARTS   AGE
pod/jenkins-0   2/2     Running   0          8h

NAME                    TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)     AGE
service/jenkins         ClusterIP   10.106.111.8     <none>        8080/TCP    3d1h
service/jenkins-agent   ClusterIP   10.105.118.254   <none>        50000/TCP   3d1h

NAME                       READY   AGE
statefulset.apps/jenkins   1/1     3d1h

$ kubectl get pvc -n ci

NAME      STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS      VOLUMEATTRIBUTESCLASS   AGE
jenkins   Bound    pvc-02f99918-dd72-4c42-837f-06648a736f74   8Gi        RWO            rook-ceph-block   <unset>                 3d1h

Kubernetes 클러스터에 배포된 NGINX Ingress Controller를 통해 외부에서 Jenkins로 접근할 수 있도록 VirtualServer 리소스를 배포했습니다.

apiVersion: k8s.nginx.org/v1
kind: VirtualServer
metadata:
  name: jenkins-vs
  namespace: ci
spec:
  host: jenkins.example.com
  upstreams:
    - name: jenkins
      service: jenkins
      port: 8080
      client-max-body-size: 0m  
  routes:
    - path: /
      action:
        pass: jenkins
jenkins login
jenkins main

admin ID와 명령어를 통해 확인한 비밀번호를 통해 로그인할 수 있습니다.

4. 결론

이번 포스트에서는 Jenkins에 대해 알아보고, Jenkins를 Kubernetes 클러스터에 Helm 차트를 활용하여 배포하는 방법을 알아봤습니다.

쿠버네티스 환경에 Jenkins를 설치하고 운영하는 것은 현대적인 DevOps 접근 방식으로, 확장성, 안정성, 리소스 효율성을 크게 향상합니다. Helm을 통한 간단한 설치 과정으로 시작하여, 적절한 구성과 최적화를 통해 강력한 CI/CD 파이프라인을 구축할 수 있습니다. Jenkins와 쿠버네티스의 결합은 소프트웨어 개발 및 배포 과정을 가속화하고, 더 안정적이고 일관된 제품을 제공하는 데 도움이 됩니다.

Kubernetes 클러스터 운영에 어려움을 겪고 계신가요? 지금 NGINX STORE를 통해 문의해 Kubernetes 기술지원 서비스에 대해 알아보세요.

NGINX STORE를 통한 솔루션 도입 및 기술지원 무료 상담 신청

* indicates required