Jenkins
수정·

[MacOS] Jenkins Install using kubernetes

by Dohoon Kim · 23년 02월 14일 09:00:00

Kubernetes On MacOS

MacOS 에서 Docker 를 설치하게 되면 대시보드에서 Kubernetes 를 활성화 할 수 있습니다.이 기능을 이용하여 MacOS에서도 단일 노드 Kubernetes 환경을 구성하여 사용하는 것이 가능합니다.

Jenkins

Jenkins는 테스트 자동화를 비롯하여 전반적인 CI 그리고 CD 까지도 구축할 수 있는 유용한 툴입니다. 직접 빌드머신을 만들고 환경을 구축할 수 있지만, Kubernetes 또는 Docker 를 이용하여 편리하게 환경을 구축할 수 있습니다. 우선 아래 git 명령어를 실행하여 kubernetes resource 생성을 위한 manifest 파일들을 내려받습니다.

$ git clone https://github.com/scriptcamp/kubernetes-jenkins

필요한 manifest 파일을 다운 받은 뒤 현재 환경에서 실행시키기 위하여 volume.yaml 파일을 수정해야합니다.

원본 volume.yaml 파일은 다음과 같습니다.

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

---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: jenkins-pv-volume
  labels:
    type: local
spec:
  storageClassName: local-storage
  claimRef:
    name: jenkins-pv-claim
    namespace: devops-tools
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  local:
    path: /mnt
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - worker-node01

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: jenkins-pv-claim
  namespace: devops-tools
spec:
  storageClassName: local-storage
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 3Gi

여기서 Persistent Volume Resource 의 내용을 수정해야합니다. 2023년 2월자 최신 MacOS Docker 에서 제공하는 Kubernetes 버전은 1.25v 이고, 마스터 노드의 kubernetes.io/hostname 레이블이 docker-desktop 으로 지정되어있습니다. 따라서 PV의 nodeAffinity 부분의 matchExpressions 을 보시면 key : kubernetes.io/hostname 부분의 값이 worker-node01 지정되어있는 것을 확인하실 수 있는데 이것을 docker-desktop 으로 변경해주셔야 정상 동작합니다. 또한 .spec.local.path 의 경로를 원하는 경로로 수정해주셔야합니다. 저는 홈디렉토리에 .volumes 라는 디렉토리 내에 따로 관리를 하고 있습니다.

수정된 volumes.yaml 은 아래와 같습니다.

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

---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: jenkins-pv-volume
  labels:
    type: local
spec:
  storageClassName: local-storage
  claimRef:
    name: jenkins-pv-claim
    namespace: devops-tools
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  local:
    path: <Home Directory Path>/.volumes/jenkins
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - docker-desktop

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: jenkins-pv-claim
  namespace: devops-tools
spec:
  storageClassName: local-storage
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 3Gi

Deploy Jenkins

이제 필요한 manifest 파일 수정은 끝났습니다. 아래의 명령어를 순서대로 실행합니다.

$ kubectl apply -f namespace.yaml
$ kubectl apply -f serviceAccount.yaml
$ kubectl apply -f pv.yaml
$ kubectl apply -f deployment.yaml
$ kubectl apply -f service.yaml

위 명령어를 모두 실행 시키신 후 잠시 기다리시면 http://localhost:32000 경로를 통해 브라우저로 접근하시면 jenkins sign in 페이지가 뜨는것을 확인하실 수 있습니다. 로그인 페이지에서 요구하는 값을 얻으시려면 아래 명령어를 실행하시면 됩니다.

$ kubectl get pods -n devops-tools # jenkins pod 이름 확인
$ kubectl exec -it <jenkins-pod-name> -n devops-tools -- cat /var/jenkins_home/secrets/initialAdminPassword

변경을 원하시면 해당 파일의 값을 수정하시면 됩니다.