Ssoon
Jenkins + ArgoCD : Jenkins CD by K8S(Kind) 본문
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)

📦 주요 단계
- Checkout
- Gogs 저장소에서 main 브랜치의 코드를 가져옴
- Container Image Build
- 실제 Docker 빌드 작업은 아직 미구현 (echo만 출력)
- Container Image Upload
- Docker Hub 푸시 작업도 echo만 출력 (추후 구현 가능)
- Kubernetes Blue 버전 배포
- echo-server-blue.yaml 및 echo-server-service.yaml 적용
- Green 버전 승인
- 수동 승인 대기 (input 스텝 사용)
- Kubernetes Green 버전 배포
- echo-server-green.yaml 적용
- 버전 전환 승인
- 수동 승인 후 서비스 selector를 green으로 변경
- 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로 되돌림
'CICD Study [1기]' 카테고리의 다른 글
| Jenkins + ArgoCD : Jenkins CI + Argo CD + K8S(Kind) (0) | 2025.10.19 |
|---|---|
| Jenkins + ArgoCD : Argo CD + K8S(Kind) (0) | 2025.10.19 |
| Jenkins + ArgoCD : Jenkins CI + K8S(Kind) (0) | 2025.10.19 |
| Jenkins + ArgoCD : 실습 환경 구성 (0) | 2025.10.19 |
| Cloud Native CI/CD : 6.5 Containerize an Application Using a Tekton Taskand Buildah (0) | 2025.10.19 |
Comments