ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 6. Jenkins์™€ Argo CD๋กœ ์ดํ•ดํ•˜๋Š” CI/CD
    DevOps 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 Registry
     

    Jenkins๊ฐ€ ๋ชจ๋“  ๋‹จ๊ณ„๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒํ•˜๋ฉด ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ 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:152
     

     

    Git 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: 8080
     

     

    image ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์–ด 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:153
     

     

    Argo CD๊ฐ€ ์ƒˆ๋กœ์šด ์ด๋ฏธ์ง€๋ฅผ ๋ฐฐํฌํ•˜๋ ค๋ฉด Git์˜ Image Tag๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•œ๋‹ค.

    image: registry.example.com/my-spring-app:154
     

     

    Image 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:154
     

    5. ๋ฐฐํฌ ์„ค์ •์˜ Image Tag๋ฅผ ๋ณ€๊ฒฝํ•œ๋‹ค

    image: registry.example.com/my-spring-app:154
     

    6. Argo CD๊ฐ€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํ™•์ธํ•œ๋‹ค

    ๊ธฐ์กด Git ์„ค์ •
    → my-spring-app:153
    
    ๋ณ€๊ฒฝ๋œ Git ์„ค์ •
    → my-spring-app:154
     

    Argo 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
    → Degraded
     

    Git ์„ค์ •์€ 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๋ฅผ ์–ด๋–ป๊ฒŒ ์‹คํ–‰ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š”์ง€ ์•Œ์•„๋ณด๊ฒ ๋‹ค.

     
     
     
     
     

    ๋Œ“๊ธ€

Designed by Tistory.