Jenkins를 Kubernetes 에 구성하기

merinTA ㅣ 2024. 3. 11. 18:18

반응형

Jenkins 를 Kubernetes에 구성해보려 한다.

Jenkins 또한 Kubernetes에 Pod로 구성하고, 빌드도 네이버클라우드의 Kubernetes(NKS)를 통해 진행해보려 한다.

 

 

출처 : https://findmypiece.tistory.com/350

 

Jenkins 에서 마스터노드에서 전체 Job 을 관리하지만 실제 Job 수행은 Slave 노드에서 하도록 하는 것이 일반적인데 이 경우 Slave 노드가 유휴시간에도 자원을 차지한다는 단점이 있다.

이에 Kubernetes 일 때, Slave 노드 대신 컨테이너에서 Job 을 수행하도록 하고 작업이 끝나면 해당 컨테이너를 종료하는 방식이다.

 

 

1. 네임스페이스 생성 : Jenkins를 배포할 네임스페이스를 생성한다. 네임스페이스는 리소스를 그룹화하고 격리할 수 있다.

kubectl create namespace jenkins

 

 

2. PersistentVolumeClaim(PVC) 생성 : Jenkins 데이터를 유지하려면 PVC를 생성한다. (선택사항)

# jenkins_pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: jenkins-data
  namespace: jenkins
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi
kubectl apply -f jenkins_pvc.yaml

 

3. Jenkins Deployment 및 Service 생성 : Jenkins를 배포하고 외부에서 접근할 수 있는 서비스를 생성한다.

# jenkins_deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: jenkins
  namespace: jenkins
spec:
  replicas: 1
  selector:
    matchLabels:
      app: jenkins
  template:
    metadata:
      labels:
        app: jenkins
    spec:
      containers:
      - name: jenkins
        image: jenkins/jenkins:lts
        ports:
          - name: http
            containerPort: 8080
          - name: jnlp
            containerPort: 50000
        volumeMounts:
          - name: jenkins-data
            mountPath: /var/jenkins_home
      volumes:
        - name: jenkins-data
          persistentVolumeClaim:
            claimName: jenkins-data

---
apiVersion: v1
kind: Service
metadata:
  name: jenkins
  namespace: jenkins
spec:
  type: LoadBalancer
  selector:
    app: jenkins
  ports:
    - name: http
      port: 8080
      targetPort: http
      protocol: TCP
    - name: jnlp
      port: 50000

 

 

 

생성된 리소스를 확인한다.

 

 

생성된 리소스를 통해 Jenkins 서비스의 External IP 와 포트를 확인했다.

 

1. Jenkins 배포 매니페스트 작성 : Kubernetes에 Jenkins를 배포하기 위한 매니페스트 파일을 작성해야 한다.

 

apiVersion: v1
kind: Service
metadata:
  name: jenkins
spec:
  selector:
    app: jenkins
  ports:
    - name: http
      protocol: TCP
      port: 8080
      targetPort: 8080
    - name: agent
      protocol: TCP
      port: 50000
      targetPort: 50000
  type: ClusterIP

 

  • 매니페스트 적용 : 작성한 매니페스트 파일을 사용하여 Kubernetes 클러스터에 Jenkins 를 배포한다.
kubectl apply -f jenkins.yaml

 

  • Jenkins 서비스 유형 변경 : 외부로 Jenkins를 노출시키기위해 LoadBalancer를 사용한다.
kubectl patch svc jenkins -p '{"spec": {"type": "LoadBalancer"}}'

 

 

해당 화면이 지나고, Password 를 입력해야한다. 

docker logs [ContainerID]

 

CotainerID 는 docker ps 에서 나온다.

 

 

 

 

 

Dashboard > Jenkins 관리 > Clouds > New cloud

 

 

Kubernetes URL 

kubectl cluster-info

 

로 나오는 값을 통해 알 수 있다.

 

 

Jenkins tunnel 부분은 pipeline 등으로 pod 빌드 시 jnlp 통신을 위해서 꼭 정확하게 입력해야하는 주소이다.

내부 IP 는 Service.yaml 에서 50000으로 설정해둔 상태이므로 ClusterIP:50000 으로 입력한다. Cluster IP 는 get svc 명령으로 알 수 있다.

 

root@ptty-nks-mgmt:~# k get svc -n devops-tools
NAME              TYPE           CLUSTER-IP      EXTERNAL-IP                                                               PORT(S)                          AGE
jenkins-service   LoadBalancer   198.19.155.28   devops-tool-jenkins-serv-1820b-23034749-6c4c7169236c.kr.lb.naverncp.com   8080:32190/TCP,50000:31410/TCP   95m

 

 

 

 

Test Pipeline 수행

Jenkins Dashboard >< Test Pipeline > Configuration

 

테스트로 Build pipeline을 생성해 본다.

 

 

 

 

 

빌드가 완료 되었다. 테스트 파이프라인을 통해 Jenkins 의 Pipeline 기능을 성공적으로 테스트 했다.

더 다양한 배포 프로세스를 관리하기 위해 추가적인 테스트를 할 계획이다. Jenkins 의 Pipeline 기능을 사용하면 배포 프로세스를 관리하기 쉬울 것이며 어디서 오류가 생긴 것인지 쉽게 발견 가능하다. 따라서 프로젝트를 빌드하여 배포하는 과정을 scripted 버전과 declarative 버전의 스크립트로 작성해보고, 어떤 과정으로 Jenkins Pipeline 이 동작하는지 살펴볼 것이다.