본문 바로가기
Git-DevOps

kubernetes cluster를 이용한 jenkins 구축

by 간식주인 2022. 8. 31.

최근 개발자분들과 많은 커뮤니케이션을 진행하던 도중 CI/CD에 대한 수요가 늘어나고 있는 것을 알게 되었습니다.

아무래도 자동으로 빌드/배포가 되면 개발자분들 입장에선 코드에만 전념하면 되고, 이후 통합 및 테스트가 간결해지기 때문이겠지요.

그래서 이번에는 CI(continuous integration)툴로 많이 사용되고 있는 jenkins를 kubernetes에 Pod 형식으로 구축을 진행하려 합니다.

 

 

요건

 - kubernetes cluster에 jenkins를 구축

 

환경

  • 1 kubernetes cluster(1 control plane, 1 worker node+)

Process

  1. kubernetes cluster 구축
  2. jenkins 배포를 위한 manifest 파일 작성
  3. kubectl 명령어를 이용하여 k8s cluster에 jenkins 배포
  4. jenkins 접속 및 초기 플러그인 설치

주의 사항

- k8s cluster 구축 이후 NCP에서 Server ACG 설정을 통해 포트 오픈이 필요합니다.(워커노드를 통한 접속, k8s간 통신 등)

 

==================================================================================

1. kubernetes cluster 구축

아래 링크를 참고하여 kubernetes cluster를 구축합니다.

 

NCP Server(ubuntu)를 이용한 Docker, kubernetes 설치(k8s cluster 구축)

최근에 레거시 환경에서 MSA(Micro Service Architecture)로 전환하고자하는 분들이 많이 늘어난 것 같습니다. 하지만 CSP에서 PaaS 형식으로 제공해주는 Kubernetes Service(ex) NKS)는 비용이 부담되어 사용하기.

enginnersnack.tistory.com

 

2. jenkins 배포를 위한 manifest 파일 작성

kubernetes cluster에 jenkins를 배포하기 위해 Control Plane(master node)에 2개의 manifest 파일을 작성해야 합니다.

 

먼저 jenkins-deployment.yaml을 작성합니다.

 - jenkins를 pod 형식으로 생성하기 때문에 노드가 재시작될 시 내부에 저장되어 있던 데이터가 전부 유실되게 됩니다. 그러므로 이번에는 hostpath와 volumemount를 이용하여 jenkins pod 내부에 쌓이는 데이터를 worker node에 동일하게 쌓도록 합니다.(단, hostpath를 사용하는 경우 worker node 재시작 시 다른 worker node에 pod가 생성된다면, 서로 다른 node 이므로 이전에 쌓아놓았던 데이터를 사용하지 못합니다.)

 - jenkins를 이용하여 docker build를 통해 애플리케이션을 이미지로 생성해야 하는 경우 jenkins pod 내부에 docker가 설치되어 있어야 합니다. 일반적인 jenkins 이미지의 경우 docker가 설치되어있지 않아서 수동으로 설치를 진행해야 하지만, 커스텀 이미지를 제작하여 docker가 설치된 jenkins 이미지를 바로 k8s에 배포합니다.

jenkins-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: jenkins-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: jenkins
  template:
    metadata:
      labels:
        app: jenkins
    spec:
      securityContext:
        fsGroup: 1000 
        runAsUser: 0
      containers:
      - name: jenkins
        image: dogsnack/dockerwithjenkins:latest
        ports:
          - name: http-port
            containerPort: 8080
          - name: jnlp-port
            containerPort: 50000
        volumeMounts:
          - name: jenkins-vol
            mountPath: /var/jenkins_home
          - name: docker-socket
            mountPath: /var/run
      volumes:
        - name: jenkins-vol
          hostPath:
            path: /jenkins-home
            type: DirectoryOrCreate
        - name: docker-socket
          hostPath:
            path: /run
            type: DirectoryOrCreate

 

이후 jenkins-service.yaml 파일을 작성합니다.

 - nodePort를 지정하여 외부에서 워커 노드의 공인 아이피와 nodePort로 접속할 수 있도록 합니다.

jenkins-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: jenkins
spec:
  type: NodePort
  ports:
    - port: 8080
      targetPort: 8080
      nodePort: 30000
  selector:
    app: jenkins

---
apiVersion: v1
kind: Service
metadata:
  name: jenkins-jnlp
spec:
  type: ClusterIP
  ports:
    - port: 50000
      targetPort: 50000
  selector:
    app: jenkins

 

 

3. kubectl 명령어를 이용하여 k8s cluster에 jenkins 배포

jenkins라는 이름의 네임 스페이스를 생성하고 2개의 manifest 파일을 배포합니다.

배포 이후 kubectl get all -n jenkins 명령어를 통해 특정 네임스페이스에 배포한 리소스를 전부 확인할 수 있습니다.

kubectl create namespace jenkins
kubectl apply -f jenkins-deployment.yaml -n jenkins
kubectl apply -f jenkins-service.yaml -n jenkins

kubectl get all -n jeknins

 

jenkins 홈페이지 접속 시 Administrator 비밀번호가 필요하므로 위에서 조회한 jenkins pod를 통해서 비밀번호를 조회합니다.

 - pod 정보를 정확히 기록하여 명령어를 작성합니다.

 - kubectl exec 명령어를 사용할 때 -- 옵션을 주면 pod에 직접 들어가지 않고도 원하는 명령을 수행할 수 있습니다.

 - 명령어를 통해 확인한 admin 비밀번호를 기록합니다.

kubectl exec -it pod/jenkins-deployment-56fb4b665-nrb9r -n jenkins -- cat /var/jenkins_home/secrets/initialAdminPassword

 

4. jenkins 접속 및 초기 플러그인 설치

kubectl 명령어를 통해 jenkins pod가 배포된 worker node를 확인한 다음 NCP Console에서 공인 아이피를 확인합니다.

kubectl get pod -n jenkins -o wide

 

NCP Console Server > ACG에서 nodePort로 설정한 값을 Inbound에 등록한 후

[워커노드의 공인아이피]:30000 로 접속합니다. - 175.45.200.6:30000

 

이전에 kubectl exec 명령어로 확인한 admin 비밀번호를 입력하고 홈페이지에 접속합니다.

플러그인 설치를 위해 Install suggested plugins를 클릭합니다.

 

플러그인 설치에는 시간이 다소 소요되며 에러가 발생하지 않았다면 jenkins에서 제안하는 기초 플러그인은 모두 설치가 완료된 것입니다.

 

jenkins 홈페이지에 접속할 계정을 생성합니다.

 

모든 과정을 마친 후 정상적으로 jenkins 홈페이지의 모습을 확인할 수 있습니다.

 

[여담]

엔지니어분들이라면 설치자체는 크게 어렵지 않으실 것 같습니다.(아마도..?)

이후에는 실제로 사용하는 방법에 대해서 본격적으로 다뤄보도록 하겠습니다 :)