Goal

  • 자체 구성한 쿠버네티스 클러스터에 Helm Chart를 이용해서 Jenkins 를 설치 할 수 있다.
  • Jenkins를 활용해서 CI(Continous Intergration) / CD (Continous Deployment)를 적용할 수 있다.
  • 쿠버네티스 클러스터에 DevOps 환경을 구축 할 수 있다.

image.png

Jenkins Pod

  Jenkins는 쿠버네티스 클러스터 내부 POD에서 동작 하도록 합니다. helm chart를 이용해서 별도의 설정 없이 Jenkins를 클러스터에 설치할 수 있지만, 클라우드 환경이 아닌 클러스터 에서는 LoadBalancer타입의 Service를 사용할 수 없습니다. 따라서, helm chart를 설치할때 별도의 설정도 같이 해줘야 정상적으로 Jenkins를 사용할 수 있습니다.

  Jenkins 공식 Helm Chart를 확인해 보면 Jenkins Master와 Jenkins Agnet의 메모리가 256mb로 설정되 어있습니다. 파이프라인 빌드시 socket timeout에러가 나면서 minikube가 죽는경우가 자주 있었는데 메모리를 1기가로 올려주면 Jenkins 파이프라인 정상 동작하게 됩니다.

Jenkins Pod Work-flow

image.png
Jenkins 마스터가 pod가 클러스터 내부에서 설정된 파이프라인 Job을 통해서 build trigger를 대기하고 있습니다. build trigger를 받은 Jenkins Master는 Jenkins Agent(jnlp)를 생성하고 Jnlp와 통신을 합니다.
Jenkins Agent에 사전에 플러그인으로 설정된 docker,helm,git등이 설정 되면서 JenkinsFile에 설정된 파이프라인 스크립트를 읽어들이면서 CI 작업을 수행 합니다.

minikube에서 Jenkins 설치

※ Jenkins를 설치하기 전에 docker, minikube, helm 이 정상적으로 설치되어 있어야 합니다.

  1. Jenknis Pod를 위한 config 파일 및 Jenkins config 파일 git clone
git clone https://github.com/syunyun/minikube-helm-jenkins.git
cd minikube-helm-jenkins
  1. kubernetes namespace 설정하기
kubectl create -f minikube/jenkins-namespace.yaml
  1. PersistentVolume 설정하기
kubectl create -f minikube/jenkins-volume.yaml
  1. Jenkins Helm Chart 설치하기

    helm install --name jenkins -f helm/jenkins-value.yaml stable/jenkins --namespace jenkins-project
  2. 터미널에 나온 명령어를 통해서 jenkins 패스워드를 출력

  3. 정상동작 확인

    kubectl get pods --namespace=jenkins-project