Ssoon

Jenkins + ArgoCD : Jenkins CD by K8S(Kind) 본문

CICD Study [1기]

Jenkins + ArgoCD : Jenkins CD by K8S(Kind)

구구달스 2025. 10. 19. 15:08

1️⃣ Jenkins 컨테이너 내부에 툴 설치 : kubectl(v1.32), helm

root@DESKTOP-72C919S:~/cicd-labs# docker compose exec --privileged -u root jenkins bash

root@6418ff3ba58f:/# curl -LO "https://dl.k8s.io/release/v1.32.8/bin/linux/amd64/kubectl"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   138  100   138    0     0    227      0 --:--:-- --:--:-- --:--:--   226
100 54.6M  100 54.6M    0     0  19.4M      0  0:00:02  0:00:02 --:--:-- 30.0M

root@6418ff3ba58f:/# install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl

root@6418ff3ba58f:/# kubectl version --client=true
Client Version: v1.32.8
Kustomize Version: v5.5.0

root@6418ff3ba58f:/# curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 11928  100 11928    0     0  44209      0 --:--:-- --:--:-- --:--:-- 44177
Downloading https://get.helm.sh/helm-v3.19.0-linux-amd64.tar.gz
Verifying checksum... Done.
Preparing to install helm into /usr/local/bin
helm installed into /usr/local/bin/helm
root@6418ff3ba58f:/# helm version
version.BuildInfo{Version:"v3.19.0", GitCommit:"3d8990f0836691f0229297773f3524598f46bda6", GitTreeState:"clean", GoVersion:"go1.24.7"}

2️⃣Jenkins 설정 : 자격증명 설정

  • myk8s-control-plane 컨테이너 IP 확인
root@DESKTOP-72C919S:~/cicd-labs# docker inspect myk8s-control-plane | grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "",
                    "IPAddress": "172.19.0.2",

root@DESKTOP-72C919S:~/cicd-labs# docker exec -it jenkins curl https://172.19.0.2:6443/version -k
{
  "major": "1",
  "minor": "32",
  "gitVersion": "v1.32.8",
  "gitCommit": "2e83bc4bf31e88b7de81d5341939d5ce2460f46f",
  "gitTreeState": "clean",
  "buildDate": "2025-08-13T14:21:22Z",
  "goVersion": "go1.23.11",
  "compiler": "gc",
  "platform": "linux/amd64"
  • k8s(kind) 자격증명 설정 : k8s-crd
  • kubeconfig 파일은 메모장으로 직접 작성 후 업로드
root@DESKTOP-72C919S:~/cicd-labs# cat ~/.kube/config

  • Jenkins 설정 : 자격증명 설정 - k8s-crd

3️⃣ Jenkins Item 생성(Pipeline) : item name(k8s-cmd)

 

pipeline {
    agent any
    environment {
        KUBECONFIG = credentials('k8s-crd')
    }
    stages {
        stage('List Pods') {
            steps {
                sh '''
                # Fetch and display Pods
                kubectl get pods -A --kubeconfig "$KUBECONFIG"
                '''
            }
        }
    }
}

4️⃣ Jenkins 를 이용한 blue-green 배포 준비

  • deploy/echo-server-blue.yaml
de0560772841:/data/dev-app# mkdir deploy

de0560772841:/data/dev-app# cat > deploy/echo-server-blue.yaml <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: echo-server-blue
spec:
  replicas: 2
  selector:
    matchLabels:
      app: echo-server
      version: blue
  template:
    metadata:
      labels:
        app: echo-server
        version: blue
    spec:
      containers:
      - name: echo-server
        image: hashicorp/http-echo
        args:
        - "-text=Hello from Blue"
        ports:
        - containerPort: 5678
EOF
  • deploy/echo-server-service.yaml
de0560772841:/data/dev-app# cat > deploy/echo-server-service.yaml <<EOF
apiVersion: v1
kind: Service
metadata:
  name: echo-server-service
spec:
  selector:
    app: echo-server
    version: blue
  ports:
  - protocol: TCP
    port: 80
    targetPort: 5678
    nodePort: 30000
  type: NodePort
EOF
  • deploy/echo-server-green.yaml
de0560772841:/data/dev-app/deploy# cat echo-server-green.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: echo-server-green
spec:
  replicas: 2
  selector:
    matchLabels:
      app: echo-server
      version: green
  template:
    metadata:
      labels:
        app: echo-server
        version: green
    spec:
      containers:
      - name: echo-server
        image: hashicorp/http-echo
        args:
        - "-text=Hello from Green"
        ports:
        - containerPort: 5678
  • git push
de0560772841:/data/dev-app# git add . && git commit -m "Add echo server yaml" && git push -u origin main
[main 7c148e6] Add echo server yaml
 3 files changed, 60 insertions(+)
 create mode 100644 deploy/echo-server-blue.yaml
 create mode 100644 deploy/echo-server-green.yaml
 create mode 100644 deploy/echo-server-service.yaml
Enumerating objects: 7, done.
Counting objects: 100% (7/7), done.
Delta compression using up to 12 threads
Compressing objects: 100% (6/6), done.
Writing objects: 100% (6/6), 796 bytes | 796.00 KiB/s, done.
Total 6 (delta 2), reused 0 (delta 0), pack-reused 0 (from 0)
To http://172.18.234.111:3000/devops/dev-app.git
   0d46ca4..7c148e6  main -> main
branch 'main' set up to track 'origin/main'.

5️⃣ Jenkins Item 생성(Pipeline) : item name(k8s-bluegreen) - Jenkins 통한 k8s 기본 배포

  • Jenkins Item 생성(Pipeline) : item name(k8s-bluegreen)

📦 주요 단계

  1. Checkout
    • Gogs 저장소에서 main 브랜치의 코드를 가져옴
  2. Container Image Build
    • 실제 Docker 빌드 작업은 아직 미구현 (echo만 출력)
  3. Container Image Upload
    • Docker Hub 푸시 작업도 echo만 출력 (추후 구현 가능)
  4. Kubernetes Blue 버전 배포
    • echo-server-blue.yaml 및 echo-server-service.yaml 적용
  5. Green 버전 승인
    • 수동 승인 대기 (input 스텝 사용)
  6. Kubernetes Green 버전 배포
    • echo-server-green.yaml 적용
  7. 버전 전환 승인
    • 수동 승인 후 서비스 selector를 green으로 변경
  8. Blue 롤백 여부 확인
    • done: blue 버전 삭제
    • rollback: 서비스 selector를 blue로 되돌림
pipeline {
    agent any

    environment {
        KUBECONFIG = credentials('k8s-crd')
    }

    stages {
        stage('Checkout') {
            steps {
                 git branch: 'main',
                 url: 'http://172.18.234.111:3000/devops/dev-app.git',  // Git에서 코드 체크아웃
                 credentialsId: 'gogs-crd'  // Credentials ID
            }
        }

        stage('container image build') {
            steps {
                echo "container image build"
            }
        }

        stage('container image upload') {
            steps {
                echo "container image upload"
            }
        }

        stage('k8s deployment blue version') {
            steps {
                sh "kubectl apply -f ./deploy/echo-server-blue.yaml --kubeconfig $KUBECONFIG"
                sh "kubectl apply -f ./deploy/echo-server-service.yaml --kubeconfig $KUBECONFIG"
            }
        }

        stage('approve green version') {
            steps {
                input message: 'approve green version', ok: "Yes"
            }
        }

        stage('k8s deployment green version') {
            steps {
	        	sh "kubectl apply -f ./deploy/echo-server-green.yaml --kubeconfig $KUBECONFIG"
            }
        }

        stage('approve version switching') {
            steps {
                script {
                    returnValue = input message: 'Green switching?', ok: "Yes", parameters: [booleanParam(defaultValue: true, name: 'IS_SWITCHED')]
                    if (returnValue) {
                        sh "kubectl patch svc echo-server-service -p '{\"spec\": {\"selector\": {\"version\": \"green\"}}}' --kubeconfig $KUBECONFIG"
                    }
                }
            }
        }

        stage('Blue Rollback') {
            steps {
                script {
                    returnValue = input message: 'Blue Rollback?', parameters: [choice(choices: ['done', 'rollback'], name: 'IS_ROLLBACk')]
                    if (returnValue == "done") {
                        sh "kubectl delete -f ./deploy/echo-server-blue.yaml --kubeconfig $KUBECONFIG"
                    }
                    if (returnValue == "rollback") {
                        sh "kubectl patch svc echo-server-service -p '{\"spec\": {\"selector\": {\"version\": \"blue\"}}}' --kubeconfig $KUBECONFIG"
                    }
                }
            }
        }
    }
}

  • Green 버전 승인
    • 수동 승인 대기 (input 스텝 사용)

  • Kubernetes Green 버전 배포
    • echo-server-green.yaml 적용
  • 버전 전환 승인
    • 수동 승인 후 서비스 selector를 green으로 변경

  • Blue 롤백 여부 확인
    • done: blue 버전 삭제
    • rollback: 서비스 selector를 blue로 되돌림
Comments