이 문서에서는 Helm chart를 사용하여 Jenkins를 Kubernetes 클러스터에 설치해보겠습니다. 자세한 내용은 Jenkins Helm Chart에서 참고하세요.

준비 사항

Helm 설치하기 문서를 참고하여 Helm Client를 설치합니다.

빠른 설치

  1. Jenkins를 설치할 namespace를 생성합니다.

     kubectl create namespace jenkins
    
  2. Helm 명령을 실행하여 Jenkins를 설치합니다. release명은 jenkins-release로 namespace는 위의 1번에서 생성한 jenkins를 지정합니다.

     $ helm install --name jenkins-release --namespace jenkins \
     stable/jenkins
     NAME:   jenkins
     ...
     NOTES:
     1. Get your 'admin' user password by running:
       printf $(kubectl get secret --namespace default jenkins -o jsonpath="{.data.jenkins-admin-password}" | base64 --decode);echo
     2. Get the Jenkins URL to visit by running these commands in the same shell:
       NOTE: It may take a few minutes for the LoadBalancer IP to be available.
             You can watch the status of by running 'kubectl get svc --namespace default -w jenkins'
       ...
       echo http://$SERVICE_IP:8080/login
    
     3. Login with the password from step 1 and the username: admin
    
     For more information on running Jenkins on Kubernetes, visit:
     https://cloud.google.com/solutions/jenkins-on-container-engine
    

정상적으로 설치가 완료되었다면 NOTES의 가이드를 참고하여 Jenkins 대시보드에 접속할 수 있습니다.

경고

기본 설정을 사용하므로 클러스터가 설치된 환경에 따라 설치 중 에러가 발생할 수 있습니다. 이런 경우 아래 가이드를 따라 사용자 설정 방식으로 배포 할 수 있습니다.

사용자 정의 설치

설정

사용자의 Kubernetes 클러스터 환경에 맞게 Jenkins의 서비스, 스토리지 등의 설정을 변경할 수 있습니다. 아래 가이드를 참고하여 사용자의 환경에 맞도록 values.yaml 파일을 작성합니다.

Jenkins admin 사용자 암호

Jenkins admin의 초기 사용자 암호입니다. 기본 설정은 랜덤한 패스워드입니다.

<values.yaml>
Master:
  AdminPassword: ExamplePassword

서비스

서비스는 Jenkins 대시보드를 접속을 어떤 방식으로 제공할지에 대한 설정입니다. 기본 설정은 LoadBalancer 방식입니다. 사용자의 클러스터의 환경에 동적으로 제공되는 LoadBalancer 서비스가 있다면 사용 가능합니다. LoadBalancer 서비스가 없다면 아래와 같이 NodePort 또는 Ingress 방식을 사용할 수 있습니다.

  • NodePort

    NodePort를 사용하면 Worker Node의 Public IP를 통하여 서비스에 접근 할 수 있습니다. ServiceType을 NodePort로 설정하고 NodePort에 30000~32767사이의 포트 번호를 입력합니다. 포트 번호를 입력하지 않으면 30000~32767사이의 숫자에서 랜덤하게 선택됩니다.

    접속 URI 예시 : http://WORKER_NODE_PUBLIC_IP:3xxxx

    <values.yaml>
    Master:
      ServiceType: NodePort
      NodePort: 30000-32767
    
  • Ingress

    Ingress를 사용하면 Ingress Controller의 Public IP를 통하여 서비스에 접근 할 수 있습니다. ServiceType을 ClusterIP로 설정하고 HostName에 원하는 도메인을 입력합니다.(이 때 도메인이 Ingress Controller의 Public IP와 연결되어야 합니다.) SSL 접속을 지원하려면 TLS 설정의 secretName과 host명을 입력합니다.

    Ingress TLS Secret 생성 방법은 아래 가이드를 참고하세요.

    Ingress TLS Secret 생성하기

    <values.yaml>
    Master:
      ServiceType: ClusterIP
      HostName: jenkins.example.com
      Ingress:
        TLS:
          - secretName: example-tls
            hosts:
              - jenkins.example.com
    

스토리지

Jenkins는 영구적으로 저장해야 하는 데이터를 /var/jenkins_home에 저장합니다. 이 데이터를 영구적으로 저장하기 위해서는 /var/jenkins_home 폴더를 PV(Persistent Volume)에 mount 해야합니다. 사용자의 Cluster에서 동적으로 PV를 생성 및 관리해주는 기능이 있다면 별도의 설정이 필요없습니다. GKE, AWS, AKS 등의 환경에서는 Storage Class를 정의하면 PV를 생성하고 관리합니다. 또한 미리 구성된 PVC(PersistentVolumeClaim)를 사용할 수 있습니다.

  • Storage Class 사용

    Storage Class를 사용하여 동적으로 PV를 생성합니다. Storage Class 명은 아래와 같이 확인할 수 있습니다.

    $ kubectl get storageclass
    NAME                       PROVISIONER         AGE
    default                    ibm.io/ibmc-file    41d
    ibmc-block-bronze          ibm.io/ibmc-block   3d
    ibmc-file-bronze           ibm.io/ibmc-file    26d
    ...
    

    원하는 Storage Class 명을 입력합니다. Storage의 크기를 원하는 값으로 설정합니다.

    <values.yaml>
    Persistence:
      StorageClass: "default"
      Size: 8Gi
    
  • 사전 구성된 PVC 사용

    미리 구성된 PVC(PersistentVolumeClaim)를 사용합니다. 미리 구성된 PVC 명은 아래와 같이 확인할 수 있습니다.

    $ kubectl get pvc
    NAME          STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS        AGE
    jenkins-pvc   Bound     pvc-47aec304-5e4e-11e8-915d-82c09a00d8d2   20Gi       RWO            ibmc-block-bronze   3d
    

    미리 구성된 PVC 명을 입력합니다.

    <values.yaml>
    Persistence:
      ExistingClaim: "jenkins-pvc"
    

설치

이제 아래 명령을 실행하여 사용자 정의에 맞게 Jenkins를 설치합니다.

$ helm install --name jenkins -f values.yaml stable/jenkins