jenkins를 kubernetes 에 구성하기
대부분의 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
그럼 이렇게 플러그인이 잘 설치된다.
이제 kubernetes 에 jenkins 설치는 완료했고, kubernetes 사용을 위해 plugin 설치하는 방법은 다음 게시물에서 다루도록 하겠다.