본문 바로가기

DevOps/쿠버네티스

젠킨스(with 쿠버네티스 플러그인)가 쿠버네티스에서 동작하는 원리, 생명주기, 특징

기존 VM으로 운영되던 Jenkins는 master가 있고 slave(vm n대 설정)를 연결시키면 slave가 job을 master로 부터 받아서 수행했엇다.


하지만 VM으로 운영되는 Jenkins(master-slave) 구조는 아래와 같은 단점이 있다.


  • Job에 필요한 plugin들을 master에 설치, 관리 필요

  • Job에 비해서 slave가 많으면 비효율적임
    (slave가 놀고 있음)

  • Job에 비해서 slave가 적으면 비효율적임
    (slave가 부족해서 기다리는 job이 많아짐)

  • 즉, Job이 늘어나고 줄어듦에 따라 Jenkins slave를 늘리거나 줄여야하는(사람이 직접 설치해야하는) 단점!!


Jenkins(with kubernetes plugin)가 있다면 이야기는 달라진다.

  • Jenkins master는 단순히 job을 정의하고 저장하는 역할
    - 관리가 한결 편해진다.

  • Jenkins slave는 쿠버네티스 클러스터에서 Pod으로 동적 생성/삭제됨
    - 리소스의 효율화

  • 각 Job에 따라 필요한 리소스를 정의하여 관리가능
    - 각 Job에 따라 필요한 리소스(maven, gradle, docker 등)를 직접 pipeline에 정의하여 사용
    - master가 plugin들을 관리할 필요가 없음!

젠킨스(with kubernetes plugin) 파이프라인 생명주기

  1. Jenkins(with kubernetes plugin) master에게 Jenkins job 수행요청
  2. Jenkins master는 kubernetes에게 slave를 생성하도록 선언
  3. 새로 생성된 Jenkins slave pod은 job을 수행(빌드, 배포 등)
  4. job이 완료되면 해당 Jenkins slave pod을 삭제

젠킨스(with kubernetes plugin) 파이프라인 예제

def label = "mypod-${UUID.randomUUID().toString()}"
podTemplate(label: label, containers: [
    containerTemplate(name: 'maven', image: 'maven:3.3.9-jdk-8-alpine', ttyEnabled: true, command: 'cat'),
    containerTemplate(name: 'golang', image: 'golang:1.8.0', ttyEnabled: true, command: 'cat')
  ]) {
 
    node(label) {
        stage('Get a Maven project') {
            git 'https://github.com/jenkinsci/kubernetes-plugin.git'
            container('maven') {
                stage('Build a Maven project') {
                    sh 'mvn -B clean install'
                }
            }
        }
 
        stage('Get a Golang project') {
            git url: 'https://github.com/hashicorp/terraform.git'
            container('golang') {
                stage('Build a Go project') {
                    sh """
                    mkdir -p /go/src/github.com/hashicorp
                    ln -s `pwd` /go/src/github.com/hashicorp/terraform
                    cd /go/src/github.com/hashicorp/terraform && make core-dev
                    """
                }
            }
        }
 
    }
}

- def label : label 이름선언, 주로 uuid를 붙여서 선언하여 Jenkins slave pod 생성시 겹치지 않도록 함
- podTemplate : Jenkins job을 돌리기 위해 필요한 plugin을 컨테이너 개념으로 선언하여 pod내부에 같이 띄워서 파이프라인에서 빌드, 배포 등등을 활용한다.
- node(label) : Jenkins 파이프라인처럼 선언하여 빌드, 배포 등의 stage를 수행


젠킨스(with kubernetes plugin) 파이프라인 특징

- jenkins/jnlp-slave(바로가기) 도커 에이전트기반으로 pod이 생성됨(jnlp container 자동 injection), 필요시에 podTemplate에 jnlp를 선언하여 resource 설정가능)

- podTemplate에 여러 container을 선언하더라도 같은 path에서 job을 수행

- 젠킨스파이프라인이 아닌 yaml 방식으로 Jenkins slave pod 생성도 가능 - 바로가기

- PVC(PersistentVolumeClaim)을 활용하여 maven, gradle의 library 공통 경로 관리도 가능

- namespace를 사용하여 Jenkins slave만을 위한 node로 배포도 가능


End of Document




반응형