5 min read

ํ—˜๋‚œํ•œ Kubernetes ์ „ํ™˜๊ธฐ (3) - K8s๋กœ ์„œ๋น„์Šค ์ด์‚ฌํ•˜๊ธฐ

Table of Contents

Docker to K8s

์ง€๋‚œ ๋ช‡ ๊ฐœ์›”๊ฐ„ Azure Kubernetes Service์™€ Amazon EKS ํ™˜๊ฒฝ์„ ์ฐจ๋ก€๋กœ ๊ตฌ์ถ•ํ•˜๋ฉฐ Kubernetes ์ „ํ™˜์˜ ๊ธฐ๋ฐ˜์„ ๋งˆ๋ จํ•˜๊ณ , ์ผ๋ถ€ ์„œ๋น„์Šค๋ฅผ ์‹ค์ œ๋กœ ์ „ํ™˜ํ•˜๊ธฐ๋„ ํ–ˆ์Šต๋‹ˆ๋‹ค.
์ตœ๊ทผ์— ๋ณธ๊ฒฉ์ ์œผ๋กœ ๊ธฐ์กด ์„œ๋น„์Šค๋“ค์„ ์ฐจ๋ก€์ฐจ๋ก€ Kubernetes ํ™˜๊ฒฝ์œผ๋กœ ์ด์ „ํ–ˆ๋Š”๋ฐ, ๊ทธ ๊ณผ์ •์—์„œ ๊ณ ๋ฏผํ•œ ๊ด€๋ฆฌ ๋ฐฉ์‹๊ณผ ๊ณผ์ •์„ ์ •๋ฆฌํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

Repository ๊ตฌ์กฐ ์„ค๊ณ„

Kubernetes ํ™˜๊ฒฝ์œผ๋กœ ์ „ํ™˜ํ•˜๋ฉด์„œ ๊ฐ€์žฅ ๋งŽ์ด ํ–ˆ๋˜ ๊ณ ๋ฏผ์€ ๋ฐฐํฌ ๊ด€๋ จ ์ฝ”๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ด€๋ฆฌํ•  ๊ฒƒ์ธ๊ฐ€์˜€์Šต๋‹ˆ๋‹ค. ์ด์ „ ๋‹จ๊ณ„์—์„œ ํ™˜๊ฒฝ์„ ๊ตฌ์„ฑํ•˜๊ณ  ์ผ๋ถ€ ์„œ๋น„์Šค๋ฅผ ์ด์ „ํ•˜๋ฉด์„œ๋„ ๊ณ„์† ๊ณ ๋ฏผํ–ˆ๋˜ ์ฃผ์ œ์˜€์Šต๋‹ˆ๋‹ค.

๊ธฐ์กด์—๋Š” ๊ฐ ์„œ๋น„์Šค Repository์— ๋ฐฐํฌ ๊ด€๋ จ ํŒŒ์ผ๋“ค์ด ๋ถ„์‚ฐ๋˜์–ด ์žˆ์—ˆ๋Š”๋ฐ, ์„œ๋น„์Šค ์ˆ˜๊ฐ€ ๋งŽ์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ํฐ ๋ฌธ์ œ๋Š” ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์•ž์œผ๋กœ ์„œ๋น„์Šค๋Š” ๊ณ„์† ๋Š˜์–ด๋‚  ๊ฑฐ๊ณ , ํ˜„์žฌ ์‚ฌ์šฉํ•˜๋Š” Helm Chart ๋“ฑ์˜ ํ˜•ํƒœ๋„ ๋ชจ๋‘ ์ œ๊ฐ๊ฐ์ด๋ผ ์ผ๊ด€์„ฑ์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋ฉด ํŒ€ ๋‚ด์—์„œ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ํž˜๋“ค์–ด์ง€๊ณ , ํŠน์ • ์„œ๋น„์Šค์˜ ๋ฐฐํฌ ์„ค์ •์„ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด ๋งค๋ฒˆ ๋‹ค๋ฅธ ๊ณณ์„ ์ฐพ์•„๊ฐ€์•ผ ํ•˜๋Š” ๋ถˆํŽธํ•จ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ, ๋‹ค๋ฅธ ํŒ€์—์„œ ๋ฐฐํฌ ๊ด€๋ จ Commit์ด ๊ฐœ๋ฐœ ๊ด€๋ จ Commit๊ณผ ์„ž์ด๊ธฐ๋ฅผ ์›ํ•˜์ง€๋„ ์•Š๋Š”๋‹ค๋Š” ์˜๊ฒฌ๋„ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ํฌํ•จํ•œ ์—ฌ๋Ÿฌ ๊ณ ๋ฏผ ๋์— ๋ถ„๋ฆฌ๋˜๊ณ  ์ค‘์•™ํ™”๋œ Helm Chart + Argo CD ์„ค์ • Repository๋ฅผ ๊ตฌ์„ฑํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ๋ถ€ํ„ฐ ๊ฐ€๋Šฅํ•˜๋ฉด ๊ฒฌ๊ณ ํ•œ ๊ตฌ์กฐ๋ฅผ ์žก๊ณ  ์‹ถ์—ˆ๊ณ , ๊ณ ๋ฏผ ๋์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ์„ค๊ณ„ํ–ˆ์Šต๋‹ˆ๋‹ค.

saas-helm-charts/
โ”œโ”€โ”€ .github/workflows/
โ”‚   โ””โ”€โ”€ update-tag.yaml
โ”œโ”€โ”€ argocd/
โ”‚   โ”œโ”€โ”€ applications/
โ”‚   โ”‚   โ”œโ”€โ”€ myorg-single-service.yaml
โ”‚   โ”‚   โ””โ”€โ”€ oss-mlflow.yaml
โ”‚   โ””โ”€โ”€ applicationsets/
โ”‚       โ”œโ”€โ”€ myorg-multi-service.yaml
โ”‚       โ””โ”€โ”€ oss-prometheus.yaml
โ”œโ”€โ”€ charts/
โ”‚   โ”œโ”€โ”€ myorg-single-service/
โ”‚   โ”œโ”€โ”€ myorg-multi-service/
โ”‚   โ”‚   โ”œโ”€โ”€ charts/
โ”‚   โ”‚   โ”œโ”€โ”€ templates/
โ”‚   โ”‚   โ”œโ”€โ”€ values/
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ prod-us.yaml
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ prod-ja.yaml
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ staging.yaml
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ nginx.yaml
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ azure-application-gateway.yaml
โ”‚   โ”‚   โ””โ”€โ”€ Chart.yaml
โ”‚   โ””โ”€โ”€ oss-prometheus/
โ”‚       โ”œโ”€โ”€ README.md
โ”‚       โ””โ”€โ”€ values/
โ”‚           โ”œโ”€โ”€ prod-us.yaml
โ”‚           โ”œโ”€โ”€ prod-ja.yaml
โ”‚           โ””โ”€โ”€ ...
โ””โ”€โ”€ scripts/
    โ”œโ”€โ”€ update-tag.sh
    โ””โ”€โ”€ ...

์šฐ์„  argocd ํด๋”๋ฅผ ๋‘๊ณ  Application๊ณผ ApplicationSet์„ ๊ด€๋ฆฌํ•˜๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.
์ด ๋ถ€๋ถ„๊นŒ์ง€ ๋ณ„๋„์˜ Repository๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ๋„ ๊ณ ๋ฏผํ–ˆ์ง€๋งŒ, ๊ทœ๋ชจ๊ฐ€ ์ปค์กŒ์„ ๋•Œ ๊ณ ๋ คํ•ด๋„ ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜์—ฌ ์ตœ์ดˆ 2๊ฐœ์˜ ํด๋”๋ฅผ ๋“ฑ๋กํ•˜๋ฉด, ๊ทธ ๋’ค๋กœ๋Š” ์•Œ์•„์„œ Git๊ณผ ๋™๊ธฐํ™”๋˜์–ด ๋ฐฐํฌ๊ฐ€ ์ด๋ฃจ์–ด์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

Helm chart ํด๋”์˜ ๊ฒฝ์šฐ, ํšŒ์‚ฌ ์ž์ฒด ์„œ๋น„์Šค๋Š” ํšŒ์‚ฌ ์ด๋ฆ„์„ Prefix๋กœ ๋ถ™์ด๊ณ , ์˜คํ”ˆ์†Œ์Šค์˜ ๊ฒฝ์šฐ oss- Prefix๋ฅผ ๋ถ™์˜€์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜์—ฌ ํด๋” ๊ตฌ์กฐ๊ฐ€ ๊ณผ๋„ํ•˜๊ฒŒ ๊นŠ์–ด์ง€๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ณ , ํšŒ์‚ฌ ์ž์ฒด ์„œ๋น„์Šค์™€ ์˜คํ”ˆ์†Œ์Šค ์„œ๋น„์Šค๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.

์˜คํ”ˆ์†Œ์Šค Helm chart์˜ ๊ฒฝ์šฐ ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ์ง์ ‘ ๊ด€๋ฆฌํ•˜๋„๋ก ํ•˜๊ณ , ํ•„์š”ํ•œ values ํŒŒ์ผ๊ณผ ๋ถˆ๊ฐ€ํ”ผํ•˜๊ฒŒ ์ถ”๊ฐ€ํ•  ๋งŒํ•œ ๋ฆฌ์†Œ์Šค๋งŒ ๊ด€๋ฆฌํ•˜๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  README๋ฅผ ๋‘์–ด ์–ด๋–ค ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ–ˆ๋Š”์ง€, ์–ด๋–ค ์„ค์ •์„ ํ–ˆ๋Š”์ง€ ๋“ฑ์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ •๋ฆฌํ•ด ๋‘์—ˆ์Šต๋‹ˆ๋‹ค.

Helm Chart ํ‘œ์ค€ํ™”

๊ธฐ์กด์— ์ž„์‹œ๋กœ ์‚ฌ์šฉํ•˜๋˜ Helm chart๋“ค์€ ๊ด€๋ฆฌ๊ฐ€ ์ž˜ ๋˜์ง€ ์•Š๊ณ  ์žˆ์—ˆ๊ณ , ๊ฐ ์„œ๋น„์Šค๋งˆ๋‹ค ์„œ๋กœ ๋‹ค๋ฅธ ํฌ๋งท์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ํฌ๋งท๋„ ๋‹น์‹œ ์ œ์ž‘์ž๊ฐ€ ์ž„์˜๋กœ ์ •์˜ํ•œ ๋ถ€๋ถ„์ด ๋งŽ์•„ ์ด ๊ฐ’์ด ์–ด๋””์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”์ง€๋Š” ํ…œํ”Œ๋ฆฟ์„ ๋œฏ์–ด๋ณด์ง€ ์•Š์œผ๋ฉด ์•Œ ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.
์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด helm create ๋ช…๋ น์–ด๋กœ ์ƒ์„ฑ๋˜๋Š” ๊ธฐ๋ณธ ํ…œํ”Œ๋ฆฟ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ‘œ์ค€ํ™” ์ž‘์—…์„ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

helm create myorg-service-template

์ด๋ ‡๊ฒŒ ๋งŒ๋“ค์–ด์ง„ ๊ธฐ๋ณธ ํ…œํ”Œ๋ฆฟ์„ ๋ฐ”ํƒ•์œผ๋กœ ์ตœ์†Œํ•œ์˜ ์ˆ˜์ •๋งŒ ๊ฐ€ํ•˜์—ฌ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ํ™•๋ณดํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฃผ๋กœ ์ถ”๊ฐ€ํ•œ ์š”์†Œ๋Š” deployment ๋ธ”๋ก๊ณผ Azure Application Gateway ์—ฐ๋™์„ ์œ„ํ•œ AzureApplicationGatewayRewrite ๋ฆฌ์†Œ์Šค ๊ด€๋ จ ์„ค์ • ์ •๋„์˜€๊ณ , ๊ทธ ์™ธ์—๋Š” ์ถ”๊ฐ€์ ์ธ ํ…œํ”Œ๋ฆฟ ํŒŒ์ผ์ด ํ•„์š”ํ•˜๋ฉด ๊ทธ์— ๋Œ€ํ•œ ๋ธ”๋ก์„ ์ •์˜ํ•˜๋Š” ์‹์œผ๋กœ ํ™•์žฅํ•ด ํŒ€ ๋‚ด์—์„œ ๋ฌด๋ฆฌ ์—†์ด ์ด์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.
์ด ์™ธ์˜ ์„ค์ •, ํŠนํžˆ ์„ค๋ช… ์—†์ด๋Š” ์•Œ์•„๋ณผ ์ˆ˜ ์—†๋Š” ์„ค์ •์„ ์ตœ๋Œ€ํ•œ ํ”ผํ•˜๋ ค ๋…ธ๋ ฅํ–ˆ๊ณ , ๋‹น์žฅ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํ…œํ”Œ๋ฆฟ๋„ ์ถ”ํ›„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค๋ฉด ์‚ญ์ œ๋ฅผ ์ง€์–‘ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ…œํ”Œ๋ฆฟ์„ ๋งŒ๋“  ๋’ค์—๋Š” ์ƒˆ๋กœ์šด ์„œ๋น„์Šค๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ์—๋„ ๊ธฐ์กด ํ…œํ”Œ๋ฆฟ์„ ๋ณต์‚ฌํ•˜๊ณ  ์•ฝ๊ฐ„ ์ˆ˜์ •ํ•˜๋Š” ์ •๋„๋กœ ์ถฉ๋ถ„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, SaaS ํ™˜๊ฒฝ์ด ์•„๋‹Œ ๊ณณ์—์„œ Helm chart๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋„ ์ฐธ๊ณ ํ•  ์ˆ˜ ์žˆ๋Š” ์ž๋ฃŒ๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ApplicationSet ํ™œ์šฉํ•˜๊ธฐ

์—ฌ๋Ÿฌ ํ™˜๊ฒฝ์˜ ๋ฐฐํฌ, ๋˜๋Š” ์—ฌ๋Ÿฌ ํด๋Ÿฌ์Šคํ„ฐ์— ๋ฐฐํฌํ•˜๋Š” ๊ฒฝ์šฐ Argo CD์˜ ApplicationSet์„ ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.
ํŠนํžˆ ํ•„์š”ํ•œ ๊ฒฝ์šฐ 2๊ฐœ ์ด์ƒ์˜ values ํŒŒ์ผ์„ ์กฐํ•ฉํ•˜๊ณ , Multi-source ๋ฐฉ์‹์„ ์ ๊ทน ํ™œ์šฉํ•˜์—ฌ ์œ ์—ฐํ•œ ๋ฐฐํฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋„๋ก ์„ค๊ณ„ํ–ˆ์Šต๋‹ˆ๋‹ค.

apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: myorg-service-applicationset
spec:
  goTemplate: true
  goTemplateOptions: ["missingkey=error"]
  # ...
  generators:
    - list:
        elements:
          - name: prod-us
            project: prod-us
            cluster: myorg-prd-eks
            namespace: myorg-prod-us
            valuesFile: prod-us.yaml
            ingressClass: nginx
            branch: main
            envFile: path/to/env/file
  template:
    metadata:
      name: "myorg-{{ .name }}"
    spec:
      project: "{{ .project }}"
      destination:
        name: "{{ .cluster }}"
        namespace: "{{ .namespace }}"
      sources:
        - repoURL: https://github.com/myorg/helm-charts
          targetRevision: "{{ .branch }}"
          path: charts/myorg-service
          helm:
            releaseName: "{{ .name }}"
            valueFiles:
              - "values/{{ .valuesFile }}"
              - "values/{{ .ingressClass }}.yaml"
            fileParameters:
              - name: envFile
                path: "$env/{{ .envFile }}"
        - repoURL: https://github.com/myorg/other-repo
          targetRevision: master
          ref: env
      syncPolicy:
        # ...

์œ„๋Š” ์˜ˆ์‹œ ApplicationSet ์„ค์ •์ž…๋‹ˆ๋‹ค.

valueFiles์˜ ๊ฒฝ์šฐ ์„œ๋น„์Šค ๋ฐฐํฌ ํ˜•ํƒœ๋ฅผ ์ƒ๊ฐํ–ˆ์„ ๋•Œ ๋‹ค์Œ 2๊ฐ€์ง€ ์š”์†Œ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

  1. ํ™˜๊ฒฝ ํŠนํ™” ์„ค์ • (prod-us.yaml, prod-ja.yaml, staging.yaml ๋“ฑ)
  2. ๋„คํŠธ์›Œํฌ ํŠนํ™” ์„ค์ • (nginx.yaml, azure-application-gateway.yaml ๋“ฑ)

๊ทธ๋ ‡๋‹ค๋ฉด ์ด ๊ฐ๊ฐ์˜ ์„ค์ •์„ ๋”ฐ๋กœ ์ •์˜ํ•˜๊ณ , ์กฐํ•ฉํ•˜์—ฌ ๋ฐฐํฌํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

fileParameters์˜ ๊ฒฝ์šฐ1, ์™ธ๋ถ€ Repository์˜ ํŒŒ์ผ์„ ์ฐธ์กฐํ•˜์—ฌ ConfigMap์ด๋‚˜ ๋‹ค๋ฅธ ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

์„œ๋น„์Šค ์ „ํ™˜ํ•˜๊ธฐ

๋ชจ๋“  ์„œ๋น„์Šค๋ฅผ ํ•œ ๋ฒˆ์— ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ์€ ์œ„ํ—˜์„ฑ์ด ๋†’๊ธฐ ๋•Œ๋ฌธ์—, ์ ์ง„์  ์ „ํ™˜์„ ํ†ตํ•ด ํŠธ๋ž˜ํ”ฝ์„ ์ „ํ™˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์—์„œ Route 53์˜ ๊ฐ€์ค‘์น˜ ๊ธฐ๋ฐ˜ ๋ผ์šฐํŒ…2์„ ํ†ตํ•ด ํŠธ๋ž˜ํ”ฝ์„ ๋ถ„์‚ฐํ•˜๋Š” ๋ฐฉ์‹์„ ์ฑ„ํƒํ•˜๊ฑฐ๋‚˜, nginx.conf ํŒŒ์ผ ๋“ฑ ๋„คํŠธ์›Œํฌ ์„ค์ •์ด ๋”ฐ๋กœ ์žˆ๋‹ค๋ฉด ํ•ด๋‹น ํŒŒ์ผ์—์„œ ์ง์ ‘ ๋น„์œจ์„ ์กฐ์ ˆํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๋„คํŠธ์›Œํฌ์™€ ๊ด€๋ จ์ด ์—†๋Š” Worker ์ข…๋ฅ˜์˜ ์„œ๋น„์Šค๋Š” K8s ํ™˜๊ฒฝ์— ๋ฐฐํฌํ•œ ๋’ค, ์ •์ƒ ๋™์ž‘์ด ํ™•์ธ๋˜๋ฉด Docker Compose ์ž์›์„ ์‚ญ์ œํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ „ํ™˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋งˆ์น˜๋ฉฐ

์ด๋Ÿฌํ•œ ๊ณผ์ •์„ ๊ฑฐ์ณ, ์ด๋ฒˆ ๋‹ฌ ์ฃผ์š” ์„œ๋น„์Šค์˜ ํŠธ๋ž˜ํ”ฝ์ด Kubernetes ํ™˜๊ฒฝ์œผ๋กœ ์ „ํ™˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค ๐ŸŽ‰๐ŸŽ‰๐ŸŽ‰

์˜ฌํ•ด ํŒ€ ๋‚ด ํฐ ๋ชฉํ‘œ์ด๊ธฐ๋„ ํ–ˆ๊ณ , ํŠนํžˆ ๊ธฐ์กด Docker Compose ํ™˜๊ฒฝ์ด ๋งŽ์ด ๋…ธํ›„ํ™”๋˜์–ด ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๋Š” ๊ฒฝ์šฐ๋„ ๋งŽ์•˜๋Š”๋ฐ ์ด์ œ ์–ด๋А ์ •๋„ ์œ ์—ฐ์„ฑ๊ณผ ์•ˆ์ •์„ฑ์ด ์ƒ๊ธฐ์ง€ ์•Š์„๊นŒ ์‹ถ์Šต๋‹ˆ๋‹ค.

1์ฐจ ๋ชฉํ‘œ๋Š” ๋‹ฌ์„ฑํ–ˆ์ง€๋งŒ, ์•„์ง ํ•ด์•ผ ํ•  ์ผ๋“ค์ด ๋งŽ์ด ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๊ฐ€ ์ „ํ™˜๋œ ๊ฒƒ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋‚จ์€ ๊ฒƒ๋“ค์„ ์ •๋ฆฌํ•ด ๋‚˜๊ฐ€์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • Blue/Green ๋ฐฐํฌ, ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ Auto-scaling ๋“ฑ ๋” ๋‚˜์€ ๋ฐฐํฌ ๋ฐฉ์‹์„ ์ ์šฉํ•ด ๋‚˜๊ฐ€์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ๋„ ๊ตฌ์ถ•ํ•ด ๋‚˜๊ฐ€๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ๋Š” Datadog๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ํšŒ์‚ฌ ์ฐจ์›์—์„œ ์ด๋ฅผ Grafana์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ๋กœ ๋Œ€์ฒดํ•ด ๋‚˜๊ฐ€๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜๋„ ์ œ๊ฐ€ ์ฒ˜์Œ ๋“ค์–ด์™”์„ ๋•Œ ๋ชฉํ‘œ๋กœ ํ–ˆ๋˜ ์ผ์˜ ํ•œ ๋‹จ๋ฝ์ด ๋งˆ๋ฌด๋ฆฌ๋œ ๊ฒƒ ๊ฐ™์•„ ๋ฟŒ๋“ฏํ•˜๋„ค์š”.
์ด์ œ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์œ„ํ•ด ๋˜ ์—ด์‹ฌํžˆ ํ•ด ๋‚˜๊ฐ€๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

Footnotes

  1. Helm โ€”set-file Support โ†ฉ

  2. Weighted Routing โ†ฉ