Print
카테고리: [ Cloud Computing & MSA ]
조회수: 39454

1. 개요

Helm Chart를 통해 Jenkins를 설치하는 방법을 알아보려고 한다.

Jenkins 마스터를 쿠버네티스 클러스터에 별도 네임스페이스에 배포하면, 네임스페이스를 통해 Jenkins 배포에 대한 할당량을 만들 수 있고 클러스터 내 다른 배포와 논리적 구분이 가능해진다.


2. 설치

$ helm install --name my-jenkins-release stable/jenkins
NAME:   my-jenkins-release
LAST DEPLOYED: Wed Nov  6 02:45:33 2019
NAMESPACE: default
STATUS: DEPLOYED

RESOURCES:
==> v1/ConfigMap
NAME                      DATA  AGE
my-jenkins-release        5     1s
my-jenkins-release-tests  1     1s

==> v1/Deployment
NAME                READY  UP-TO-DATE  AVAILABLE  AGE
my-jenkins-release  0/1    1           0          1s

==> v1/PersistentVolumeClaim
NAME                STATUS   VOLUME  CAPACITY  ACCESS MODES  STORAGECLASS  AGE
my-jenkins-release  Pending  gp2     1s        Filesystem

==> v1/Pod(related)
NAME                                 READY  STATUS   RESTARTS  AGE
my-jenkins-release-767c845d4f-cjl97  0/1    Pending  0         1s

==> v1/Role
NAME                                AGE
my-jenkins-release-schedule-agents  1s

==> v1/RoleBinding
NAME                                AGE
my-jenkins-release-schedule-agents  1s

==> v1/Secret
NAME                TYPE    DATA  AGE
my-jenkins-release  Opaque  2     1s

==> v1/Service
NAME                      TYPE          CLUSTER-IP     EXTERNAL-IP  PORT(S)         AGE
my-jenkins-release        LoadBalancer  10.100.135.10      8080:30130/TCP  1s
my-jenkins-release-agent  ClusterIP     10.100.109.0          50000/TCP       1s

==> v1/ServiceAccount
NAME                SECRETS  AGE
my-jenkins-release  1        1s

NOTES:
1. Get your 'admin' user password by running:
  printf $(kubectl get secret --namespace default my-jenkins-release -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 my-jenkins-release'
  export SERVICE_IP=$(kubectl get svc --namespace default my-jenkins-release --template "{{ range (index .status.loadBalancer.ingress 0) }}{{ . }}{{ end }}")
  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


3. 접속

kubectl get svc 로 Jenkins의 EXTERNAL-IP를 확인하여 접속한다. 단 포트는 8080이다.

admin 계정 패스워드 확인 방법은 다음과 같다.

$ printf $(kubectl get secret --namespace default my-jenkins-release -o jsonpath="{.data.jenkins-admin-password}" | base64 --decode);echo

4. Docker로 Jenkins 설치 (참고)

$ sudo docker pull jenkins
Using default tag: latest
latest: Pulling from library/jenkins
55cbf04beb70: Pull complete
1607093a898c: Pull complete
9a8ea045c926: Pull complete
d4eee24d4dac: Pull complete
c58988e753d7: Pull complete
794a04897db9: Pull complete
70fcfa476f73: Pull complete
0539c80a02be: Pull complete
54fefc6dcf80: Pull complete
911bc90e47a8: Pull complete
38430d93efed: Pull complete
7e46ccda148a: Pull complete
c0cbcb5ac747: Pull complete
35ade7a86a8e: Pull complete
aa433a6a56b1: Pull complete
841c1dd38d62: Pull complete
b865dcb08714: Pull complete
5a3779030005: Pull complete
12b47c68955c: Pull complete
1322ea3e7bfd: Pull complete
Digest: sha256:eeb4850eb65f2d92500e421b430ed1ec58a7ac909e91f518926e02473904f668
Status: Downloaded newer image for jenkins:latest
$ sudo docker images
REPOSITORY                                                         TAG                 IMAGE ID            CREATED             SIZE
jenkins                                                            latest              cd14cecfdb3a        16 months ago       696MB

본인은 docker run -d -p 8080:8080 -v $HOME/jenkins/data:/var/jenkins_home:z -t jenkins/jenkins 를 통해 Jenkins를 실행했다. 알겠지만 홈 디렉토리 아래에 jenkins/data 디렉토리가 있어야 된다.

그리고 브라우저로 8080 접근하면 화면이 뜨는데, admin 패스워드는 다음과 같이 확인할 수 있다.


5. 참고

5.1. 서비스

Jenkins는 두가지 서비스를 제공한다.

---
  kind: Service
  apiVersion: v1
  metadata:
    name: jenkins-ui
    namespace: jenkins
  spec:
    type: NodePort
    selector:
      app: master
    ports:
      - protocol: TCP
        port: 8080
        targetPort: 8080
        name: ui
---
  kind: Service
  apiVersion: v1
  metadata:
    name: jenkins-discovery
    namespace: jenkins
  spec:
    selector:
      app: master
    ports:
      - protocol: TCP
        port: 50000
        targetPort: 50000
        name: slaves

5.2. Jenkins 배포 

Jenkins 마스터가 복제본 1개로 배포된 경우 클러스터에 단일 Jenkins 마스터가 실행된다.그리고 Jenkins 마스터 Pod가 종료되거나 실행중인 노드가 종료되면 쿠버네티스는 다른 곳에서 Pod를 다시 시작한다.