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에서 생성
2. Pipeline에서 PodTemplate 명시
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를 사용하려고 한 것인데, 포스팅할 예정이다. (아마도..) 참고한 링크는 다음과 같다.
'Cloud Native' 카테고리의 다른 글
[Kubernetes] 쿠버네티스 API 확장하기 - custom resource, crd (0) | 2020.12.06 |
---|---|
[Kubernetes] 쿠버네티스 플러그인 추천 (kubectx, kubens, ...) (0) | 2020.12.05 |
[Kubernetes] 쿠버네티스 입문하기 (0) | 2020.09.16 |
Container 총정리 (0) | 2020.09.16 |