Jenkins on k8s helm 배포 / Kaniko

문학적인유사성·2023년 7월 5일
0

뎁옵깃옵쿠베

목록 보기
28/53
post-thumbnail
post-custom-banner

젠킨스를 왜 eks에 올려야할까?

젠킨스를 eks에 올리면 좋은 점 : pod로 띄워서 slave가 빌드를 해줌
빌드 시작될때, slave를 동적으로 파드의 형태로 배포해서 해당 파드에서 빌드를 수행!!!
RAM을 아낄수있따!!!! 라는 것

https://hudi.blog/jenkins-build-optimization/
https://devroach.tistory.com/32

PV 및 SC생성

  • ebs irsa 생성같은것은 전 블로그 글 참조
# jenkins-pvc.yml
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: jenkins-sc
provisioner: ebs.csi.aws.com
volumeBindingMode: WaitForFirstConsumer

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: jenkins-pvc
  namespace: jenkins
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: jenkins-sc
  resources:
    requests:
      storage: 12Gi

helm 설치

kubectl create namespace jenkins

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

tar xvf jenkins-4.3.30.tgz
cd jenkins
vi values.yaml

# 51, 52번째줄 수정
adminUser: 
adminPassword:

# helm 차트에 있는 ingress는 aws alb를 제대로 만들어주지 않는다. 
# ingress를 만들려면 따로 만들어야함..^^;; 
# VALUES_SUMMARY.md
# jenkins-controller-ingress.yaml 
# 두 파일 보니까, api버전도 다르고 값도 다르고 해서 안되는 것으로 보인다. 
# 혹시 helm 차트에 바로 하는 법 아시면 댓글로 알려주세요 ㅜㅜ 

helm install jenkins -n jenkins -f values.yaml jenkinsci/jenkins

ingress 생성

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  namespace: jenkins
  name: jenkins-ingress
  annotations:
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS":443}]'
    alb.ingress.kubernetes.io/load-balancer-name: yusa-jenkins
    alb.ingress.kubernetes.io/target-type: ip
    alb.ingress.kubernetes.io/ssl-redirect: '443'
    alb.ingress.kubernetes.io/certificate-arn: ${자신의 서티 arn넣기}
spec:
  rules:
    - host: jenkins.literaryyusa.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: jenkins
                port:
                  number: 8080

접속확인

빌드 확인

[root@ip-10-1-8-104 jenkins]# kubectl get pods -A
NAMESPACE     NAME                                            READY   STATUS    RESTARTS     AGE
atlantis      atlantis-0                                      1/1     Running   7 (8h ago)   8h
jenkins       ecs-test-pipeline-23-wk2kq-qg5kx-n3p8d          2/2     Running   0            5s
jenkins       jenkins-0                                       2/2     Running   0            7h23m

저렇게 젠킨스 젠킨스 slave친구들이 만들어졌다가 사라진다!
이제 PV를 붙혀서 slave친구들이 떨어뜨린 파일들을 저장해보자

helm values.yaml 수정

# agent 595번째 줄 수정
agent: 
  workingDir: "/var/jenkins_home"
  
# 627번째 volumes 수정
  volumes:
    - type: PVC
      claimName: jenkins-pvc
      mountPath: /var/jenkins_home
      readOnly: false

# 658번째 workspaceVolume 수정
  workspaceVolume:
    type: PVC
    claimName: jenkins-pvc
    readOnly: false

확인

kubectl exec --namespace jenkins -it svc/jenkins -c jenkins -- /bin/sh
$ cd /var/jenkins_home/workspace/ecs-test-pipeline
$ cat pv-test
                Jenkins pv test
확인 완료

pipeline

  1. 젠킨스 플로그인의 : pipeline:AWS Steps 설치
  2. Jenkins user 생성후 크리덴셜 Jenkins에 넣기

**
1. ecs-test-pipeline-53-hlsdm-g6j9g-mnf6k 파드가 뜰때, kankio, aws-cli 컨테이너를 올려줌
2. 20분 제한 넣기
3. 카니코 컨테이너에서 빌드하고
4. aws-cli 컨테이너에서 ecs를 업데이트함.

pipeline {
  agent {
    kubernetes {
      //cloud 'kubernetes'
      yaml """
kind: Pod
metadata:
  name: kaniko
spec:
  containers:
  - name: kaniko
    image: gcr.io/kaniko-project/executor:debug
    imagePullPolicy: Always
    command:
    - /busybox/cat
    tty: true
    volumeMounts:
      - name: docker-config
        mountPath: /kaniko/.docker
      # when not using instance role
      - name: aws-secret
        mountPath: /root/.aws/
  - name: aws-cli
    image: public.ecr.aws/bitnami/aws-cli:2.4.25
    resources:
      requests:
        cpu: 200m
        memory: 400Mi
      limits:
        cpu: 1024m
        memory: 2048Mi
    command:
    - cat
    tty: true
  securityContext:
    runAsUser: 0
    fsGroup: 0
  restartPolicy: Never
  volumes:
    - name: docker-config
      configMap:
        name: docker-config
    - name: aws-secret
      secret:
        secretName: aws-secrett
"""
    }
  }

  options {
    timeout(time: 20, unit: 'MINUTES')
    buildDiscarder(logRotator(numToKeepStr: '5', daysToKeepStr: '7'))
  }

  stages {
    stage('Checkout') {
    steps {
        echo 'Checkout'
        git branch: 'main',credentialsId: 'gitlab', url:'${깃랩레포}'
        sh """
            ls -al 
        """
    }

   }
    stage('Build with Kaniko') {
      steps {
        container(name: 'kaniko') {
            sh '''
            /kaniko/executor --dockerfile `pwd`/Dockerfile \
                             --context `pwd` \
                             --destination={$ECR_repo}
            '''
        }
      }
    }
    
    stage('Deploy'){
            steps {
              container(name: 'aws-cli') {
                script{
                        try {
                            withAWS(credentials: 'Jenkins') {
                                sh '''
                                aws ecs describe-clusters --region us-east-1 --cluster yusa-test-ecs
                                aws ecs update-service --region us-east-1 --cluster yusa-test-ecs --service hello-yusa-service --force-new-deployment
                                '''
                            }
                            
                        } catch (error) {
                            print(error)
                            echo 'Remove Deploy Files'
                            sh "rm -rf /var/lib/jenkins/workspace/${env.JOB_NAME}/*"
                            currentBuild.result = 'FAILURE'
                        }
                    }
            }
            }
            post {
                success {
                    echo "The deploy stage successfully."
                }                             
                failure {
                    echo "The deploy stage failed."
                }
            }
        }
  }
}

task가 늘어났다가 줄어드는 것을 볼수있다.

또한 기존화면에서 변경되는 것을 확인할수 있다.

  • 기존

  • 변경 후

젠킨스 ecs cicd 배포

크리덴셜 설정방법


베스트 프렉티스... 대 실패~
role assume해서 하는게 계속 안되서, 그냥 크리덴셜을 넣어버렸다..^^;;

https://aws.amazon.com/ko/blogs/devops/orchestrate-jenkins-workloads-using-dynamic-pod-autoscaling-with-amazon-eks/

참고 블로그

젠킨스 cicd구축
젠킨스 헬름배포 벨로그

profile
Are you nervous? Don't be
post-custom-banner

7개의 댓글

comment-user-thumbnail
2024년 1월 13일

파이프라인 만들때 스크립트는 어떻게 참조했나요? 직접 다 스크립트로 손수 짜야하나요?
공부방법은요?;;; 감사합니다

1개의 답글
comment-user-thumbnail
2024년 1월 14일

ingress 로 접속하기 위해서 jenkins헬름 values.yaml값을 어떤걸 어떻게 변경하셨나요? 또 그런 정보는 어디에서 대체 알게되나요?

1개의 답글
comment-user-thumbnail
2024년 1월 15일

젠킨스 helm으로 설치하고 values.yaml 51,52줄째만 수정하고 바로 helm install jenkins -n jenkins -f values.yaml jenkinsci/jenkins 설치하신거에요???
그런다음 ingress.yaml 로만 하면 연동된건가요? ingress.yaml에 의해 생성된 alb에서 target 그룹에서 인스턴스 헬스체크 계속 fail나는데 뭐가 문제일까요?

1개의 답글