ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • jenkins를 kubernetes 에 구성하기
    NAVER Cloud 2021. 10. 22. 11:21

    대부분의 CSP에서 ci/cd 관련한 상품들을 제공하고 있지만, 여전히 jenkins 사용자도 많은 것 같다.  

    그래서 jenkins 도 kubernetes 에 pod로 구성하고, 빌드도 네이버클라우드의 kubernetes 서비스(nks)를 통해 진행하는 테스트를 해보았다. 

     

    1. jenkins 배포 

    아래 mainfest 를 참고하여 jenkins deployment 와 service를 생성해준다.

    나는 jenkins 에서 nks를 연계하여 사용할 수 있고, 빌드가 되는 정도만 확인하는 수준이라 jenkins deployment에 별도의 pv 설정을 하지 않았지만 운영환경에서는 pv 사용이 필요할 것으로 생각된다. 

    # jenkins_deployment.yaml
    
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: jenkins
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: jenkins
      template:
        metadata:
          labels:
            app: jenkins
        spec:
          containers:
          - name: jenkins
            image: jenkins/jenkins:lts
            ports:
              - name: http-port
                containerPort: 8080
              - name: jnlp-port
                containerPort: 50000
            volumeMounts:
              - name: jenkins-vol
                mountPath: /var/jenkins_vol
          volumes:
            - name: jenkins-vol
              emptyDir: {}

    jenkins service의 경우 나는 nodeport를 사용하는 예제가 많이 있지만, 외부에서도 접속하기 위해 LoadBalancer 타입으로 생성했다. 

    jenkins-jnlp 같은 경우에는 빌드할때 시스템간에만 사용하는 것 아닐까 싶어 ClusterIP 타입으로 생성했었는데, Build 할 때 jenkins 에서 jnlp 서비스를 접근하지 못하니 계속 에러가 났다. jenkins-jnlp 도 외부에서 접속할 수 있게 LB 타입으로 변경하니 정상적으로 빌드가 수행되었다. 

    # jenkins_service.yaml
    
    apiVersion: v1
    kind: Service
    metadata:
      name: jenkins
    spec:
      type: LoadBalancer
      ports:
        - port: 8080
          targetPort: 8080
          nodePort: 30000
      selector:
        app: jenkins
    
    ---
    
    apiVersion: v1
    kind: Service
    metadata:
      name: jenkins-jnlp
    spec:
      type: LoadBalancer
      ports:
        - port: 50000
          targetPort: 50000
      selector:
        app: jenkins

    jenkins service는 jenkins web-ui를 위한 jenkins 서비스와 jenkins-jnlp 서비스 2가지를 생성한다. 

    # 1. jenkins namespace 생성
    kubectl create namespace jenkins
    
    # 2. jenkins_deployment.yaml 배포 
    kubectl apply -f jenkins_deployment.yaml
    
    # 3. jenkins_service.yaml 배포 
    kubectl apply -f jenkins_service.yaml

    생성된 리소스를 보면 아래와 같다. 

    NAME                           READY   STATUS    RESTARTS   AGE
    pod/jenkins-784f598f48-llrdb   1/1     Running   0          46h
    
    NAME                   TYPE           CLUSTER-IP       EXTERNAL-IP                                                          PORT(S)           AGE
    service/jenkins        LoadBalancer   198.19.193.176   jenkins-jenkins-00000-8575147-bb17dff9a968.kr.lb.naverncp.com        8080:30000/TCP    2d
    service/jenkins-jnlp   LoadBalancer   198.19.185.12    jenkins-jenkins-jnlp-00000-8605873-a1d85fb70abb.kr.lb.naverncp.com   50000:30268/TCP   2d
    
    NAME                      READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/jenkins   1/1     1            1           2d
    
    NAME                                 DESIRED   CURRENT   READY   AGE
    replicaset.apps/jenkins-784f598f48   1         1         1       2d

     

    2. jenkins 접속

    jenkins 서비스를 LB 타입으로 생성했기 때문에 EXTERNAL-IP 로 조회된 LB 도메인을 브라우저에서 조회한다. 

    최초로 접속하면 unlock key를 넣어줘야 하는데 jenkins pods의 로그를 조회해 보면 확인할 수 있다. 

    # jenkins pod 조회
    kubectl get pods -n jenkins
    NAME                       READY   STATUS    RESTARTS   AGE
    jenkins-784f598f48-wtgnz   1/1     Running   0          9m12s
    
    # jenkins pod log 조회 (로그 마지막 부분에 있다.)
    kubectl logs jenkins-784f598f48-wtgnz -n jenkins
    ...
    *************************************************************
    
    Jenkins initial setup is required. An admin user has been created and a password generated.
    Please use the following password to proceed to installation:
    
    10f8265913b948c5b44b43106dd3616b
    
    This may also be found at: /var/jenkins_home/secrets/initialAdminPassword
    
    *************************************************************

    로그인에 성공하면 plugin 을 설치하라고 나오는데 이상하게 이때 어떤 버튼이든 누르면 에러가 발생한다. 원인을 찾아보려고 스택오버플로우를 봤더니 pod를 재생성 해보라고 해서 속는셈 치고 해봤더니 잘됨 ;; 

    jenkins pod는 deployment로 배포했기 때문에 삭제해도 바로 자동 재생성된다. 쫄지말고 그냥 지우시라.

    kubectl get pods -n jenkins
    NAME                       READY   STATUS    RESTARTS   AGE
    jenkins-784f598f48-wtgnz   1/1     Running   0          12m
    
    kubectl delete pods jenkins-784f598f48-wtgnz -n jenkins
    pod "jenkins-784f598f48-wtgnz" deleted
    
    kubectl get pods -n jenkins
    NAME                       READY   STATUS    RESTARTS   AGE
    jenkins-784f598f48-mwl4v   1/1     Running   0          12s
    
    #pod가 재생성되었기 때문에 로그인 키값이 변경되었을 것이다. 다시 pod 로그 조회해서 키값 get
    kubectl logs jenkins-784f598f48-mwl4v -n jenkins

    그럼 이렇게 플러그인이 잘 설치된다. 

    접속할 계정 정보를 넣어주고 jenkins url 설정해주고
    이 화면이 나오면 설치 끝!

    이제 kubernetes 에 jenkins 설치는 완료했고, kubernetes 사용을 위해 plugin 설치하는 방법은 다음 게시물에서 다루도록 하겠다. 

    반응형

    댓글

Designed by Tistory.