Jenkins 를 Kubernetes에 구성해보려 한다.
Jenkins 또한 Kubernetes에 Pod로 구성하고, 빌드도 네이버클라우드의 Kubernetes(NKS)를 통해 진행해보려 한다.
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 와 포트를 확인했다.
- External IP : 'jenkins-jenkins-791ab-22855803-81728ed0a248.kr.lb.naverncp.com'
- 포트
- 8080 : 웹 인터페이스에 액세스하기 위한 포트
- 50000 : 빌드 에이전트에 액세스하기 위한 포트 - Jenkins 웹 인터페이스 : http://jenkins-jenkins-791ab-22855803-81728ed0a248.kr.lb.naverncp.com:8080
- 빌드 에이전트 포트 : http://jenkins-jenkins-791ab-22855803-81728ed0a248.kr.lb.naverncp.com:50000
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 이 동작하는지 살펴볼 것이다.
'Kubernetes' 카테고리의 다른 글
실습으로 배우는 쿠버네티스 멀티 클러스터 관리 (0) | 2024.07.15 |
---|---|
Github WebHooks 연동하여 Jenkins 빌드 자동화 (0) | 2024.03.13 |
Jenkins를 이용해 지속적인 통합(CI) 적용하기 (0) | 2024.02.22 |
[CKA] Mock Exam - 3 (0) | 2023.11.30 |
[CKA] Mock Exam - 2 (0) | 2023.11.20 |