본문 바로가기

Cloud Native

[Jenkins] Kubernetes에 Jenkins 분산 빌드 환경 설정 (Master-Slave)

Jenkins는 대표적인 CI(Continuous Intergration) 툴로, 많은 플러그인을 제공하며 확장성이 크다는 장점이 있다.

Jenkins를 Kubernetes에 구축하고, 분산 빌드 환경을 설정하려고 한다.

Jenkins 단일 서버

- 크고 무거운 프로젝트가 점점 더 많이 빌드된다면, 단일 서버로 버틸 수 없음

- 빌드 환경을 다르게 설정하고 싶을 때에도 단일 서버에서는 불가능함

Jenkins 분산 아키텍처

Jenkins는 Mater-Slave 아키텍처를 통해 분산 빌드 환경을 관리할 수 있다. (요즘은 slave 대신 agent라고 부르는 듯)

- Master

빌드 작업을 스케줄링하고 Slave에서 실행 및 모니터링 (물론, 빌드 작업 실행도 가능) / Jenkins 서버 (GUI, API)

 

- Slave

Master로부터 요청을 수신하고, 해당 빌드 작업을 실행 / VM, Container로 Slave 빌드환경을 구성할 수 있음

✅ Kubernetes에 Jenkins 분산 아키텍처를 구성하자! 

사실 K8S를 사용하기때문에 Jenkins를 K8S에 배포한 것이었는데, 분산 아키텍처에서 K8S의 장점이 많이 있었다.

 

- Slave를 VM으로 구성

빌드 작업에 비해 Slave가 적어도 많아도 비효율적 / VM을 scaling하기에는 VM은 무겁고, 시간이 오래걸림

 

- Slave를 Pod로 구성

빌드 작업마다 Pod로 생성되고, 작업이 끝나면 삭제됨 -> 리소스 효율화 & 컨테이너의 특성상 생성 시간이 짧음

빌드 작업마다 필요한 빌드환경을 PodTemplate으로서 구성 가능 -> 리소스 limit도 둘 수 있음

쿠버네티스, 컨테이너의 장점과 Jenkins의 확장성이 어우려져 효율적인 분산 아키텍처를 구성하게 됨

 

PodTemplate을 적용해보자

Slave가 Pod로 띄워지고 jnlp container에서 Job을 수행하게 되는데, 이 때 실행하고자하는 PodTemplate을 지정해주어야 한다. PodTemplate을 생성하는 방법은 여러가지가 있다. (Kubernetes 플러그인 설치는 필수)

 

1. Jenkins UI에서 생성 

 

Quick and Simple — How to Setup Jenkins Distributed (Master-Slave) Build on Kubernetes

Even today, Jenkins still bring massive improvements to the open source community, especially under the DevOps field of view. Its highly…

medium.com

2. Pipeline에서 PodTemplate 명시

 

Kubernetes plugin

Jenkins – an open source automation server which enables developers around the world to reliably build, test, and deploy their software

www.jenkins.io

3. Configuration as Code로서 PodTemplate 정의

 

- Pod가 restart 되어도 설정이 유지된다. (Helm Chart에 CasC 명시)

- Jenkinsfile에는 pipeline에 대한 내용만으로 간결하게 구성할 수 있다.

 

  podTemplates:
    dind: |
      - name: jenkins-dind-slave
        label: jenkins-dind-slave
        containers:
          - name: jnlp
            image: .../inbound-agent:latest
            command: ""
            args: ""
            envVars:
              - envVar:
                  key: DOCKER_HOST
                  value: tcp://localhost:2375
          - name: dind
            image: docker:18.05-dind
            privileged: true
            command: ""
            args: ""

 

💡 주의할 점

inbound-agent (또는 jnlp-slave)를 커스텀하게 만든 경우, 컨테이너 이름을 꼭 jnlp로 지정해주어야 함

다른 이름으로 컨테이너를 생성하게 되면, jenkins가 자동으로 Slave Pod를 생성할 때 jnlp 컨테이너를 생성해 빌드를 수행하기 때문이다.

 

위의 PodTemplate 경우에는 jnlp 컨테이너와 docker 컨테이너를 실행시키도록 했다. jnlp 컨테이너에서 docker 명령어를 수행하도록 하기 위함이다. 관련한 내용은 docker-in-docker를 사용하려고 한 것인데, 포스팅할 예정이다. (아마도..) 참고한 링크는 다음과 같다.

 

Building Docker Images inside Kubernetes

The Problem

medium.com