본문 바로가기

GAB STORY

일상 속 소소한 순간들과 개발 공부 과정에서의 다양한 경험들을 담아낸 공간입니다.
DEVELOPE/DevOps

Jenkins Manster, Slave on kubernetes

by 갑스토리 2023. 2. 14.

Jenkins Master

Jenkins 서버이자 Master node는 Jenkins Pipeline으로 정의된 모든 흐름을 관장하는 컨트롤 서버라고 할 수 있다. Jenkins Slave들에게 각각의 할 일을 정해주고 분배합니다.

 

Jenkins Slave(Agent)

Jenkins Job이 구동되는 Node(Pod)이며 JNLP(Jave Netwoork Launching Protocol)을 이용하여 Jenkins Master와 통신합니다.

 

 

 

 

설치

Kubernetes yml파일은 회사 보안 이슈로 공개하지 않겠습니다. 

 

 

첫 화면에 접속하면 InitialAdminPassword을 요청합니다. 가이드대로 k9s 또는 kubectl exec -it (pod 이름) /bin/bash을 이용하여 pod에 접속한 후 cat /var/jenkins_home/secrets/initialAdminPassword을 확인하여 기입합니다.

 

 

플러그인 설치시 Proxy 설정이 필요한 경우도 있습니다. 회사 Proxy 설정이 있다면 기입하세요.

 

 

 

Jenkins - github 연동

Github organization이 있다는 가정하에 설명하겠습니다.

Github에 접속하여 Profile -> Settings -> Developer settings -> Personal access tokens을 클릭하여 적절한 권한을 추가한 후 AccessToken을 발급 받습니다. (참고) 

 

이후 Jenkins 페이지에 들어가서 Jenkins 관리 -> 시스템 설정을 클릭합니다.

 

 

 

Credentials -> Add 버튼을 클릭하여 새로운 인증 방법을 생성합니다.

Kind는 Secret text을 선택하고 위에서 생성한 Github AccessToken을 추가합니다. (다른 종류의 인증 처리는 제대로 동작하지 않았습니다.)

 

Jenkins - Kubernetes 연동

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: jenkins-admin
rules:
  - apiGroups: [""]
    resources: ["*"]
    verbs: ["*"]

---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: jenkins-admin

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: jenkins-admin
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: jenkins-admin
subjects:
  - kind: ServiceAccount
    name: jenkins-admin
    namespace: default
    
---    

apiVersion: v1
kind: Service
metadata:
  name: jenkins-jnlp-svc
  labels:
    app: jenkins
spec:
  type: NodePort
  ports:
    - port: 50000
      targetPort: 50000
  selector:
    app: jenkins

 

Kubernetes에 Jenkins을 설치할때 NodePort 형태로 제공하는 JNLP Service와 ServiceAccount을 함께 생성해야합니다.

이렇게 생성한 ServiceAccount는 Kubernetes Cluster내에서 Pod 생성/관리하는데 사용되며 JNLP(Java Network Launching Protocol)는 Master와 Slave 통신을 위해 사용됩니다. 

Jenkins Tunnel 옵션은 k8s 설정기준으로 jenkins-jnlp-svc:50000이됩니다.

 

 

 

 

 

Jenkins - Github 조직 하위에 존재하는 Repository 연동

github branch source 플러그인을 이용하면 Github 조직 하위에 존재하는 Repository을 연동할 수 있습니다.

Jenkins 페이지에 접속한 후 새로운 Item 버튼 - 그룹핑한 이름을 기입한 후 Organization Folder 클릭합니다.

API endpoint을 기입한 후 Credentials을 통해 인증을 완료합니다. 현재는 ID/Password을 이용한 새로운 Credentials을 생성하여 사용했습니다.

Owner영역은 Github의 조직이름입니다.

 

 

 

스크롤을 밑으로 내리면 Pipeline jenkinsfile 부분이 있습니다. 이옵션은 Github Repository에 선언한 파일이름이 매칭되면 Repository을 연동 / 활용한다는 의미입니다.

현재는 Jenkinsfile-k8s으로 지정되어 있으니 이파일이 포함된 Repository만 로딩하게됩니다.

 

 

빌드 실패시 Rebuild을 위하여 GIthub에 comment에 명령어?와 비슷한 Action을 할때가 있습니다.

이기능을 활용하기 위해서는 GitHub PR Comment Build Plugin 플러그인 설치 후 Github → Settings → Hooks → Webhooks을 등록해야합니다. 이때 꼭 Issue comments 옵션은 선택해야합니다.

이후 정규식 패턴으로 어떤 Comment을 등록할지 설정합니다.

 

 

Jenkinsfile 생성

pipeline을 이용하여 사용할 Agent container을 선언한 후 stage을 설정하는 방법입니다.

agent 부분은 kubernetes로 선언하고 사용할 docker image(gradle)을 이용해 container을 생성합니다.

이후 stage / step에서 위에서 선언한 container을 기입하여 스크립트를 작성하면 됩니다.

 

 

pipeline {
    agent {
        kubernetes {
            label "jenkins-agent"
            cloud "kubernetes"
            yaml '''
apiVersion: v1
kind: Pod
metadata:
  namespace: default
  labels:
    job: jenkins-agent
spec:
  containers:
  - name: gradle-container
    image: gradle:7.4.2-jdk11
    imagePullPolicy: IfNotPresent
    tty: true
    command: ['cat']
    resources:
    requests:
      cpu: 2000m
      memory: 1Gi
    limits:
      cpu: 2000m
      memory: 1Gi
'''
        }
    }
    stages {
        stage("jenkins-agent") {
            steps {
                container("gradle-container") {
                    checkout scm
                    sh 'cd $WORKSPACE'
                    sh 'rm gradle.properties'
                    sh 'mv jenkins.gradle.properties gradle.properties'
                    sh './gradlew clean check --continue'
                    sh './gradlew test '
                }
            }
        }
    }
 
    post {
      failure {
        publishHTML allowMissing: false, alwaysLinkToLastBuild: true, keepAll: true, reportDir: "", reportFiles: "**/index.html", reportName: "Test Report"
      }
    }
}

 

 

 

 

대부분의 설정 정보를 제거하니 이해하는데 어려움이 있을것 같네요.🙈

참고 : https://access.redhat.com/documentation/ko-kr/openshift_container_platform/4.10/html/images/images-other-jenkins-kubernetes-plugin_images-other-jenkins

'DEVELOPE > DevOps' 카테고리의 다른 글

JDBC Flow (HikariCP, hibernate, JPA, DataSource)  (0) 2023.01.30
kubernetes 동작  (0) 2021.06.20

댓글