Kubernetes Tools/ArgoCD

[Ep.37] [Argo CD ์šด์˜ ์ตœ์ ํ™” #7] Argo CD์˜ ๋„คํŠธ์›Œํฌ ๋ฐ ์„œ๋น„์Šค ๋””์Šค์ปค๋ฒ„๋ฆฌ ์ตœ์ ํ™”

ygtoken 2025. 3. 17. 13:13
728x90

๐Ÿ”น Kubernetes์—์„œ ๋„คํŠธ์›Œํฌ ๋ฐ ์„œ๋น„์Šค ๋””์Šค์ปค๋ฒ„๋ฆฌ์˜ ์ค‘์š”์„ฑ

Kubernetes ํ™˜๊ฒฝ์—์„œ๋Š” ์„œ๋น„์Šค ๊ฐ„์˜ ํ†ต์‹ ์ด ํ•„์ˆ˜์ ์ด๋ฉฐ,
์˜ฌ๋ฐ”๋ฅธ ๋„คํŠธ์›Œํฌ ์ •์ฑ…๊ณผ ์„œ๋น„์Šค ๋””์Šค์ปค๋ฒ„๋ฆฌ ๊ตฌ์„ฑ์„ ํ†ตํ•ด ์•ˆ์ •์ ์ธ ๋ฐฐํฌ ๋ฐ ์šด์˜์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

 

โœ… ๋„คํŠธ์›Œํฌ ๋ฐ ์„œ๋น„์Šค ๋””์Šค์ปค๋ฒ„๋ฆฌ๋ฅผ ์ตœ์ ํ™”ํ•ด์•ผ ํ•˜๋Š” ์ด์œ 

โœ” Pod ๊ฐ„ ์•ˆ์ •์ ์ธ ํ†ต์‹  ๋ณด์žฅ
โœ” ์™ธ๋ถ€ ํŠธ๋ž˜ํ”ฝ์„ ์•ˆ์ „ํ•˜๊ฒŒ ๊ด€๋ฆฌ
โœ” ์„œ๋น„์Šค ๋ฉ”์‰ฌ(Service Mesh)์™€ ์—ฐ๊ณ„ํ•˜์—ฌ ํŠธ๋ž˜ํ”ฝ ์ œ์–ด
โœ” Argo CD์™€ ์—ฐ๋™ํ•˜์—ฌ ๋ฐฐํฌ ์‹œ ๋„คํŠธ์›Œํฌ ์ •์ฑ… ์ž๋™ ์ ์šฉ


๐Ÿ”น 1. Kubernetes ๋„คํŠธ์›Œํฌ ์ •์ฑ…๊ณผ Argo CD ์—ฐ๋™

๐Ÿ“Œ ๋„คํŠธ์›Œํฌ ์ •์ฑ…(NetworkPolicy)์ด ํ•„์š”ํ•œ ์ด์œ 

๊ธฐ๋ณธ์ ์œผ๋กœ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด ๋ชจ๋“  Pod๋Š” ์„œ๋กœ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ, ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•˜๊ณ  ๋„คํŠธ์›Œํฌ ๊ฒฉ๋ฆฌ๋ฅผ ์œ„ํ•ด ๋„คํŠธ์›Œํฌ ์ •์ฑ…(NetworkPolicy) ์„ ์ ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

โœ… ๋„คํŠธ์›Œํฌ ์ •์ฑ… ์ฃผ์š” ๊ธฐ๋Šฅ
โœ” ํŠน์ • ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋˜๋Š” Pod ๊ฐ„ ํ†ต์‹ ์„ ํ—ˆ์šฉ ๋˜๋Š” ์ฐจ๋‹จ
โœ” ์™ธ๋ถ€ ํŠธ๋ž˜ํ”ฝ์„ ์ œํ•œํ•˜์—ฌ ๋ณด์•ˆ ๊ฐ•ํ™”
โœ” Argo CD ๋ฐฐํฌ ์‹œ ์ž๋™์œผ๋กœ ๋„คํŠธ์›Œํฌ ์ •์ฑ…์„ ์„ค์ •

โœ… ๋„คํŠธ์›Œํฌ ์ •์ฑ… ์ ์šฉ ์˜ˆ์ œ

๐Ÿ“Œ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ์ธ๋ฐ”์šด๋“œ ํŠธ๋ž˜ํ”ฝ ์ฐจ๋‹จ (๊ธฐ๋ณธ ์ฐจ๋‹จ ์ •์ฑ…)

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-all
  namespace: example
spec:
  podSelector: {}  # ๋ชจ๋“  Pod์— ์ ์šฉ
  policyTypes:
    - Ingress  # ๋“ค์–ด์˜ค๋Š” ํŠธ๋ž˜ํ”ฝ ์ฐจ๋‹จ
    - Egress   # ๋‚˜๊ฐ€๋Š” ํŠธ๋ž˜ํ”ฝ ์ฐจ๋‹จ

 

โœ… ์„ค๋ช…:
โœ” podSelector: {} → ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋‚ด ๋ชจ๋“  Pod์— ์ ์šฉ
โœ” policyTypes: Ingress, Egress → ๋“ค์–ด์˜ค๋Š” ํŠธ๋ž˜ํ”ฝ๊ณผ ๋‚˜๊ฐ€๋Š” ํŠธ๋ž˜ํ”ฝ ๋ชจ๋‘ ์ฐจ๋‹จ


โœ… ํŠน์ • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐ„ ํ†ต์‹  ํ—ˆ์šฉ (Argo CD ์ ์šฉ)

๋ฐฐํฌ๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐ„ ๋‚ด๋ถ€ ํ†ต์‹ ์„ ํ—ˆ์šฉํ•˜๋Š” ๋„คํŠธ์›Œํฌ ์ •์ฑ…์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

 

๐Ÿ“Œ ํŠน์ • ๋ผ๋ฒจ์ด ์žˆ๋Š” Pod ๊ฐ„ ํ†ต์‹  ํ—ˆ์šฉ

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-app-communication
  namespace: example
spec:
  podSelector:
    matchLabels:
      app: example-app  # example-app ๋ ˆ์ด๋ธ”์„ ๊ฐ€์ง„ Pod์— ์ ์šฉ
  ingress:
    - from:
        - podSelector:
            matchLabels:
              app: example-api  # example-api ๋ ˆ์ด๋ธ”์„ ๊ฐ€์ง„ Pod๋งŒ ์ ‘๊ทผ ํ—ˆ์šฉ
      ports:
        - protocol: TCP
          port: 8080  # 8080 ํฌํŠธ๋กœ ํ†ต์‹  ๊ฐ€๋Šฅ

 

โœ… ์„ค๋ช…:
โœ” podSelector.matchLabels.app: example-app → example-app Pod๋งŒ ์ ์šฉ
โœ” from.podSelector.matchLabels.app: example-api → example-api Pod๋งŒ ํ†ต์‹  ๊ฐ€๋Šฅ
โœ” ports.port: 8080 → 8080 ํฌํŠธ๋กœ๋งŒ ํŠธ๋ž˜ํ”ฝ ํ—ˆ์šฉ

 

โœ… ๋ฐฐํฌ๋œ ๋„คํŠธ์›Œํฌ ์ •์ฑ… ํ™•์ธ

kubectl get networkpolicy -n example

 

โœ… ์ถœ๋ ฅ ์˜ˆ์‹œ:

NAME                      POD-SELECTOR      AGE
deny-all                  <none>            10m
allow-app-communication   app=example-app   2m

 

โœ… Argo CD์—์„œ ๋„คํŠธ์›Œํฌ ์ •์ฑ…์„ ์ž๋™ ์ ์šฉํ•˜๋„๋ก ์„ค์ •

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: example-network-policy
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/example/repo.git
    targetRevision: main
    path: network-policy  # ๋„คํŠธ์›Œํฌ ์ •์ฑ…์ด ์ €์žฅ๋œ Git ๊ฒฝ๋กœ
  destination:
    server: https://kubernetes.default.svc
    namespace: example
  syncPolicy:
    automated:
      prune: true
      selfHeal: true

 

โœ… Argo CD์—์„œ ๋„คํŠธ์›Œํฌ ์ •์ฑ… ๋™๊ธฐํ™”

argocd app sync example-network-policy

๐Ÿ”น 2. Argo CD์™€ Service Mesh ์—ฐ๋™ (Istio ํ™œ์šฉ)

์„œ๋น„์Šค ๋ฉ”์‰ฌ(Service Mesh)๋Š” ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ๊ฐ„ ํŠธ๋ž˜ํ”ฝ์„ ๋ณด๋‹ค ์ •๋ฐ€ํ•˜๊ฒŒ ์ œ์–ดํ•˜๊ณ , ๋ณด์•ˆ๊ณผ ๊ด€์ฐฐ์„ฑ์„ ๊ฐ•ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค.

 

โœ… Istio๋ฅผ ํ™œ์šฉํ•œ ํŠธ๋ž˜ํ”ฝ ์ œ์–ด ์ฃผ์š” ๊ธฐ๋Šฅ
โœ” Canary ๋ฐฐํฌ ์‹œ ํŠน์ • ํŠธ๋ž˜ํ”ฝ๋งŒ ์‹ ๊ทœ ๋ฒ„์ „์œผ๋กœ ๋ผ์šฐํŒ… ๊ฐ€๋Šฅ
โœ” TLS ์•”ํ˜ธํ™”๋ฅผ ํ†ตํ•œ ์„œ๋น„์Šค ๊ฐ„ ๋ณด์•ˆ ๊ฐ•ํ™”
โœ” Argo CD์™€ ์—ฐ๋™ํ•˜์—ฌ ์ž๋™์œผ๋กœ Istio ์„ค์ • ๋ฐฐํฌ ๊ฐ€๋Šฅ

โœ… Istio VirtualService๋ฅผ ํ™œ์šฉํ•œ ํŠธ๋ž˜ํ”ฝ ๊ด€๋ฆฌ

๐Ÿ“Œ ๊ธฐ์กด ๋ฒ„์ „(Stable)๊ณผ ์‹ ๊ทœ ๋ฒ„์ „(Canary) ํŠธ๋ž˜ํ”ฝ์„ 80:20์œผ๋กœ ๋ฐฐ๋ถ„

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: example-traffic-split
  namespace: example
spec:
  hosts:
    - example-app.example.svc.cluster.local  # ๋‚ด๋ถ€ ์„œ๋น„์Šค ์ฃผ์†Œ
  http:
    - route:
        - destination:
            host: example-app
            subset: stable  # ๊ธฐ์กด ๋ฒ„์ „
          weight: 80  # 80% ํŠธ๋ž˜ํ”ฝ ํ• ๋‹น
        - destination:
            host: example-app
            subset: canary  # ์‹ ๊ทœ ๋ฒ„์ „
          weight: 20  # 20% ํŠธ๋ž˜ํ”ฝ ํ• ๋‹น

 

โœ… ์„ค๋ช…:
โœ” route.destination.host: example-app → ํŠธ๋ž˜ํ”ฝ์„ ๋ณด๋‚ผ ๋Œ€์ƒ ์„œ๋น„์Šค
โœ” subset: stable → ๊ธฐ์กด ๋ฒ„์ „(stable)์œผ๋กœ 80% ํŠธ๋ž˜ํ”ฝ
โœ” subset: canary → ์‹ ๊ทœ ๋ฒ„์ „(canary)์œผ๋กœ 20% ํŠธ๋ž˜ํ”ฝ

 

โœ… Argo CD์—์„œ Istio ์„ค์ •์„ ์ž๋™ ๋ฐฐํฌ

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: example-istio-config
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/example/repo.git
    targetRevision: main
    path: istio-config  # Istio ์„ค์ •์ด ์ €์žฅ๋œ Git ๊ฒฝ๋กœ
  destination:
    server: https://kubernetes.default.svc
    namespace: example
  syncPolicy:
    automated:
      prune: true
      selfHeal: true

 

โœ… ๋ฐฐํฌ๋œ Istio ์„ค์ • ํ™•์ธ

kubectl get virtualservice -n example

 

โœ… ์ถœ๋ ฅ ์˜ˆ์‹œ:

NAME                   GATEWAYS    HOSTS                            AGE
example-traffic-split  <none>      example-app.example.svc.cluster.local   5m

๐Ÿ”น 3. ๋„คํŠธ์›Œํฌ ๋ฐ ์„œ๋น„์Šค ๋””์Šค์ปค๋ฒ„๋ฆฌ ์šด์˜ ์‹œ ๊ณ ๋ คํ•  ์ 

โœ… 1๏ธโƒฃ ๋„คํŠธ์›Œํฌ ์ •์ฑ… ์ตœ์†Œ ๊ถŒํ•œ ์›์น™ ์ ์šฉ
โœ” ๋ชจ๋“  ๋„คํŠธ์›Œํฌ ์ •์ฑ…์„ ๊ธฐ๋ณธ ์ฐจ๋‹จํ•œ ํ›„, ํ•„์š”ํ•œ ์„œ๋น„์Šค ๊ฐ„์˜ ํ†ต์‹ ๋งŒ ํ—ˆ์šฉ

 

โœ… 2๏ธโƒฃ Istio ์„œ๋น„์Šค ๋ฉ”์‰ฌ ํ™œ์šฉ
โœ” Istio VirtualService๋ฅผ ํ™œ์šฉํ•˜์—ฌ Canary ๋ฐฐํฌ ๋ฐ ํŠธ๋ž˜ํ”ฝ ์ œ์–ด ์ ์šฉ

 

โœ… 3๏ธโƒฃ Argo CD์™€ ์—ฐ๊ณ„ํ•œ ๋„คํŠธ์›Œํฌ ์ž๋™ํ™”
โœ” GitOps ๋ฐฉ์‹์œผ๋กœ ๋„คํŠธ์›Œํฌ ์ •์ฑ… ๋ฐ ์„œ๋น„์Šค ๋””์Šค์ปค๋ฒ„๋ฆฌ ๊ด€๋ฆฌ

 

โœ… 4๏ธโƒฃ ์™ธ๋ถ€ ํŠธ๋ž˜ํ”ฝ ์ œํ•œ
โœ” LoadBalancer ๋˜๋Š” Ingress Controller๋ฅผ ํ†ตํ•ด ์™ธ๋ถ€ ์ ‘๊ทผ์„ ์ œ์–ด


๐Ÿ”น ๊ฒฐ๋ก : ์ด๋ฒˆ ๊ธ€์—์„œ ๋ฐฐ์šด ํ•ต์‹ฌ ๋‚ด์šฉ ์ •๋ฆฌ

๐ŸŸข ๋„คํŠธ์›Œํฌ ์ •์ฑ…(NetworkPolicy)์„ ์ ์šฉํ•˜์—ฌ ์„œ๋น„์Šค ๊ฐ„ ํ†ต์‹ ์„ ์•ˆ์ „ํ•˜๊ฒŒ ๊ด€๋ฆฌ ๊ฐ€๋Šฅ
๐ŸŸข Argo CD์™€ ์—ฐ๋™ํ•˜์—ฌ ๋„คํŠธ์›Œํฌ ์ •์ฑ…์„ ์ž๋™ ๋ฐฐํฌ ๋ฐ ๋™๊ธฐํ™” ๊ฐ€๋Šฅ
๐ŸŸข Istio VirtualService๋ฅผ ํ™œ์šฉํ•˜์—ฌ Canary ๋ฐฐํฌ ๋ฐ ํŠธ๋ž˜ํ”ฝ ๋ถ„๋ฐฐ ์ตœ์ ํ™” ๊ฐ€๋Šฅ
๐ŸŸข GitOps ๋ฐฉ์‹์œผ๋กœ ๋„คํŠธ์›Œํฌ ๋ฐ ์„œ๋น„์Šค ๋””์Šค์ปค๋ฒ„๋ฆฌ๋ฅผ ์šด์˜ํ•  ์ˆ˜ ์žˆ์Œ

728x90