본문 바로가기
시스템/쿠버네티스

[쿠버네티스] k8s 젠킨스 설치

by cbwstar 2024. 1. 9.
728x90
반응형

/* 쿠버네티스에 젠킨스 설치시 영구 저장을 위해서 스토리지를 생성한다. */

참고 : https://kubernetes.io/ko/docs/concepts/storage/storage-classes/#nfs

 

스토리지 클래스

이 문서는 쿠버네티스의 스토리지클래스의 개념을 설명한다. 볼륨과 퍼시스턴트 볼륨에 익숙해지는 것을 권장한다. 소개 스토리지클래스는 관리자가 제공하는 스토리지의 "classes"를 설명할 수

kubernetes.io

1. StorageClass 생성

    vi storageClass-local-storage.yaml  

shell
닫기
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: ​​name: local-storage provisioner: kubernetes.io/no-provisioner volumeBindingMode: WaitForFirstConsumer

  1) 스토리지 클래스 생성 

root@master:~/jenkins# kubectl apply -f ./storageClass-local-storage.yaml
storageclass.storage.k8s.io/local-storage created

   2) Persistent Volume 생성

root@node1:~# mkdir -p /kubernetes/data/pv/jenkins
root@node1:~# chmod 777 /kubernetes/data/pv/jenkins

  3) pv 생성

   vi pv-jenkins.yaml

shell
닫기
apiVersion: v1 kind: PersistentVolume metadata: ​​name: pv-jenkins spec: ​​capacity: ​​​​storage: 30Gi ​​accessModes: ​​​​- ReadWriteOnce ​​persistentVolumeReclaimPolicy: Retain ​​storageClassName: local-storage ​​local: ​​​​path: /kubernetes/data/pv/jenkins ​​nodeAffinity: ​​​​required: ​​​​​​nodeSelectorTerms: ​​​​​​​​- matchExpressions: ​​​​​​​​​​​​- key: kubernetes.io/hostname ​​​​​​​​​​​​​​operator: In ​​​​​​​​​​​​​​values: ​​​​​​​​​​​​​​​​- node1

30GB 의 용량으로 설정하고 하나의 pod 만 접근하기 때문에 ReadWriteOnce, pod 가 삭제되더라도 데이터 보존을 위해 Retain 전략으로 설정합니다. NodeAffinity 설정을 통해 node1 에 pv 를 생성하도록 합니다. 즉, Jenkins pv 는 node1 노드에 만들어지고 Jenkins pod 역시 node1노드에 생성되게 됩니다.

 

4) jenkins 네임스페이스 생성

$ kubectl create namespace jenkins

$ kubectl apply -f ./pv-jenkins.yaml -n jenkins
persistentvolume/pv-jenkins created

 

5) Persistnet Volume Claim 생성

$ vi pvc-jenkins.yaml

shell
닫기
kind: PersistentVolumeClaim apiVersion: v1 metadata: ​​name: pvc-jenkins spec: ​​accessModes: ​​​​- ReadWriteOnce ​​storageClassName: local-storage ​​resources: ​​​​requests: ​​​​​​storage: 30Gi

위에서 생성한 local-storage 타입으로 30기가 용량의 pvc를 생성합니다.

root@master:~/jenkins# kubectl apply -f ./pvc-jenkins.yaml -n jenkins
persistentvolumeclaim/pvc-jenkins created

6) pv 상태 조회

$ kubectl get pv

shell
닫기
root@master:~/jenkins# kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE pv-jenkins 30Gi RWO Retain Available local-storage <unset> 5m24s /* VolumeBindingMode 를 WaitForFirstConsumer로 설정했기 때문에 Status 가 아직 Available 인 점을 확인할 수 있습니다. */

7) pvc 상태 조회

$ kubectl get pvc pvc-jenkins -n jenkins

shell
닫기
root@master:~/jenkins# kubectl get pvc pvc-jenkins -n jenkins NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE pvc-jenkins Pending local-storage <unset> 3m33s /* 상태가 pending 입니다. */

 

2.  Jenkins 설치

  1) Deployment 생성

shell
닫기
$ vi deployment-jenkins.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 ​​​​​​​​imagePullPolicy: "IfNotPresent" ​​​​​​​​securityContext: #root 권한 ​​​​​​​​​​runAsUser: 0 ​​​​​​​​ports: ​​​​​​​​​​- name: http-port ​​​​​​​​​​​​containerPort: 8080 ​​​​​​​​​​- name: jnlp-port ​​​​​​​​​​​​containerPort: 50000 ​​​​​​​​volumeMounts: ​​​​​​​​​​- name: jenkins-home ​​​​​​​​​​​​mountPath: /var/jenkins_home ​​​​​​​​​​- name: docker-socket ​​​​​​​​​​​​mountPath: /var/run/docker.sock ​​​​​​​​​​- name: docker-binary ​​​​​​​​​​​​mountPath: /usr/bin/docker ​​​​​​volumes: ​​​​​​​​- name: jenkins-home ​​​​​​​​​​persistentVolumeClaim: ​​​​​​​​​​​​claimName: pvc-jenkins ​​​​​​​​- name: docker-socket ​​​​​​​​​​hostPath: ​​​​​​​​​​​​path: /var/run/docker.sock ​​​​​​​​- name: docker-binary ​​​​​​​​​​hostPath: ​​​​​​​​​​​​path: /usr/bin/docker

  

shell
닫기
$ kubectl apply -f ./deployment-jenkins.yaml -n jenkins

  2) pod 상태 확인

shell
닫기
root@master:~/jenkins# kubectl get pods -n jenkins -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES jenkins-8d76965bc-wbw28 1/1 Running 0 107s 10.1.166.142 node1 <none> <none>

 3) node1에만 생성되는지 삭제 테스트

kubectl delete pods jenkins-8d76965bc-wbw28 -n jenkins

 

  4) 젠킨스를 외부에 노출하기 위한 서비스 NodePort 생성

shell
닫기
vi service-jenkins.yaml apiVersion: v1 kind: Service metadata: ​​name: jenkins spec: ​​type: NodePort ​​ports: ​​​​- port: 8080 ​​​​​​targetPort: 8080 ​​​​​​nodePort: 30000 ​​selector: ​​​​app: jenkins --- apiVersion: v1 kind: Service metadata: ​​name: jenkins-jnlp spec: ​​type: NodePort ​​ports: ​​​​- port: 50000 ​​​​​​targetPort: 50000 ​​​​​​nodePort: 30001 ​​selector: ​​​​app: jenkins

  5) 서비스 생성

shell
닫기
kubectl apply -f ./service-jenkins.yaml -n jenkins

  6) 서비스 기동 확인

shell
닫기
root@master:~/jenkins# kubectl get services -n jenkins NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE jenkins NodePort 10.106.63.3 <none> 8080:30000/TCP 19s jenkins-jnlp NodePort 10.105.220.170 <none> 50000:30001/TCP 18s

  7) 포드 네임 확인후 로그에서 관리자 패스워드 확인

shell
닫기
root@master:~/jenkins# kubectl get pods -n jenkins NAME READY STATUS RESTARTS AGE jenkins-97fb8547b-tvnnh 1/1 Running 0 5m51s /* 로그에서 관리자 패스워드 확인 */ root@master:~/jenkins# kubectl logs jenkins-97fb8547b-tvnnh -n jenkins Running from: /usr/share/jenkins/jenkins.war webroot: /var/jenkins_home/war 2024-01-08 23:47:41.719+0000 [id=1] INFO winstone.Logger#logInternal: Beginning extraction from war file 2024-01-08 23:47:43.414+0000 [id=1] WARNING o.e.j.s.handler.ContextHandler#setContextPath: Empty contextPath 2024-01-08 23:47:43.476+0000 [id=1] INFO org.eclipse.jetty.server.Server#doStart: jetty-10.0.18; built: 2023-10-27T01:59:58.245Z; git: 8545fd9bf4cd0d0838f626b405fd4963441546b7; jvm 17.0.9+9 2024-01-08 23:47:43.802+0000 [id=1] INFO o.e.j.w.StandardDescriptorProcessor#visitServlet: NO JSP Support for /, did not find org.eclipse.jetty.jsp.JettyJspServlet 2024-01-08 23:47:43.850+0000 [id=1] INFO o.e.j.s.s.DefaultSessionIdManager#doStart: Session workerName=node0 2024-01-08 23:47:44.392+0000 [id=1] INFO hudson.WebAppMain#contextInitialized: Jenkins home directory: /var/jenkins_home found at: EnvVars.masterEnvVars.get("JENKINS_HOME") 2024-01-08 23:47:44.500+0000 [id=1] INFO o.e.j.s.handler.ContextHandler#doStart: Started w.@6778aea6{Jenkins v2.426.2,/,file:///var/jenkins_home/war/,AVAILABLE}{/var/jenkins_home/war} 2024-01-08 23:47:44.510+0000 [id=1] INFO o.e.j.server.AbstractConnector#doStart: Started ServerConnector@6955cb39{HTTP/1.1, (http/1.1)}{0.0.0.0:8080} 2024-01-08 23:47:44.521+0000 [id=1] INFO org.eclipse.jetty.server.Server#doStart: Started Server@7c098bb3{STARTING}[10.0.18,sto=0] @3529ms 2024-01-08 23:47:44.543+0000 [id=25] INFO winstone.Logger#logInternal: Winstone Servlet Engine running: controlPort=disabled 2024-01-08 23:47:44.756+0000 [id=33] INFO jenkins.InitReactorRunner$1#onAttained: Started initialization 2024-01-08 23:47:44.765+0000 [id=32] INFO jenkins.InitReactorRunner$1#onAttained: Listed all plugins 2024-01-08 23:47:45.655+0000 [id=36] INFO jenkins.InitReactorRunner$1#onAttained: Prepared all plugins 2024-01-08 23:47:45.658+0000 [id=36] INFO jenkins.InitReactorRunner$1#onAttained: Started all plugins 2024-01-08 23:47:45.665+0000 [id=35] INFO jenkins.InitReactorRunner$1#onAttained: Augmented all extensions 2024-01-08 23:47:46.171+0000 [id=31] INFO jenkins.InitReactorRunner$1#onAttained: System config loaded 2024-01-08 23:47:46.172+0000 [id=31] INFO jenkins.InitReactorRunner$1#onAttained: System config adapted 2024-01-08 23:47:46.172+0000 [id=36] INFO jenkins.InitReactorRunner$1#onAttained: Loaded all jobs 2024-01-08 23:47:46.174+0000 [id=36] INFO jenkins.InitReactorRunner$1#onAttained: Configuration for all jobs updated 2024-01-08 23:47:46.218+0000 [id=49] INFO hudson.util.Retrier#start: Attempt #1 to do the action check updates server 2024-01-08 23:47:46.599+0000 [id=34] INFO jenkins.install.SetupWizard#init: ************************************************************* ************************************************************* ************************************************************* Jenkins initial setup is required. An admin user has been created and a password generated. Please use the following password to proceed to installation: 4adb6c4d31034b9382ff8d514071bc80 This may also be found at: /var/jenkins_home/secrets/initialAdminPassword ************************************************************* ************************************************************* ************************************************************* 2024-01-08 23:48:04.365+0000 [id=33] INFO jenkins.InitReactorRunner$1#onAttained: Completed initialization 2024-01-08 23:48:04.380+0000 [id=24] INFO hudson.lifecycle.Lifecycle#onReady: Jenkins is fully up and running 2024-01-08 23:48:05.423+0000 [id=49] INFO h.m.DownloadService$Downloadable#load: Obtained the updated data file for hudson.tasks.Maven.MavenInstaller 2024-01-08 23:48:05.423+0000 [id=49] INFO hudson.util.Retrier#start: Performed the action check updates server successfully at the attempt #1

  8) 젠킨스 내부 접속 아이피 확인

shell
닫기
kubectl get nodes -o wide root@master:~/jenkins# kubectl get nodes -o wide NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME master Ready control-plane 3d1h v1.29.0 10.0.100.2 <none> Ubuntu 22.04.3 LTS 5.15.0-91-generic containerd://1.7.2 node1 Ready <none> 3d v1.29.0 10.0.100.3 <none> Ubuntu 22.04.3 LTS 5.15.0-91-generic containerd://1.7.2 node2 Ready <none> 3d v1.29.0 10.0.100.4 <none> Ubuntu 22.04.3 LTS 5.15.0-91-generic containerd://1.7.2 node3 Ready <none> 3d v1.29.0 10.0.100.5 <none> Ubuntu 22.04.3 LTS 5.15.0-91-generic containerd://1.7.2 /* 마스터 또는 노드 아이피로 젠킨스 서버에 접속 되는지 확인 */ /* 외부 접속 노드 포트 확인 */ root@master:~/jenkins# kubectl get service -n jenkins NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE jenkins NodePort 10.104.2.121 <none> 8080:30000/TCP 8m27s jenkins-jnlp ClusterIP 10.106.228.75 <none> 50000/TCP 8m27s /* 외부 접속 노드 포트 : 30000 */ /* 내부 접속 확인 */ $ curl http://10.0.100.2:30000 root@master:~/jenkins# curl http://10.0.100.2:30000 <html><head><meta http-equiv='refresh' content='1;url=/login?from=%2F'/><script>window.location.replace('/login?from=%2F');</script></head><body style='background-color:white; color:white;'> Authentication required <!-- --> </body></html> root@master:~/jenkins# curl http://10.0.100.3:30000 <html><head><meta http-equiv='refresh' content='1;url=/login?from=%2F'/><script>window.location.replace('/login?from=%2F');</script></head><body style='background-color:white; color:white;'> Authentication required <!-- --> </body></html> root@master:~/jenkins# curl http://10.0.100.4:30000 <html><head><meta http-equiv='refresh' content='1;url=/login?from=%2F'/><script>window.location.replace('/login?from=%2F');</script></head><body style='background-color:white; color:white;'> Authentication required <!-- --> </body></html> root@master:~/jenkins# curl http://10.0.100.5:30000 <html><head><meta http-equiv='refresh' content='1;url=/login?from=%2F'/><script>window.location.replace('/login?from=%2F');</script></head><body style='background-color:white; color:white;'> Authentication required <!-- --> </body></html> root@master:~/jenkins# /* 모든 노드 접속 확인 이상없으면 외부 포트 포트 포워딩하여 접속할수 있게 vm 포트 포워딩 추가 */

  9) vm 포트 포워딩 추가

10) 브라우저에서 접속되는지 확인

  http://192.168.2.50:30000

11) 샘플 파이프 라인 테스트

 

저장 버튼을 클릭하고 저장한다.

 

728x90
반응형


"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."