Jenkins & ArgoCD

ํ™ฉ์—ฐ์ค€ยท2025๋…„ 4์›” 28์ผ

Spring Boot + Kubernetes + ArgoCD + Jenkins ๋ฐฐํฌ ๊ธฐ๋ก

๊ฐœ์š”

  • Spring Boot ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(Swagger, Google OAuth2.0)์„ Kubernetes์— ๋ฐฐํฌ
  • Jenkins๋กœ ์ด๋ฏธ์ง€ ๋นŒ๋“œ ๋ฐ Harbor์— push (CI)
  • ArgoCD๋ฅผ ํ†ตํ•œ GitOps ๋ฐฉ์‹์˜ ๋ฐฐํฌ ์ž๋™ํ™” (CD)
  • ConfigMap/Secret์œผ๋กœ ํ™˜๊ฒฝ ๋ถ„๋ฆฌ ๋ฐ ๊ด€๋ฆฌ
  • Health Check Probe(startup, liveness, readiness) ์ ์šฉ

์ตœ์ข… ๊ตฌ์„ฑ๋„


์ด๋ฏธ์ง€ ๋ณ€๊ฒฝ ์‹œ Flow

git push โ†’ Jenkins ์ˆ˜๋™ build โ†’ Docker ์ด๋ฏธ์ง€ Harbor์— push โ†’ Deployment manifest ์ˆ˜์ • โ†’ ArgoCD Sync โ†’ Pod ์žฌ์‹œ์ž‘

ArgoCD๋ฅผ ํ†ตํ•œ Manifest ์—…๋ฐ์ดํŠธ

Jenkins๋Š” ์ด๋ฏธ์ง€ ๋นŒ๋“œ ์ „์šฉ, ArgoCD๋Š” manifest ๋ฐ˜์˜ ์ „์šฉ

Jenkins

  • ํ˜„์žฌ๋Š” ๋กœ์ปฌ์—์„œ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— GitHub Webhook ๋Œ€์‹  ์ˆ˜๋™ ๋นŒ๋“œ

  • GitHub Webhook ์„ค์ •

Harbor

  • Jenkins์—์„œ ๋นŒ๋“œ๋œ ์ด๋ฏธ์ง€๋ฅผ Harbor์— push


ArgoCD

  • Git repository์˜ manifest ํŒŒ์ผ์„ ๊ธฐ์ค€์œผ๋กœ Kubernetes ์ƒํƒœ๋ฅผ ๋™๊ธฐํ™”


ConfigMap & Secret

ConfigMap

  • ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์ฃผ์ž…

Secret

  • ๋ฏผ๊ฐ ์ •๋ณด(base64 ์ธ์ฝ”๋”ฉ)

Ingress + OAuth2 (Google Login)

  • Ingress๋ฅผ ํ†ตํ•œ HTTPS ์ ‘๊ทผ ์„ค์ • ๋ฐ Spring Security OAuth2 ๋กœ๊ทธ์ธ


Database ํ™•์ธ (DBeaver)

  • ๋กœ๊ทธ์ธ ํ›„ member ํ…Œ์ด๋ธ” ์ €์žฅ ํ™•์ธ

Swagger ์ ์šฉ


Kubernetes Health Check ๋ฐ Pod Anti-Affinity ์„ค์ • ์ •๋ฆฌ

1. Pod Anti-Affinity

๋™์ผํ•œ ์•ฑ ๋ ˆ์ด๋ธ”์„ ๊ฐ€์ง„ Pod์ด ๊ฐ™์€ ๋…ธ๋“œ์— ๋œจ์ง€ ์•Š๋„๋ก ์ œํ•œํ•˜๋Š” ์ •์ฑ…

affinity:
  podAntiAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
            - key: app
              operator: In
              values:
                - sk030-my-app
        topologyKey: "kubernetes.io/hostname"
  • topologyKey: ๋…ธ๋“œ ๋‹จ์œ„ ๋ถ„์‚ฐ
  • required...: ๊ฐ•์ œ ์กฐ๊ฑด
  • preferred...: soft ์กฐ๊ฑด์œผ๋กœ fallback ํ—ˆ์šฉ

2. Health Probes

Kubernetes๋Š” ์ปจํ…Œ์ด๋„ˆ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด 3๊ฐ€์ง€ probe๋ฅผ ์ง€์›ํ•œ๋‹ค.

startupProbe

startupProbe:
  httpGet:
    path: /actuator/health
    port: 23456
  failureThreshold: 30
  periodSeconds: 1
  initialDelaySeconds: 60
  • ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹œ์ž‘๋˜์—ˆ๋Š”์ง€๋ฅผ ํŒ๋‹จ
  • Spring Boot 3.x ๊ธฐ์ค€ /actuator/health/startup ์ง€์›ํ•˜๋ ค๋ฉด:
management:
  endpoint:
    health:
      probes:
        enabled: true
      startup:
        enabled: true
  • Spring Boot 2.x์—๋Š” startup ๋ฏธ์ง€์›

livenessProbe

livenessProbe:
  httpGet:
    path: /actuator/health
    port: 23456
  initialDelaySeconds: 60
  periodSeconds: 10
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‚ด์•„์žˆ๋Š”์ง€ ์ฒดํฌ
  • ์‹คํŒจํ•˜๋ฉด Pod ์žฌ์‹œ์ž‘

readinessProbe

readinessProbe:
  httpGet:
    path: /actuator/health
    port: 23456
  initialDelaySeconds: 60
  periodSeconds: 5
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์š”์ฒญ ๋ฐ›์„ ์ค€๋น„๊ฐ€ ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ
  • ์‹คํŒจ ์‹œ Service ์—ฐ๊ฒฐ์—์„œ ์ œ์™ธ๋จ

actuator ์‘๋‹ต ์˜ˆ์‹œ

{
  "status": "UP",
  "groups": ["liveness", "readiness"]
}
  • /actuator/health๋กœ ํ†ตํ•ฉ ํ™•์ธ ๊ฐ€๋Šฅ
  • startup group์€ spring ์„ค์ • ํ•„์š”

๐Ÿ›  ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… ์ •๋ฆฌ

์ฆ์ƒ์›์ธํ•ด๊ฒฐ
connection refusedํฌํŠธ ๋ถˆ์ผ์น˜ (Spring Boot vs K8s manifest)server.port์™€ containerPort ์ผ์น˜์‹œํ‚ด
404 Not Foundactuator endpoint ์—†์Œactuator config ํ™•์ธ (startup, readiness ๋“ฑ)
Probe failed์ดˆ๊ธฐ ์‹œ๊ฐ„ ๋ถ€์กฑinitialDelaySeconds 60์ดˆ ์ด์ƒ ์ถ”์ฒœ

0๊ฐœ์˜ ๋Œ“๊ธ€