-
6. Jenkins์ Argo CD๋ก ์ดํดํ๋ CI/CDDevOps 2026. 7. 23. 11:18

๐ Docker & Kubernetes ์๋ฆฌ์ฆ
์ด์ ๊ธ์์๋ Docker Image๋ฅผ ์ ์ฅํ๊ณ ๊ณต์ ํ๊ธฐ ์ํ Docker Registry์ ๋ํด ์์๋ดค๋ค.
Spring Boot ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น๋ํด Docker Image๋ฅผ ์์ฑํ๊ณ , ์์ฑํ ์ด๋ฏธ์ง๋ฅผ Registry์ Pushํ๋ฉด ๊ฐ๋ฐ·์คํ ์ด์ง·์ด์ ํ๊ฒฝ์์ ๋์ผํ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
๊ทธ๋ ๋ค๋ฉด ๊ฐ๋ฐ์๊ฐ ์์ค๋ฅผ Git์ Pushํ ์ดํ ๋ค์ ๊ณผ์ ์ ๋๊ฐ ์ํํ ๊น?
์์ค ์ฝ๋ ๋น๋ Docker Image ์์ฑ Docker Registry ์ ๋ก๋ Kubernetes ๋ฐฐํฌ Pod ์ํ ํ์ธ์ด ๊ณผ์ ์ ๋งค๋ฒ ๊ฐ๋ฐ์๊ฐ ์ง์ ์ฒ๋ฆฌํ๋ฉด ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๊ณ , ๋ช ๋ น์ด ๋๋ฝ์ด๋ ์ค์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์๋ค.
๋ฐ๋ผ์ ์ค๋ฌด์์๋ Jenkins์ Argo CD ๊ฐ์ ๋๊ตฌ๋ฅผ ์ด์ฉํด ๋น๋์ ๋ฐฐํฌ ๊ณผ์ ์ ์๋ํํ๋ค.
์ด๋ฒ ๊ธ์์๋ CI/CD์ ๊ฐ๋ ๊ณผ Jenkins, Argo CD๊ฐ ๊ฐ๊ฐ ์ด๋ค ์ญํ ์ ๋ด๋นํ๋์ง ์์๋ณด์.
CI/CD๋?
CI/CD๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น๋, ํ ์คํธ, ๋ฐฐํฌ ๊ณผ์ ์ ์๋ํํ๋ ๋ฐฉ๋ฒ์ด๋ค.
CI๋ Continuous Integration์ ์ฝ์๋ก ์ง์์ ํตํฉ์ ์๋ฏธํ๋ค.
CD๋ Continuous Delivery ๋๋ Continuous Deployment์ ์ฝ์๋ก ์ง์์ ์ ๊ณต ๋๋ ์ง์์ ๋ฐฐํฌ๋ฅผ ์๋ฏธํ๋ค.
CI → ์์ค ์ฝ๋๋ฅผ ๋น๋ํ๊ณ ํ ์คํธํ์ฌ ๋ฐฐํฌ ๊ฐ๋ฅํ ๊ฒฐ๊ณผ๋ฌผ์ ๋ง๋๋ ๊ณผ์ CD → ๋ง๋ค์ด์ง ๊ฒฐ๊ณผ๋ฌผ์ ๊ฐ๋ฐ·์คํ ์ด์ง·์ด์ ํ๊ฒฝ์ ๋ฐฐํฌํ๋ ๊ณผ์ ์ ์ฒด ํ๋ฆ์ ๊ฐ๋จํ๊ฒ ํํํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
๊ฐ๋ฐ์๊ฐ Git์ ์์ค Push โ โผ CI โ โโ ์์ค Checkout โโ ํ ์คํธ โโ ์ ํ๋ฆฌ์ผ์ด์ ๋น๋ โโ Docker Image ์์ฑ โโ Registry Push โ โผ CD โ โโ ๋ฐฐํฌ ์ค์ ๋ฐ์ โโ Kubernetes ๋ฐฐํฌ โโ ์๋ก์ด Pod ์์ฑ โโ Health Check โ โผ ์๋น์ค ๋ฐ์Jenkins๋ ์ฃผ๋ก CI ์์ญ์ ๋ด๋นํ๊ณ , Argo CD๋ Kubernetes ํ๊ฒฝ์ CD ์์ญ์ ๋ด๋นํ๋ค.
CI๊ฐ ํ์ํ ์ด์
์ฌ๋ฌ ๊ฐ๋ฐ์๊ฐ ํ๋์ ํ๋ก์ ํธ๋ฅผ ํจ๊ป ๊ฐ๋ฐํ๋ค๊ณ ๊ฐ์ ํด ๋ณด์.
๊ฐ ๊ฐ๋ฐ์๋ ์์ ์ ๋ธ๋์น์์ ์ฝ๋๋ฅผ ์์ ํ ํ Git Repository์ Pushํ๊ฑฐ๋ Merge Request๋ฅผ ์์ฑํ๋ค.
์ด๋ ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
๋ก์ปฌ์์๋ ์คํ๋์ง๋ง ์๋ฒ์์๋ ๋น๋๋์ง ์๋ ๋ฌธ์ ํ์ ํ ์คํธ๊ฐ ๋๋ฝ๋๋ ๋ฌธ์ ์๋ก ๋ค๋ฅธ Java ๋๋ Node.js ๋ฒ์ ์ ์ฌ์ฉํ๋ ๋ฌธ์ Docker Image Tag๋ฅผ ์๋ชป ์ง์ ํ๋ ๋ฌธ์ Registry Push ๋ช ๋ น์ ๋น ๋จ๋ฆฌ๋ ๋ฌธ์ CI๋ฅผ ์ ์ฉํ๋ฉด ์์ค๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ๋์ผํ ํ๊ฒฝ์์ ์ ํด์ง ์ ์ฐจ๋ฅผ ์๋์ผ๋ก ์คํํ ์ ์๋ค.
Git Push โ โผ ์๋ ๋น๋ โ โผ ์๋ ํ ์คํธ โ โผ ๋น๋ ๊ฒฐ๊ณผ ํ์ธ๋ชจ๋ ๊ฐ๋ฐ์๊ฐ ๊ฐ์ ๋น๋ ์ ์ฐจ๋ฅผ ์ฌ์ฉํ๋ฏ๋ก ๊ฐ์ธ์ ๋ก์ปฌ ํ๊ฒฝ ์ฐจ์ด๋ก ๋ฐ์ํ๋ ๋ฌธ์ ๋ฅผ ์ค์ผ ์ ์๋ค.
CD๊ฐ ํ์ํ ์ด์
Docker Image๋ฅผ Registry์ Pushํ๋ค๊ณ ํด์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์๋์ผ๋ก ์๋น์ค์ ๋ฐ์๋๋ ๊ฒ์ ์๋๋ค.
Kubernetes์์ ์๋ก์ด ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด Deployment ๋ฑ์ ๋ฐฐํฌ ์ค์ ์ ๋ณ๊ฒฝํ๊ณ , ์๋ก์ด Pod๊ฐ ์์ฑ๋๋๋ก ํด์ผ ํ๋ค.
๊ฐ๋ฐ์๊ฐ ๋งค๋ฒ ์ง์ ๋ค์ ์์ ์ ์ํํ ์๋ ์๋ค.
๋ฐฐํฌํ Image Tag ํ์ธ Kubernetes Manifest ์์ kubectl ๋ช ๋ น ์คํ ์๋ก์ด Pod ์์ฑ ์ฌ๋ถ ํ์ธ ์ ํ๋ฆฌ์ผ์ด์ Health Check ํ์ธ ๊ธฐ์กด Pod ์ข ๋ฃ ์ฌ๋ถ ํ์ธํ์ง๋ง ํ๊ฒฝ๊ณผ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ง์์ง์๋ก ์๋ ๋ฐฐํฌ๋ ๊ด๋ฆฌํ๊ธฐ ์ด๋ ค์์ง๋ค.
CD ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐฐํฌ ์ค์ ๋ณ๊ฒฝ๋ถํฐ Kubernetes ๋ฐ์๊น์ง์ ๊ณผ์ ์ ์ผ๊ด๋ ๋ฐฉ์์ผ๋ก ๊ด๋ฆฌํ ์ ์๋ค.
Jenkins๋?
Jenkins๋ ๋น๋, ํ ์คํธ, ๋ฐฐํฌ ์์ ์ ์๋ํํ ์ ์๋ ์คํ์์ค ์๋ํ ์๋ฒ์ด๋ค.
์ค๋ฌด์์๋ ์ฃผ๋ก ๋ค์ ์์ ์ ์ฌ์ฉํ๋ค.
Git Repository์์ ์์ค ๊ฐ์ ธ์ค๊ธฐ Gradle ๋๋ Maven ๋น๋ ๋จ์ ํ ์คํธ ์คํ ์ ์ ๋ถ์ ์คํ Docker Image ์์ฑ Docker Registry์ Image Push ๋ฐฐํฌ ์ค์ ์ Image Tag ๋ณ๊ฒฝ ๋ค๋ฅธ ๋ฐฐํฌ ์์คํ ํธ์ถJenkins์์ ์คํ๋๋ ์์ ์ ๋จ์๋ฅผ ์ผ๋ฐ์ ์ผ๋ก Job์ด๋ผ๊ณ ํ๋ค.
์ฌ๋ฌ ์์ ์ ๋จ๊ณ๋ณ๋ก ๊ตฌ์ฑํ ๊ฒ์ Pipeline์ด๋ผ๊ณ ํ๋ค.
Jenkins Pipeline์ ๊ธฐ๋ณธ ํ๋ฆ
Spring Boot ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ธฐ์ค์ผ๋ก Jenkins Pipeline์ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌ์ฑํ ์ ์๋ค.
1. Checkout 2. Test 3. Gradle Build 4. Docker Build 5. Docker Push 6. ๋ฐฐํฌ ์ค์ ๋ณ๊ฒฝํ๋ฆ์ผ๋ก ํํํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
Git Repository โ โผ Jenkins โ โโ Source Checkout โโ ./gradlew test โโ ./gradlew bootJar โโ docker build โโ docker push โโ ๋ฐฐํฌ Image Tag ๋ณ๊ฒฝ โ โผ Docker RegistryJenkins๊ฐ ๋ชจ๋ ๋จ๊ณ๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ์๋ฃํ๋ฉด ๋ฐฐํฌ ๊ฐ๋ฅํ Docker Image๊ฐ Registry์ ์ ์ฅ๋๋ค.
Jenkinsfile์ด๋?
Jenkins Pipeline์ Jenkins ๊ด๋ฆฌ ํ๋ฉด์์ ์ง์ ์ค์ ํ ์๋ ์์ง๋ง, ์ผ๋ฐ์ ์ผ๋ก Jenkinsfile์ ์ด์ฉํด ์ฝ๋๋ก ๊ด๋ฆฌํ ์ ์๋ค.
ํ๋ก์ ํธ ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ์ ์ ์๋ค.
my-spring-app โโโ src โโโ build.gradle โโโ Dockerfile โโโ Jenkinsfile โโโ settings.gradle๊ฐ๋จํ Jenkinsfile ์์๋ ๋ค์๊ณผ ๊ฐ๋ค.
pipeline { agent any environment { IMAGE_NAME = 'registry.example.com/my-spring-app' IMAGE_TAG = "${BUILD_NUMBER}" } stages { stage('Checkout') { steps { checkout scm } } stage('Test') { steps { sh './gradlew test' } } stage('Build') { steps { sh './gradlew bootJar' } } stage('Docker Build') { steps { sh "docker build -t ${IMAGE_NAME}:${IMAGE_TAG} ." } } stage('Docker Push') { steps { sh "docker push ${IMAGE_NAME}:${IMAGE_TAG}" } } } }์ด Pipeline์ด ์คํ๋๋ฉด ๋ค์ ์์ ์ด ์์๋๋ก ์ํ๋๋ค.
์์ค Checkout → ํ ์คํธ → JAR ์์ฑ → Docker Image ์์ฑ → Registry Push์ค์ ํ๊ฒฝ์์๋ Registry ์ธ์ฆ, ๋น๋ ์บ์, ๋ณด์ ๊ฒ์ฌ, ์คํจ ์๋ฆผ ๋ฑ์ ์ค์ ์ด ์ถ๊ฐ๋ ์ ์๋ค.
Jenkins Build Number๋ฅผ Image Tag๋ก ์ฌ์ฉํ๊ธฐ
Docker Image์๋ ๋ฐฐํฌ ๋ฒ์ ์ ์๋ณํ ์ ์๋ Tag๊ฐ ํ์ํ๋ค.
Jenkins์์๋ Build Number๋ฅผ Image Tag๋ก ํ์ฉํ ์ ์๋ค.
์๋ฅผ ๋ค์ด Jenkins Build Number๊ฐ 152๋ผ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ด๋ฏธ์ง๊ฐ ์์ฑ๋๋ค.
registry.example.com/my-spring-app:152Git Commit Hash๋ฅผ ์ฌ์ฉํ ์๋ ์๋ค.
registry.example.com/my-spring-app:a1b2c3d๋ ์ง์ Build Number๋ฅผ ์กฐํฉํ๋ ๋ฐฉ๋ฒ๋ ์๋ค.
registry.example.com/my-spring-app:20260723-152๊ณ ์ ํ Image Tag๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค์ ์ ๋ณด๋ฅผ ์ถ์ ํ๊ธฐ ์ฝ๋ค.
์ด๋ค Jenkins ๋น๋์์ ์์ฑ๋์๋์ง ์ด๋ค Git Commit์ ๊ธฐ์ค์ผ๋ก ์์ฑ๋์๋์ง ํ์ฌ ๊ฐ๋ฐ·์คํ ์ด์ง·์ด์ ํ๊ฒฝ์ ์ด๋ค ๋ฒ์ ์ด ๋ฐฐํฌ๋์๋์ง ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ ๋ ์ด๋ค ๋ฒ์ ์ผ๋ก ๋ณต๊ตฌํด์ผ ํ๋์ง์ด์ ํ๊ฒฝ์์๋ ๋์ผํ latest Tag๋ฅผ ๋ฐ๋ณตํด์ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ๋ณ๊ฒฝ๋์ง ์๋ ๊ณ ์ ํ Tag๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ด๋ฆฌ์ ์ ๋ฆฌํ๋ค.
Argo CD๋?
Argo CD๋ Kubernetes ํ๊ฒฝ์์ ์ ํ๋ฆฌ์ผ์ด์ ๋ฐฐํฌ๋ฅผ ๊ด๋ฆฌํ๋ GitOps ๊ธฐ๋ฐ์ CD ๋๊ตฌ์ด๋ค.
Argo CD๋ Git Repository์ ์ ์ฅ๋ Kubernetes ๋ฐฐํฌ ์ค์ ์ ๊ธฐ์ค์ผ๋ก ์ค์ Kubernetes ์ํ๋ฅผ ๊ด๋ฆฌํ๋ค.
์ฌ๊ธฐ์ ์ค์ํ ์ ์ Argo CD๊ฐ ๋จ์ํ Docker Registry์ ์๋ก์ด ์ด๋ฏธ์ง๊ฐ ๋ฑ๋ก๋์๋ค๋ ์ฌ์ค๋ง ๋ณด๊ณ ์๋์ผ๋ก ๋ฐฐํฌํ๋ ๋๊ตฌ๋ ์๋๋ผ๋ ๊ฒ์ด๋ค.
Argo CD๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ธํ๋ ๋์์ Git์ ์ ์ฅ๋ ๋ฐฐํฌ ์ค์ ์ด๋ค.
์๋ฅผ ๋ค์ด Git์ ๋ค์๊ณผ ๊ฐ์ Kubernetes Deployment ์ค์ ์ด ์๋ค๊ณ ๊ฐ์ ํด ๋ณด์.
apiVersion: apps/v1 kind: Deployment metadata: name: my-spring-app spec: replicas: 2 selector: matchLabels: app: my-spring-app template: metadata: labels: app: my-spring-app spec: containers: - name: my-spring-app image: registry.example.com/my-spring-app:152 ports: - containerPort: 8080image ๊ฐ์ด ๋ณ๊ฒฝ๋์ด Git์ ๋ฐ์๋๋ฉด Argo CD๊ฐ ํด๋น ๋ณ๊ฒฝ ์ฌํญ์ ํ์ธํ๋ค.
image: registry.example.com/my-spring-app:153์ดํ Argo CD๊ฐ Git์ ์ค์ ์ Kubernetes์ ๋ฐ์ํ๋ฉด ์๋ก์ด Image๋ฅผ ์ฌ์ฉํ๋ Pod๊ฐ ์์ฑ๋๋ค.
GitOps๋?
GitOps๋ Git Repository๋ฅผ ์์คํ ์ ์ํ๋ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ๊ธฐ์ค์ผ๋ก ์ฌ์ฉํ๋ ๋ฐฉ์์ด๋ค.
Kubernetes ๋ฐฐํฌ ์ค์ ์ Git์ ์ ์ฅํ๊ณ , ์ค์ Kubernetes ์ํ๊ฐ Git์ ์ค์ ๊ณผ ์ผ์นํ๋๋ก ๊ด๋ฆฌํ๋ค.
Git Repository → ์ํ๋ ์ํ Kubernetes Cluster → ์ค์ ์ํ์๋ฅผ ๋ค์ด Git์๋ Pod๋ฅผ 2๊ฐ ์คํํ๋๋ก ์ค์ ๋์ด ์๋ค๊ณ ๊ฐ์ ํด ๋ณด์.
replicas: 2ํ์ง๋ง ์ค์ Kubernetes์๋ Pod๊ฐ 1๊ฐ๋ง ์คํ ์ค์ด๋ผ๋ฉด ๋ ์ํ๊ฐ ์ผ์นํ์ง ์๋๋ค.
Git์ ์ํ๋ ์ํ → Pod 2๊ฐ Kubernetes์ ์ค์ ์ํ → Pod 1๊ฐArgo CD๋ ์ด ์ฐจ์ด๋ฅผ ํ์ธํ๊ณ Kubernetes ์ํ๋ฅผ Git์ ์ค์ ๊ณผ ๋ง์ถ ์ ์๋ค.
Argo CD์ Sync ์ํ
Argo CD์์๋ Git์ ์ ์๋ ์ํ์ Kubernetes์ ์ค์ ์ํ๊ฐ ์ผ์นํ๋์ง๋ฅผ Sync ์ํ๋ก ํ์ธํ ์ ์๋ค.
๋ํ์ ์ธ ์ํ๋ ๋ค์๊ณผ ๊ฐ๋ค.
Synced → Git์ ๋ฐฐํฌ ์ค์ ๊ณผ Kubernetes์ ์ค์ ์ํ๊ฐ ์ผ์นํจ OutOfSync → Git์ ๋ฐฐํฌ ์ค์ ๊ณผ Kubernetes์ ์ค์ ์ํ๊ฐ ์ผ์นํ์ง ์์์๋ฅผ ๋ค์ด Git์ Image Tag๊ฐ 153์ผ๋ก ๋ณ๊ฒฝ๋์์ง๋ง Kubernetes์์๋ ์์ง 152๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค๋ฉด OutOfSync ์ํ๊ฐ ๋ ์ ์๋ค.
Git → my-spring-app:153 Kubernetes → my-spring-app:152 Argo CD → OutOfSync๋๊ธฐํ๊ฐ ์๋ฃ๋๋ฉด Kubernetes์์๋ 153 ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ๊ฒ ๋๊ณ ์ํ๊ฐ Synced๋ก ๋ณ๊ฒฝ๋๋ค.
Git → my-spring-app:153 Kubernetes → my-spring-app:153 Argo CD → Synced
Argo CD์ Health ์ํ
Sync ์ํ๋ Git ์ค์ ๊ณผ Kubernetes ์ํ๊ฐ ์ผ์นํ๋์ง ๋ณด์ฌ์ค๋ค.
Health ์ํ๋ Kubernetes Resource๊ฐ ์ ์์ ์ผ๋ก ๋์ํ๋์ง ๋ณด์ฌ์ค๋ค.
๋ํ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ์ํ๊ฐ ํ์๋ ์ ์๋ค.
Healthy → Resource๊ฐ ์ ์์ ์ผ๋ก ๋์ ์ค Progressing → ์๋ก์ด Resource๊ฐ ์์ฑ๋๊ฑฐ๋ ๋ฐฐํฌ๊ฐ ์งํ ์ค Degraded → Resource์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ํ Missing → ํ์ํ Resource๊ฐ ์กด์ฌํ์ง ์๋ ์ํ Unknown → ์ ์ ์ํ๋ฅผ ํ๋จํ๊ธฐ ์ด๋ ค์ด ์ํ์๋ฅผ ๋ค์ด ์๋ก์ด ๋ฒ์ ์ ๋ฐฐํฌํ๋ฉด ์ฒ์์๋ Progressing ์ํ๊ฐ ํ์๋ ์ ์๋ค.
์๋ก์ด Deployment ๋ฐ์ โ โผ ์๋ก์ด Pod ์์ฑ โ โผ Progressing โ โผ Pod ๊ธฐ๋ ์๋ฃ โ โผ Health Check ์ฑ๊ณต โ โผ Healthy๋ฐ๋ผ์ Argo CD ํ๋ฉด์์๋ ๋จ์ํ ๋ฐฐํฌ๊ฐ ๋๊ธฐํ๋์๋์ง๋ง ํ์ธํ๋ ๊ฒ์ด ์๋๋ผ ๋ค์ ํญ๋ชฉ์ ํจ๊ป ํ์ธํ๋ ๊ฒ์ด ์ข๋ค.
Sync ์ํ๊ฐ Synced์ธ์ง Health ์ํ๊ฐ Healthy์ธ์ง ์ํ๋ ๊ฐ์์ Pod๊ฐ ์คํ ์ค์ธ์ง ์๋ก์ด Image Tag๊ฐ ์ ์ฉ๋์๋์ง Pod ์ฌ์์์ด ๋ฐ๋ณต๋๊ณ ์์ง ์์์ง
Sync์ Health๋ ๋ฌด์์ด ๋ค๋ฅผ๊น?
์ฒ์ Argo CD๋ฅผ ์ฌ์ฉํ ๋ Sync ์ํ์ Health ์ํ๋ฅผ ํผ๋ํ๊ธฐ ์ฝ๋ค.
๋ ์ํ์ ์๋ฏธ๋ ๋ค๋ฅด๋ค.
Sync → Git ์ค์ ๊ณผ Kubernetes ์ํ๊ฐ ๊ฐ์์ง ํ์ธ Health → Kubernetes Resource๊ฐ ์ ์์ ์ผ๋ก ๋์ํ๋์ง ํ์ธ์๋ฅผ ๋ค์ด Git ์ค์ ์ด Kubernetes์ ์ ์์ ์ผ๋ก ์ ์ฉ๋์์ง๋ง ์ ํ๋ฆฌ์ผ์ด์ ์คํ ๊ณผ์ ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์๋ค.
Git ์ค์ ๋ฐ์ ์๋ฃ → Synced ์๋ก์ด Pod ์คํ ์คํจ → Degraded์ฆ, Synced๋ผ๊ณ ํด์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ฐ๋์ ์ ์์ด๋ผ๋ ์๋ฏธ๋ ์๋๋ค.
๋ฐฐํฌ ํ์ธ ์์๋ Synced์ Healthy๋ฅผ ๋ชจ๋ ํ์ธํด์ผ ํ๋ค.
Argo CD์์ Pod๋ฅผ ํ์ธํ๋ ์ด์
Argo CD์์๋ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ์ฐ๊ฒฐ๋ Kubernetes Resource ๊ตฌ์กฐ๋ฅผ ํ์ธํ ์ ์๋ค.
Application โ โผ Deployment โ โผ ReplicaSet โ โผ Pod๋ฐฐํฌ ํ Pod ์ํ๋ฅผ ํ์ธํ๋ฉด ์๋ก์ด ์ ํ๋ฆฌ์ผ์ด์ ๋ฒ์ ์ด ์ ์์ ์ผ๋ก ์คํ๋์๋์ง ํ์ ํ ์ ์๋ค.
๋ํ์ ์ผ๋ก ๋ค์ ์ํ๋ฅผ ํ์ธํ๋ค.
Running → Pod๊ฐ ์ ์ ์คํ ์ค Pending → Pod๊ฐ ์์ง ์คํ๋ Node์ ๋ฐฐ์น๋์ง ์์๊ฑฐ๋ ์ค๋น ์ค CrashLoopBackOff → Container๊ฐ ์คํ๊ณผ ์ข ๋ฃ๋ฅผ ๋ฐ๋ณตํ๋ ์ํ ImagePullBackOff → Registry์์ Image๋ฅผ ๋ด๋ ค๋ฐ์ง ๋ชปํ ์ํ Error → Container ์คํ ์ค ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ํ Terminating → Pod๊ฐ ์ข ๋ฃ๋๊ณ ์๋ ์ํ์๋ฅผ ๋ค์ด Registry ์ธ์ฆ์ ๋ฌธ์ ๊ฐ ์๊ฑฐ๋ Image Tag๊ฐ ์กด์ฌํ์ง ์๋๋ค๋ฉด ImagePullBackOff๊ฐ ๋ฐ์ํ ์ ์๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์คํ ์ค ์์ธ๊ฐ ๋ฐ์ํด ๊ณ์ ์ข ๋ฃ๋๋ค๋ฉด CrashLoopBackOff๊ฐ ๋ฐ์ํ ์ ์๋ค.
Health Check๋?
Kubernetes๋ Container ํ๋ก์ธ์ค๊ฐ ์คํ ์ค์ด๋ผ๋ ์ฌ์ค๋ง์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ ์์ด๋ผ๊ณ ํ๋จํ์ง ์๋๋ค.
ํ๋ก์ธ์ค๋ ์คํ ์ค์ด์ง๋ง ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ ์คํจํ๊ฑฐ๋, ์ ํ๋ฆฌ์ผ์ด์ ์ด๊ธฐํ๊ฐ ์๋ฃ๋์ง ์์์ ์๋ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ด๋ฅผ ํ์ธํ๊ธฐ ์ํด Probe๋ฅผ ์ฌ์ฉํ๋ค.
๋ํ์ ์ธ Probe๋ ๋ค์๊ณผ ๊ฐ๋ค.
Startup Probe → ์ ํ๋ฆฌ์ผ์ด์ ์ ์ต์ด ๊ธฐ๋์ด ์๋ฃ๋์๋์ง ํ์ธ Readiness Probe → ํ์ฌ ์์ฒญ์ ์ฒ๋ฆฌํ ์ค๋น๊ฐ ๋์๋์ง ํ์ธ Liveness Probe → ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ ์์ ์ผ๋ก ์ด์ ์๋์ง ํ์ธ
Startup Probe
Startup Probe๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ต์ด ๊ธฐ๋ ์ฌ๋ถ๋ฅผ ํ์ธํ๋ค.
Spring Boot ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ธฐ๋ ์ ์ค์ ํ์ผ ๋ก๋ฉ, Bean ์์ฑ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ๋ฑ์ ์์ ์ ์ํํ๊ธฐ ๋๋ฌธ์ ์์ํ๋ ๋ฐ ์๊ฐ์ด ๊ฑธ๋ฆด ์ ์๋ค.
๊ธฐ๋ ์๊ฐ์ด ๊ธด ์ ํ๋ฆฌ์ผ์ด์ ์ Liveness Probe๋ง ์ ์ฉํ๋ฉด ์ ์์ ์ผ๋ก ์์ ์ค์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ Kubernetes๊ฐ ๋น์ ์์ผ๋ก ํ๋จํด ์ฌ์์ํ ์ ์๋ค.
Startup Probe๋ฅผ ์ฌ์ฉํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด๊ธฐ ๊ธฐ๋์ด ๋๋ ๋๊น์ง ๋ค๋ฅธ Probe์ ํ๋จ์ ๊ธฐ๋ค๋ฆฌ๊ฒ ํ ์ ์๋ค.
Pod ์์ฑ โ โผ Spring Boot ๊ธฐ๋ ์ค โ โผ Startup Probe ํ์ธ โ โผ ๊ธฐ๋ ์๋ฃ
Readiness Probe
Readiness Probe๋ ํด๋น Pod๊ฐ ์ฌ์ฉ์ ์์ฒญ์ ๋ฐ์ ์ค๋น๊ฐ ๋์๋์ง ํ์ธํ๋ค.
Readiness Probe๊ฐ ์คํจํ๋ฉด Pod ์์ฒด๊ฐ ๋ฐ๋ก ์ข ๋ฃ๋๋ ๊ฒ์ ์๋๋ค.
๋์ Service์ ์์ฒญ ์ ๋ฌ ๋์์์ ์ ์ธ๋ ์ ์๋ค.
Readiness Probe ์ฑ๊ณต → Service๊ฐ ํด๋น Pod๋ก ์์ฒญ ์ ๋ฌ Readiness Probe ์คํจ → Service๊ฐ ํด๋น Pod๋ก ์์ฒญ์ ์ ๋ฌํ์ง ์์์๋ก์ด Pod๊ฐ ์์ฑ๋์๋๋ผ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด๊ธฐํ๊ฐ ์๋ฃ๋๊ธฐ ์ ์ ์์ฒญ์ ๋ฐ์ผ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์๋ค.
Readiness Probe๋ฅผ ์ฌ์ฉํ๋ฉด ์ค๋น๊ฐ ์๋ฃ๋ Pod์๋ง ํธ๋ํฝ์ ์ ๋ฌํ ์ ์๋ค.
Liveness Probe
Liveness Probe๋ ์คํ ์ค์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ ์์ ์ผ๋ก ๋์ํ๊ณ ์๋์ง ํ์ธํ๋ค.
Liveness Probe๊ฐ ์ผ์ ํ์ ์ด์ ์คํจํ๋ฉด Kubernetes๊ฐ Container๋ฅผ ์ฌ์์ํ ์ ์๋ค.
Liveness Probe ์ฑ๊ณต → Container ์ ์ง Liveness Probe ๋ฐ๋ณต ์คํจ → Container ์ฌ์์ํ๋ก์ธ์ค๋ ์คํ ์ค์ด์ง๋ง ๋ด๋ถ์ ์ผ๋ก ์๋ตํ ์ ์๋ ์ํ์ ๋น ์ง ๊ฒฝ์ฐ ๋ณต๊ตฌ์ ํ์ฉํ ์ ์๋ค.
๋ค๋ง Liveness Probe ์กฐ๊ฑด์ ์ง๋์น๊ฒ ์๊ฒฉํ๊ฒ ์ค์ ํ๋ฉด ์ผ์์ ์ธ ์๋ต ์ง์ฐ๋ง์ผ๋ก๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ฐ๋ณต ์ฌ์์๋ ์ ์์ผ๋ฏ๋ก ์ฃผ์ํด์ผ ํ๋ค.
Spring Boot Actuator์ Health Check
Spring Boot์์๋ Actuator๋ฅผ ์ด์ฉํด ์ ํ๋ฆฌ์ผ์ด์ ์ํ๋ฅผ ํ์ธํ ์ ์๋ค.
์์กด์ฑ์ ๋ค์๊ณผ ๊ฐ์ด ์ถ๊ฐํ ์ ์๋ค.
dependencies { implementation 'org.springframework.boot:spring-boot-starter-actuator' }์ผ๋ฐ์ ์ธ Health Check Endpoint๋ ๋ค์๊ณผ ๊ฐ๋ค.
/actuator/health์ ํ๋ฆฌ์ผ์ด์ ์ด ์ ์์ด๋ผ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์๋ต์ ๋ฐ์ ์ ์๋ค.
{ "status": "UP" }Kubernetes Probe์์ ํด๋น Endpoint๋ฅผ ํธ์ถํ๋๋ก ์ค์ ํ ์ ์๋ค.
containers: - name: my-spring-app image: registry.example.com/my-spring-app:153 ports: - containerPort: 8080 startupProbe: httpGet: path: /actuator/health port: 8080 failureThreshold: 30 periodSeconds: 10 readinessProbe: httpGet: path: /actuator/health port: 8080 initialDelaySeconds: 10 periodSeconds: 5 livenessProbe: httpGet: path: /actuator/health port: 8080 initialDelaySeconds: 30 periodSeconds: 10์ค์ ์ค์ ์์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ธฐ๋ ์๊ฐ๊ณผ ์ฅ์ ํ๋จ ๊ธฐ์ค์ ๋ง๊ฒ ๊ฐ์ ์กฐ์ ํด์ผ ํ๋ค.
๋ํ Readiness์ Liveness๊ฐ ๋์ผํ ์กฐ๊ฑด์ ์ฌ์ฉํ๋ฉด ์ฅ์ ์ํฉ์ ์ ํํ๊ฒ ๊ตฌ๋ถํ๊ธฐ ์ด๋ ค์ธ ์ ์์ผ๋ฏ๋ก ์ด์ ํ๊ฒฝ์ ๋ง๋ Health Endpoint ๊ตฌ์ฑ์ด ํ์ํ๋ค.
Jenkins์ Argo CD์ ์ญํ ์ฐจ์ด
Jenkins์ Argo CD๋ ๋ชจ๋ ๋ฐฐํฌ ๊ณผ์ ์์ ์ฌ์ฉ๋์ง๋ง ๋ด๋นํ๋ ์ญํ ์ด ๋ค๋ฅด๋ค.
Jenkins → ์์ค ์ฝ๋๋ฅผ ๋น๋ํ๊ณ Docker Image๋ฅผ ์์ฑํ๋ ์ญํ Argo CD → Git์ Kubernetes ์ค์ ์ ์ค์ Cluster์ ๋ฐ์ํ๊ณ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ์ญํ์กฐ๊ธ ๋ ์์ธํ ๋น๊ตํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
๊ตฌ๋ถ Jenkins Argo CD ์ฃผ์ ์ญํ ๋น๋ ๋ฐ ์๋ํ Kubernetes ๋ฐฐํฌ ๊ด๋ฆฌ ๋ด๋น ์์ญ CI ์ค์ฌ CD ์ค์ฌ ๊ธฐ์ค ๋ฐ์ดํฐ ์ ํ๋ฆฌ์ผ์ด์ ์์ค Kubernetes ๋ฐฐํฌ ์ค์ ์ฃผ์ ์์ ํ ์คํธ, JAR ๋น๋, Docker Build, Push Sync, ๋ฐฐํฌ ์ํ ๋ฐ Health ๊ด๋ฆฌ ๊ฒฐ๊ณผ ๋ฐฐํฌ ๊ฐ๋ฅํ Docker Image Kubernetes์ ์คํ๋ ์ ํ๋ฆฌ์ผ์ด์ ๋ ๋๊ตฌ๋ฅผ ์ฐ๊ฒฐํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ๋น๋๋ถํฐ Kubernetes ๋ฐฐํฌ๊น์ง ์๋ํํ ์ ์๋ค.
Jenkins๊ฐ ์ง์ Kubernetes์ ๋ฐฐํฌํ๋ ๋ฐฉ์
Jenkins๊ฐ ๋ฐ๋์ CI ์์ ๋ง ์ํํด์ผ ํ๋ ๊ฒ์ ์๋๋ค.
Jenkins Pipeline์์ kubectl์ด๋ Helm ๋ช ๋ น์ ์คํํด Kubernetes์ ์ง์ ๋ฐฐํฌํ ์๋ ์๋ค.
Git Push โ โผ Jenkins โ โโ Build โโ Docker Push โโ kubectl apply โ โผ Kubernetes์ด ๋ฐฉ์์์๋ Jenkins๊ฐ ๋น๋์ ๋ฐฐํฌ๋ฅผ ๋ชจ๋ ๋ด๋นํ๋ค.
๊ตฌ์ฑ์ด ๋จ์ํ ์ ์์ง๋ง Kubernetes์ ์ด๋ค ์ค์ ์ด ๋ฐฐํฌ๋์๋์ง Jenkins ์์ ๋ด์ญ์ ํ์ธํด์ผ ํ ์ ์๋ค.
Jenkins์ Argo CD๋ฅผ ๋ถ๋ฆฌํ๋ ๋ฐฉ์
Jenkins์ Argo CD๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ฉด ๋ค์์ฒ๋ผ ์ญํ ์ ๋ถ๋ฆฌํ ์ ์๋ค.
Jenkins → Docker Image ์์ฑ ๋ฐ Registry Push Argo CD → Git์ ์ ์๋ Kubernetes ์ค์ ์ Cluster์ ๋ฐ์์ ์ฒด ํ๋ฆ์ ๋ค์๊ณผ ๊ฐ๋ค.
์ ํ๋ฆฌ์ผ์ด์ Git Repository โ โผ Jenkins โ โโ Test โโ Gradle Build โโ Docker Build โโ Registry Push โ โผ Docker Registry โ โผ ๋ฐฐํฌ ์ค์ Git Repository โ โผ Argo CD โ โผ Kubernetes์ ํ๋ฆฌ์ผ์ด์ ์์ค์ Kubernetes ๋ฐฐํฌ ์ค์ ์ ์๋ก ๋ค๋ฅธ Repository์์ ๊ด๋ฆฌํ๊ธฐ๋ ํ๋ค.
Application Repository → Java, Spring Boot, Dockerfile, Jenkinsfile Deployment Repository → Deployment, Service, Ingress, Helm, Kustomize ์ค์ ์ด๋ ๊ฒ ๋ถ๋ฆฌํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋ ๋ณ๊ฒฝ๊ณผ ๋ฐฐํฌ ์ค์ ๋ณ๊ฒฝ์ ์ด๋ ฅ์ ๊ฐ๊ฐ ๊ด๋ฆฌํ ์ ์๋ค.
Image Tag๋ ์ด๋ป๊ฒ ๋ฐฐํฌ ์ค์ ์ ๋ฐ์๋ ๊น?
Jenkins๊ฐ ์๋ก์ด ์ด๋ฏธ์ง๋ฅผ ์์ฑํ๋ค๊ณ ๊ฐ์ ํด ๋ณด์.
registry.example.com/my-spring-app:154ํ์ง๋ง ๋ฐฐํฌ ์ค์ ์๋ ์ด์ ๋ฒ์ ์ด ์์ฑ๋์ด ์๋ค.
image: registry.example.com/my-spring-app:153Argo CD๊ฐ ์๋ก์ด ์ด๋ฏธ์ง๋ฅผ ๋ฐฐํฌํ๋ ค๋ฉด Git์ Image Tag๊ฐ ๋ณ๊ฒฝ๋์ด์ผ ํ๋ค.
image: registry.example.com/my-spring-app:154Image Tag ๋ณ๊ฒฝ ๋ฐฉ์์ ํ๊ฒฝ์ ๋ฐ๋ผ ๋ค๋ฅผ ์ ์๋ค.
๊ฐ๋ฐ์๊ฐ ์ง์ ๋ฐฐํฌ ์ค์ ๋ณ๊ฒฝ Jenkins๊ฐ ๋ฐฐํฌ Repository ์์ ๋ณ๋์ Image ์ ๋ฐ์ดํธ ์๋ํ ๋๊ตฌ ์ฌ์ฉ Helm values ํ์ผ์ Image Tag ์์ Kustomize์ Image ์ค์ ์์ ์ค์ํ ์ ์ Registry์ ์ Image๊ฐ ์กด์ฌํ๋ ๊ฒ๊ณผ Kubernetes๊ฐ ํด๋น Image๋ฅผ ์ฌ์ฉํ๋๋ก ๋ฐฐํฌ ์ค์ ์ ๋ณ๊ฒฝํ๋ ๊ฒ์ ๋ณ๊ฐ์ ์์ ์ด๋ผ๋ ๊ฒ์ด๋ค.
๊ฐ๋ฐ·์คํ ์ด์ง·์ด์ ํ๊ฒฝ ๋ฐฐํฌ
์ค๋ฌด์์๋ ํ๋์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ๋ฌ ํ๊ฒฝ์ ๋ฐฐํฌํ๋ค.
๊ฐ๋ฐ ํ๊ฒฝ → ๊ธฐ๋ฅ ๊ฐ๋ฐ ๋ฐ ํตํฉ ํ ์คํธ ์คํ ์ด์ง ํ๊ฒฝ → ์ด์ ๋ฐฐํฌ ์ ๊ฒ์ฆ ์ด์ ํ๊ฒฝ → ์ค์ ์ฌ์ฉ์ ์๋น์ค๊ฐ ํ๊ฒฝ์ ์๋ก ๋ค๋ฅธ Namespace๋ Kubernetes Cluster๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
dev Namespace stg Namespace prod Namespace๋๋ ํ๊ฒฝ๋ณ๋ก ๋ฐฐํฌ ์ค์ ์ ๊ตฌ๋ถํ ์ ์๋ค.
deploy โโโ dev โ โโโ values.yaml โโโ stg โ โโโ values.yaml โโโ prod โโโ values.yaml์๋ฅผ ๋ค์ด ๊ฐ๋ฐ ํ๊ฒฝ์๋ ๋ค์ Image๊ฐ ๋ฐฐํฌ๋ ์ ์๋ค.
image: tag: build-154์คํ ์ด์ง ํ๊ฒฝ์์๋ ๊ฒ์ฆ์ด ์๋ฃ๋ ๋ฒ์ ์ ์ฌ์ฉํ ์ ์๋ค.
image: tag: release-1.2.0์ด์ ํ๊ฒฝ์๋ ์ต์ข ์น์ธ๋ ๋ฒ์ ๋ง ๋ฐ์ํ ์ ์๋ค.
image: tag: release-1.2.0ํ๊ฒฝ๋ณ ๋ฐฐํฌ ์ ์ฑ ์ ์กฐ์ง์ ๋ธ๋์น ์ ๋ต๊ณผ ์น์ธ ์ ์ฐจ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ค.
์ค์ ๋ฐฐํฌ ํ๋ฆ ์ดํด๋ณด๊ธฐ
Jenkins์ Argo CD๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ ๋ฐฐํฌ ํ๋ฆ์ ๋จ๊ณ๋ณ๋ก ์ดํด๋ณด์.
1. ๊ฐ๋ฐ์๊ฐ ์์ค๋ฅผ Pushํ๋ค
Feature Branch โ โผ Merge Request โ โผ main ๋๋ release Branch ๋ฐ์2. Jenkins Pipeline์ด ์คํ๋๋ค
์์ค Checkout โ โผ ํ ์คํธ โ โผ Gradle Build โ โผ JAR ์์ฑ3. Docker Image๋ฅผ ์์ฑํ๋ค
docker build \ -t registry.example.com/my-spring-app:154 \ .4. Registry์ Image๋ฅผ Pushํ๋ค
docker push registry.example.com/my-spring-app:1545. ๋ฐฐํฌ ์ค์ ์ Image Tag๋ฅผ ๋ณ๊ฒฝํ๋ค
image: registry.example.com/my-spring-app:1546. Argo CD๊ฐ ๋ณ๊ฒฝ ์ฌํญ์ ํ์ธํ๋ค
๊ธฐ์กด Git ์ค์ → my-spring-app:153 ๋ณ๊ฒฝ๋ Git ์ค์ → my-spring-app:154Argo CD์๋ OutOfSync ์ํ๊ฐ ํ์๋ ์ ์๋ค.
7. Kubernetes์ ๋ฐฐํฌํ๋ค
์๋ ๋๋ ์๋ Sync๋ฅผ ํตํด ์๋ก์ด ์ค์ ์ Kubernetes์ ๋ฐ์ํ๋ค.
Argo CD Sync โ โผ Deployment ๋ณ๊ฒฝ โ โผ ์๋ก์ด ReplicaSet ์์ฑ โ โผ ์๋ก์ด Pod ์์ฑ8. Health Check๋ฅผ ์ํํ๋ค
Startup Probe โ โผ Readiness Probe โ โผ ํธ๋ํฝ ์ฐ๊ฒฐ9. ๊ธฐ์กด Pod๋ฅผ ์ข ๋ฃํ๋ค
์๋ก์ด Pod๊ฐ ์ ์์ ์ผ๋ก ์ค๋น๋๋ฉด ๊ธฐ์กด Pod๊ฐ ์์ฐจ์ ์ผ๋ก ์ข ๋ฃ๋๋ค.
๊ธฐ์กด Pod โ โโ ํธ๋ํฝ ์ ์ธ โโ ์ข ๋ฃ ์๋ก์ด Pod โ โโ Health Check ์ฑ๊ณต โโ ํธ๋ํฝ ์ฒ๋ฆฌ
Rolling Update๋?
Kubernetes Deployment๋ ์ผ๋ฐ์ ์ผ๋ก ์๋ก์ด ๋ฒ์ ์ ๋ฐฐํฌํ ๋ ๋ชจ๋ ๊ธฐ์กด Pod๋ฅผ ํ ๋ฒ์ ์ข ๋ฃํ์ง ์๋๋ค.
์๋ก์ด Pod๋ฅผ ์์ฐจ์ ์ผ๋ก ์์ฑํ๊ณ , ์ ์ ์ํ๊ฐ ํ์ธ๋๋ฉด ๊ธฐ์กด Pod๋ฅผ ์ข ๋ฃํ๋ค.
์ด๋ฅผ Rolling Update๋ผ๊ณ ํ๋ค.
๊ธฐ์กด ์ํ Pod A - version 1 Pod B - version 1์๋ก์ด ๋ฒ์ ๋ฐฐํฌ๋ฅผ ์์ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋์ํ ์ ์๋ค.
Pod A - version 1 Pod B - version 1 Pod C - version 2 ์์ฑ ์ค์๋ก์ด Pod๊ฐ ์ ์์ ์ผ๋ก ์ค๋น๋๋ฉด ๊ธฐ์กด Pod๊ฐ ํ๋์ฉ ์ข ๋ฃ๋๋ค.
Pod B - version 1 Pod C - version 2 Pod D - version 2์ต์ข ์ ์ผ๋ก ์๋ก์ด ๋ฒ์ ์ Pod๋ง ๋จ๋๋ค.
Pod C - version 2 Pod D - version 2์ด ๋ฐฉ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋น์ค ์ค๋จ ์๊ฐ์ ์ค์ด๋ ๋ฐ ๋์์ด ๋๋ค.
ํ์ง๋ง ์๋ก์ด Pod์ Readiness Probe๊ฐ ํต๊ณผํ์ง ๋ชปํ๋ฉด ๋ฐฐํฌ๊ฐ ์๋ฃ๋์ง ์๊ฑฐ๋ Progressing ์ํ๊ฐ ์ค๋ ์ ์ง๋ ์ ์๋ค.
๋ฐฐํฌ ํ ํ์ธํด์ผ ํ ํญ๋ชฉ
Jenkins ๋น๋๊ฐ ์ฑ๊ณตํ๋ค๊ณ ํด์ ๋ฐฐํฌ๊น์ง ์ ์์ ์ผ๋ก ์๋ฃ๋ ๊ฒ์ ์๋๋ค.
๋ฐฐํฌ ํ์๋ ๋ค์ ํญ๋ชฉ์ ํ์ธํ๋ ๊ฒ์ด ์ข๋ค.
Jenkins ํ์ธ
Pipeline์ด ์ฑ๊ณตํ๋์ง ํ ์คํธ๊ฐ ํต๊ณผํ๋์ง JAR ํ์ผ์ด ์ ์์ ์ผ๋ก ์์ฑ๋์๋์ง Docker Image Build๊ฐ ์ฑ๊ณตํ๋์ง Registry Push๊ฐ ์ฑ๊ณตํ๋์ง ์์ฑ๋ Image Tag๊ฐ ๋ฌด์์ธ์งArgo CD ํ์ธ
๋์ ํ๊ฒฝ์ด ๋ง๋์ง ์ ์ฉ๋ Image Tag๊ฐ ๋ง๋์ง Sync ์ํ๊ฐ Synced์ธ์ง Health ์ํ๊ฐ Healthy์ธ์ง Deployment์ ReplicaSet์ด ์ ์์ธ์ง ์๋ก์ด Pod๊ฐ ์ ์ ์์ฑ๋์๋์งPod ํ์ธ
Pod ์ํ๊ฐ Running์ธ์ง Ready ์ํ์ธ์ง ์ฌ์์ ํ์๊ฐ ์ฆ๊ฐํ๊ณ ์์ง ์์์ง CrashLoopBackOff๊ฐ ๋ฐ์ํ์ง ์์๋์ง ImagePullBackOff๊ฐ ๋ฐ์ํ์ง ์์๋์ง ์ ํ๋ฆฌ์ผ์ด์ ๋ก๊ทธ์ ์ค๋ฅ๊ฐ ์๋์ง๊ฒฐ๊ตญ ๋ฐฐํฌ ์๋ฃ๋ ๋จ์ํ Jenkins์ ์ด๋ก์ ์ฑ๊ณต ํ์๊ฐ ๋ฌ ์์ ์ด ์๋๋ผ, ์๋ก์ด Pod๊ฐ ์ ์์ ์ผ๋ก ์คํ๋์ด ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์๋ ์ํ๊ฐ ๋ ์์ ์ด๋ผ๊ณ ๋ณผ ์ ์๋ค.
๋ฐฐํฌ ์คํจ๋ ์ด๋ ๊ตฌ๊ฐ์์ ๋ฐ์ํ ๊น?
CI/CD ๊ณผ์ ์ ์ฌ๋ฌ ๋จ๊ณ๋ก ๊ตฌ์ฑ๋๋ฏ๋ก ์คํจ ์์ธ๋ ๊ตฌ๊ฐ๋ณ๋ก ๋ค๋ฅด๋ค.
Jenkins ๋น๋ ์คํจ
์ปดํ์ผ ์ค๋ฅ ํ ์คํธ ์คํจ Gradle ์์กด์ฑ ๋ค์ด๋ก๋ ์คํจ JAR ์์ฑ ์คํจ Dockerfile ์ค๋ฅ Registry ์ธ์ฆ ์คํจArgo CD Sync ์คํจ
์๋ชป๋ YAML ๋ฌธ๋ฒ ์กด์ฌํ์ง ์๋ Kubernetes Resource ์ค์ ๊ถํ ๋ถ์กฑ Cluster ์ฐ๊ฒฐ ๋ฌธ์ ์๋ชป๋ Namespace ์ค์ Pod ์คํ ์คํจ
์กด์ฌํ์ง ์๋ Image Tag Registry ์ธ์ฆ ์คํจ ํ๊ฒฝ ๋ณ์ ๋๋ฝ Secret ๋๋ ConfigMap ๋๋ฝ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์คํจ ์ ํ๋ฆฌ์ผ์ด์ ์คํ ์ค๋ฅ Health Check ์คํจ์ด๋ ๋จ๊ณ์์ ์คํจํ๋์ง ๋จผ์ ๊ตฌ๋ถํ๋ฉด ๋ฌธ์ ๋ฅผ ๋ ๋น ๋ฅด๊ฒ ์ฐพ์ ์ ์๋ค.
Image๊ฐ ์์ฑ๋์ง ์์ → Jenkins ํ์ธ Git ์ค์ ์ด Cluster์ ๋ฐ์๋์ง ์์ → Argo CD Sync ํ์ธ ์ค์ ์ ๋ฐ์๋์ง๋ง ์ ํ๋ฆฌ์ผ์ด์ ์ด ์คํ๋์ง ์์ → Pod ์ํ ๋ฐ ๋ก๊ทธ ํ์ธ
๋ฐฐํฌ ์คํจ ์์
์๋ก์ด ๋ฒ์ ์ ๋ฐฐํฌํ๋๋ฐ Argo CD์์ ๋ค์๊ณผ ๊ฐ์ ์ํ๊ฐ ํ์๋๋ค๊ณ ๊ฐ์ ํด ๋ณด์.
Sync Status → Synced Health Status → DegradedGit ์ค์ ์ Kubernetes์ ๋ฐ์๋์์ผ๋ฏ๋ก Sync ์ํ๋ ์ ์์ด๋ค.
ํ์ง๋ง ์๋ก์ด Pod๊ฐ ์ ์์ ์ผ๋ก ์คํ๋์ง ์์๊ธฐ ๋๋ฌธ์ Health ์ํ๊ฐ ๋น์ ์์ผ๋ก ํ์๋๋ค.
Pod๋ฅผ ํ์ธํ๋๋ ๋ค์ ์ํ์ผ ์ ์๋ค.
CrashLoopBackOff์ด ๊ฒฝ์ฐ ๋ฐฐํฌ ์ค์ ์์ฒด๋ณด๋ค ์ ํ๋ฆฌ์ผ์ด์ ์คํ ๊ณผ์ ์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ ๊ฐ๋ฅ์ฑ์ด ์๋ค.
๋ค์ ํญ๋ชฉ์ ํ์ธํ๋ค.
Pod ๋ก๊ทธ ํ๊ฒฝ ๋ณ์ Secret ConfigMap ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ Spring Profile ์ธ๋ถ API ์ฐ๊ฒฐ๋ฐ๋๋ก ๋ค์๊ณผ ๊ฐ์ ์ํ๋ผ๋ฉด Registry ๋๋ Image ์ค์ ์ ํ์ธํด์ผ ํ๋ค.
ImagePullBackOff๋ํ์ ์ธ ์์ธ์ ๋ค์๊ณผ ๊ฐ๋ค.
Image Tag๊ฐ Registry์ ์กด์ฌํ์ง ์์ Image ์ฃผ์๊ฐ ์๋ชป๋จ Registry ์ ๊ทผ ๊ถํ์ด ์์ Image Pull Secret์ด ๋๋ฝ๋จ
CI/CD๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฌด์์ด ์ข์์ง๊น?
๋ฐ๋ณต ์์ ์๋ํ
๊ฐ๋ฐ์๊ฐ ๋งค๋ฒ ๋์ผํ ๋น๋์ ๋ฐฐํฌ ๋ช ๋ น์ ์ง์ ์คํํ์ง ์์๋ ๋๋ค.
์คํ ์ ์ฐจ ํ์คํ
๋๊ฐ ๋ฐฐํฌํ๋๋ผ๋ ๋์ผํ Pipeline๊ณผ ๋ฐฐํฌ ์ค์ ์ ์ฌ์ฉํ๋ค.
๋ฐฐํฌ ์ด๋ ฅ ๊ด๋ฆฌ
Git Commit, Jenkins Build, Docker Image Tag, Kubernetes ๋ฐฐํฌ ๋ฒ์ ์ ์ฐ๊ฒฐํด ์ถ์ ํ ์ ์๋ค.
๋น ๋ฅธ ํผ๋๋ฐฑ
์ปดํ์ผ ์ค๋ฅ๋ ํ ์คํธ ์คํจ๋ฅผ ์์ค ๋ฐ์ ๊ณผ์ ์์ ๋น ๋ฅด๊ฒ ๋ฐ๊ฒฌํ ์ ์๋ค.
๋ฐฐํฌ ์ํ ํ์ธ
Argo CD๋ฅผ ํตํด Kubernetes Resource์ Sync ์ํ์ Health ์ํ๋ฅผ ํ์ธํ ์ ์๋ค.
๋ณต๊ตฌ ๊ฐ๋ฅ์ฑ ํฅ์
์ด์ ๋ฐฐํฌ ์ค์ ๊ณผ Image Tag๊ฐ ๋จ์ ์๋ค๋ฉด ์ด์ ๋ฒ์ ์ผ๋ก ๋๋๋ฆด ์ ์๋ค.
๋ค๋ง ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง ๋ณ๊ฒฝ์ด๋ ์ธ๋ถ ์์คํ ํธํ์ฑ ๋ฌธ์ ๊ฐ ์๋ค๋ฉด ๋จ์ํ Image๋ง ์ด์ ๋ฒ์ ์ผ๋ก ๋๋๋ฆด ์ ์๋ ๊ฒฝ์ฐ๋ ์์ผ๋ฏ๋ก ํจ๊ป ๊ณ ๋ คํด์ผ ํ๋ค.
์ ์ฒด ํ๋ฆ ์ ๋ฆฌ
Jenkins์ Argo CD๋ฅผ ์ฌ์ฉํ๋ ์ ์ฒด CI/CD ํ๋ฆ์ ๋ค์๊ณผ ๊ฐ๋ค.
๊ฐ๋ฐ์ โ โ Git Push โผ Application Git Repository โ โผ Jenkins โ โโ Source Checkout โโ Test โโ Gradle Build โโ Docker Build โโ Docker Push โ โผ Docker Registry โ โผ Deployment Git Repository โ โ Image Tag ๋ณ๊ฒฝ โผ Argo CD โ โโ ๋ณ๊ฒฝ ์ฌํญ ํ์ธ โโ Sync โโ Health ์ํ ํ์ธ โ โผ Kubernetes โ โโ ์๋ก์ด ReplicaSet ์์ฑ โโ ์๋ก์ด Pod ์์ฑ โโ Health Check โโ ํธ๋ํฝ ์ฐ๊ฒฐ โโ ๊ธฐ์กด Pod ์ข ๋ฃ โ โผ ์๋น์ค ๋ฐ์Jenkins๋ ๋ฐฐํฌ ๊ฐ๋ฅํ Docker Image๋ฅผ ๋ง๋๋ ์ญํ ์ ๋ด๋นํ๋ค.
Argo CD๋ Git์ ์ ์ฅ๋ Kubernetes ๋ฐฐํฌ ์ค์ ์ ์ค์ Cluster์ ๋ฐ์ํ๊ณ , Resource์ ์ํ๋ฅผ ํ์ธํ๋ ์ญํ ์ ๋ด๋นํ๋ค.
Kubernetes๋ ์๋ก์ด Pod๋ฅผ ์์ฑํ๊ณ Health Check๋ฅผ ํตํด ์์ฒญ์ ์ฒ๋ฆฌํ ์ค๋น๊ฐ ๋์๋์ง ํ์ธํ๋ค.
์ ๋ฆฌ
CI/CD๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น๋, ํ ์คํธ, ๋ฐฐํฌ ๊ณผ์ ์ ์๋ํํ๋ ๋ฐฉ๋ฒ์ด๋ค.
ํต์ฌ ๋ด์ฉ์ ์ ๋ฆฌํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
CI → ์์ค๋ฅผ ๋น๋ํ๊ณ ํ ์คํธํ์ฌ ๋ฐฐํฌ ๊ฐ๋ฅํ ๊ฒฐ๊ณผ๋ฌผ์ ์์ฑ CD → ์์ฑ๋ ๊ฒฐ๊ณผ๋ฌผ์ ๋์ ํ๊ฒฝ์ ๋ฐฐํฌ Jenkins → ํ ์คํธ, ์ ํ๋ฆฌ์ผ์ด์ ๋น๋, Docker Image ์์ฑ, Registry Push Argo CD → Git์ Kubernetes ์ค์ ์ Cluster์ ๋ฐ์ํ๊ณ ๋ฐฐํฌ ์ํ ๊ด๋ฆฌ Docker Registry → Jenkins๊ฐ ์์ฑํ Docker Image ์ ์ฅ Kubernetes → Registry์ Image๋ฅผ ์ด์ฉํด ์๋ก์ด Pod ์คํ Health Check → ์๋ก์ด Pod๊ฐ ์ ์์ ์ผ๋ก ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์๋์ง ํ์ธJenkins์ ๋น๋๊ฐ ์ฑ๊ณตํ๋ค๊ณ ํด์ ์ ์ฒด ๋ฐฐํฌ๊ฐ ์๋ฃ๋ ๊ฒ์ ์๋๋ค.
Argo CD์ Sync ์ํ์ Health ์ํ๋ฅผ ํ์ธํ๊ณ , ์ต์ข ์ ์ผ๋ก ์๋ก์ด Pod๊ฐ ์ ์์ ์ผ๋ก ์คํ๋๋์ง ํ์ธํด์ผ ํ๋ค.
๊ฒฐ๊ตญ ์ ์ฒด ํ๋ฆ์ ๋ค์๊ณผ ๊ฐ์ด ์ดํดํ ์ ์๋ค.
Jenkins๊ฐ Image๋ฅผ ๋ง๋ค๊ณ Registry๊ฐ Image๋ฅผ ์ ์ฅํ๊ณ Argo CD๊ฐ ๋ฐฐํฌ ์ค์ ์ ๋ฐ์ํ๊ณ Kubernetes๊ฐ Pod๋ฅผ ์คํํ๋ค๋ค์ ๊ธ
์ง๊ธ๊น์ง Jenkins์ Argo CD๋ฅผ ์ด์ฉํด Spring Boot ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋น๋๋๊ณ Kubernetes์ ๋ฐฐํฌ๋๋ ํ๋ฆ์ ์์๋ดค๋ค.
์ด ๊ณผ์ ์์ Kubernetes๋ ์๋ก์ด Docker Image๋ฅผ ์ด์ฉํด Pod๋ฅผ ์์ฑํ๊ณ ๊ด๋ฆฌํ๋ค.
๊ทธ๋ ๋ค๋ฉด Kubernetes๋ ์ ํํ ๋ฌด์์ด๋ฉฐ, Pod์ Node๋ ์ด๋ค ์ญํ ์ ํ ๊น?
“Docker Container์ Kubernetes Pod๋ ๋ฌด์์ด ๋ค๋ฅผ๊น?”
๋ค์ ๊ธ์์๋ Kubernetes๋? Pod์ Node ์ดํดํ๊ธฐ๋ฅผ ์ฃผ์ ๋ก, Kubernetes๊ฐ Container๋ฅผ ์ด๋ป๊ฒ ์คํํ๊ณ ๊ด๋ฆฌํ๋์ง ์์๋ณด๊ฒ ๋ค.
'DevOps' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
8. Deployment์ ReplicaSet ์ดํดํ๊ธฐ (0) 2026.07.24 7. Kubernetes๋? Pod์ Node ์ดํดํ๊ธฐ (0) 2026.07.24 5. Docker Registry๋? Docker Hub์ ์ด๋ฏธ์ง ์ ์ฅ์ ์ดํดํ๊ธฐ (0) 2026.07.23 4. ์์ค๋ฅผ ์์ ํ๋ฉด Docker๋ ์ด๋ป๊ฒ ๋์ํ ๊น? (0) 2026.07.23 3. Dockerfile์ด๋? Spring Boot ์ด๋ฏธ์ง ๋ง๋ค๊ธฐ (0) 2026.07.22