Jenkins에서 제공하는 helm chart를 이용하여 kubernetes 환경에서 Jenkins 및 agent 구축 및 운영

참고: https://github.com/jenkinsci/helm-charts/tree/main/charts/jenkins

 

 

 

1. Helm repository 추가 및 업데이트

helm repo add jenkins https://charts.jenkins.io
helm repo update

 

 

 

 

2. values.yaml 이용하여 jenkins 환경 설정

helm chart에서 제공하는 value 옵션을 참고하여 values.yaml 파일을 생성해 필요한 설정을 적용한다

value 옵션 참고: https://github.com/jenkinsci/helm-charts/blob/main/charts/jenkins/VALUES_SUMMARY.md

 

 

주요 설정 옵션

kubernetes 클러스터 관련

# For FQDN resolving of the controller service. Change this value to match your existing configuration.
# ref: https://github.com/kubernetes/dns/blob/master/docs/specification.md
clusterZone: "cluster.local"

# The URL of the Kubernetes API server
kubernetesURL: "https://kubernetes.default"

 

설치할 kubernetes의 클러스터의 도메인 및 API 서버 정보 적용

 

 

 

KST timezone 설정

controllers:
  containerEnv:
    - name: TZ
      value: "Asia/Seoul"
  initScripts: 
    - |
      System.setProperty('org.apache.commons.jelly.tags.fmt.timeZone', 'Asia/Seoul')
      System.setProperty('user.timezone', 'Asia/Seoul')

 

jenkins의 default timezone이 UTC이기 때문에, KST 기준으로 변경하기 위해 위의 설정 필요

  • initScripts로 jenkins에 jvm 옵션을 적용하여 시스템 전체의 timezone을 Asia/Seoul(KST) 로 변경
  • 시스템 설정을 변경하더라도 job 생성 시 주기적 실행을 위해 Build periodically - Schedule에 crontab으로 정의 시 UTC 기준으로 동작하므로, KST 기준으로 동작하게 하려면 TZ=Asia/Seoul 추가 필요

  • containerEnv로 controller 환경변수에 TZ="Asia/Seoul"을 설정해줄 경우 Schedule crontab이 KST기준으로 동작하여 별도의 timezone 설정 필요 없음

 

 

 

agent 설정

agent:
  enabled: true
  defaultsProviderTemplate: ""
  # URL for connecting to the Jenkins controller
  jenkinsUrl:
  # connect to the specified host and port, instead of connecting directly to the Jenkins controller
  jenkinsTunnel:
  ...

agent 옵션의 enabled 설정을 true로 적용할 경우, job 실행 시 지정 옵션대로 agent pod이 동적으로 생성되어 해당 pod에서 job 실행

 

※ agent pod를 별도로 띄워놓고 동작시키고 싶을 경우 별도의 pod(deployment) 생성해 controller와 연결 가능 (아래 별도 설명)

 

 

 

 

3. helm 배포로 jenkins 구축

helm install jenkins jenkins/jenkins . -f values.yaml -n jenkins
 
 
NAME: jenkins
LAST DEPLOYED: Sat Nov  11 12:00:57 2023
NAMESPACE: jenkins
STATUS: deployed
REVISION: 1
NOTES:
1. Get your 'admin' user password by running:
  kubectl exec --namespace jenkins -it svc/jenkins -c jenkins -- /bin/cat /run/secrets/additional/chart-admin-password && echo
2. Get the Jenkins URL to visit by running these commands in the same shell:
  echo http://127.0.0.1:8080
  kubectl --namespace jenkins port-forward svc/jenkins 8080:8080

3. Login with the password from step 1 and the username: admin
4. Configure security realm and authorization strategy
5. Use Jenkins Configuration as Code by specifying configScripts in your values.yaml file, see documentation: http:///configuration-as-code and examples: https://github.com/jenkinsci/configuration-as-code-plugin/tree/master/demos

For more information on running Jenkins on Kubernetes, visit:
https://cloud.google.com/solutions/jenkins-on-container-engine

For more information about Jenkins Configuration as Code, visit:
https://jenkins.io/projects/jcasc/


NOTE: Consider using a custom image with pre-installed plugins

NOTES 대로 kubectl 명령어를 실행해주면 jenkins 접속 시 admin의 password 확인할 수 있으며, 임의의 password를 지정하고 싶으면 values.yaml에  adminPassword를 지정해주면 됨

 

jenkins UI 접속도 마찬가지로 아래 명령어를 통해 port-forward해 http://127.0.0.1:8080 으로 접속 가능하며, values.yaml의 serviceType 옵션을 변경하거나, ingress를 enabled: true 로 활성화 및 옵션 지정하여 url설정 및 접속 가능하게 함  

 

 

 

 

 

 

 

4. agent pod 생성 및 controller 연결

1. Jenkins 관리 > Nodes > New Node에서 노드명, type 지정해 신규 노드 설정 생성

 

노드 설정 예시

  • 노드명: default-agent
  • Type: Permanent Agent
  • Remote root directory: /home/jenkins
  • Labels: default-agent
  • Usage: Use this node as much as possible 
  • Launch method: Launch agent by connecting it to the controller

 

2. 생성된 노드늘 눌러 상세 화면으로 들어간 후 agent의 command 라인의 secret 옵션값 복사

 

 

 

 

 

3. agent pod생성 후 controller와 연결해 job을 실행하기 위한 deployment yaml (default-agent.yaml) 생성

apiVersion: apps/v1
kind: Deployment
metadata:
  name: "jenkins-inbound-default-agent"
  labels:
    name: "jenkins-inbound-default-agent"
  namespace: "jenkins"
spec:
  replicas: 1
  selector:
    matchLabels:
      name: "jenkins-inbound-default-agent"
  template:
    metadata:
      labels:
        name: "jenkins-inbound-default-agent"
    spec:
      containers:
      - name: inbound-default-agent
        env:
        - name: "JENKINS_SECRET"
          value: "5d9a52efc22d85f3ed27c81c99c8434dfe05445bd38f0801fc545f3a1564e30d"
        - name: "JENKINS_TUNNEL"
          value: "jenkins-agent.jenkins.svc.cluster.local:50000"
        - name: "JENKINS_AGENT_NAME"
          value: "default-agent"
        - name: "JENKINS_NAME"
          value: "default-agent"
        - name: "JENKINS_AGENT_WORKDIR"
          value: "/home/jenkins/agent"
        - name: "JENKINS_URL"
          value: "http://jenkins.jenkins.svc.cluster.local:8080/"
        image: "jenkins/inbound-agent"
        imagePullPolicy: "Always"
        resources:
          limits:
            memory: "1Gi"
            cpu: "1024m"
          requests:
            memory: "1Gi"
            cpu: "1024m"
  • 위에서 복사한 secret 값을 JENKINS_SECRET 환경변수 값으로 적용

 

 

 

4. kubectl 명령어로 default-agent.yaml apply해 pod 생성

kubectl apply -f default-agent.yaml -n jenkins

 

 

 

5. 노드 생성 및 연결 확인

 

 

 

 

6. job 생성 시 label에 해당 노드의 label 적용해 지정 노드에서 job 실행 가능

 

 

 

 

'Kubernetes' 카테고리의 다른 글

CRD 제거 안될 때 조치  (1) 2023.11.24

+ Recent posts