• Aiden's Lab แ„‚แ…ฒแ„‰แ…ณแ„…แ…ฆแ„แ…ฅ
  • Posts
  • ๐Ÿ”ญแ„แ…ณแ†ฏแ„…แ…กแ„‹แ…ฎแ„ƒแ…ณ แ„‚แ…ฆแ„‹แ…ตแ„แ…ตแ„‡แ…ณ แ„แ…ฎแ†ฏแ„‹แ…ณแ†ฏ แ„‹แ…ตแ†จแ„’แ…ตแ„€แ…ฉ แ„‰แ…ตแ‡แ„ƒแ…กแ„†แ…งแ†ซ minikubeแ„…แ…ฉ! - minikube แ„’แ…ชแ†ซแ„€แ…งแ†ผแ„‹แ…ฆแ„‰แ…ฅ แ„„แ…กแ„…แ…กแ„’แ…ขแ„‡แ…ฉแ„‚แ…ณแ†ซ Kustomize แ„‰แ…ตแ†ฏแ„‰แ…ณแ†ธ

๐Ÿ”ญแ„แ…ณแ†ฏแ„…แ…กแ„‹แ…ฎแ„ƒแ…ณ แ„‚แ…ฆแ„‹แ…ตแ„แ…ตแ„‡แ…ณ แ„แ…ฎแ†ฏแ„‹แ…ณแ†ฏ แ„‹แ…ตแ†จแ„’แ…ตแ„€แ…ฉ แ„‰แ…ตแ‡แ„ƒแ…กแ„†แ…งแ†ซ minikubeแ„…แ…ฉ! - minikube แ„’แ…ชแ†ซแ„€แ…งแ†ผแ„‹แ…ฆแ„‰แ…ฅ แ„„แ…กแ„…แ…กแ„’แ…ขแ„‡แ…ฉแ„‚แ…ณแ†ซ Kustomize แ„‰แ…ตแ†ฏแ„‰แ…ณแ†ธ

แ„แ…ณแ†ฏแ„…แ…กแ„‹แ…ฎแ„ƒแ…ณ แ„‚แ…ฆแ„‹แ…ตแ„แ…ตแ„‡แ…ณ แ„แ…ฎแ†ฏ Kustomizeแ„…แ…ณแ†ฏ minikube แ„’แ…ชแ†ซแ„€แ…งแ†ผแ„‹แ…ฆแ„‰แ…ฅ แ„‹แ…ตแ†จแ„’แ…ตแ†ฏ แ„‰แ…ฎ แ„‹แ…ตแ†ปแ„‚แ…ณแ†ซ แ„€แ…กแ„‹แ…ตแ„ƒแ…ณแ„…แ…ณแ†ฏ แ„Œแ…ฆแ„€แ…ฉแ†ผแ„’แ…กแ†ธแ„‚แ…ตแ„ƒแ…ก.

์•ˆ๋…•ํ•˜์„ธ์š”, Aidenโ€™s Lab ๋‰ด์Šค๋ ˆํ„ฐ์ž…๋‹ˆ๋‹ค.

์ง€๋‚œ ๊ธ€์—์„œ ์šฐ๋ฆฌ๋Š” ๋กœ์ปฌ minikube ํด๋Ÿฌ์Šคํ„ฐ ์œ„์—์„œ Kubernetes Ingress๋ฅผ ์ง์ ‘ ์ ์šฉํ•˜๊ณ  ๊ธฐ๋ณธ์ ์ธ ํŠธ๋ž˜ํ”ฝ ๋ผ์šฐํŒ…๋„ ๊ฒฝํ—˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฒˆ์—๋Š” Kubernetes ๋ฆฌ์†Œ์Šค๊ฐ€ ์•„๋‹Œ ํด๋ผ์šฐ๋“œ ๋„ค์ดํ‹ฐ๋ธŒ ํˆด์„ minikube ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์‚ฌ์šฉํ•ด๋ณผ ๊ฑด๋ฐ์š”. ํŠนํžˆ Kustomize๋ฅผ ํ™œ์šฉํ•œ ๊ฐ„๋‹จํ•œ Kubernetes ์„ค์ • ๊ด€๋ฆฌ๋ฅผ ๋‹ค๋ค„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด๋ฒˆ ๊ฐ€์ด๋“œ๋ฅผ ํ†ตํ•ด ์—ฌ๋Ÿฌ๋ถ„์€

  • Kustomize๊ฐ€ ๋ฌด์—‡์ด๊ณ ,

  • ์–ด๋–ป๊ฒŒ Kubernetes ๋ฐฐํฌ ์„ค์ •์„ ์ฒด๊ณ„์ ์ด๊ณ  ์‰ฝ๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•ด

minikube ํ™˜๊ฒฝ์—์„œ ๊ฒฝํ—˜ํ•˜์‹ค ์ˆ˜ ์žˆ์„ ๊ฒ๋‹ˆ๋‹ค.

์–ด๋ ต์ง€ ์•Š๊ฒŒ ๋”ฐ๋ผํ•˜์‹ค ์ˆ˜ ์žˆ๋„๋ก ์ตœ๋Œ€ํ•œ ์ง๊ด€์ ์ธ ๊ตฌ์„ฑ์œผ๋กœ ์ค€๋น„ํ•œ ๊ฐ€์ด๋“œ์ด๋‹ˆ, Kustomize์— ๋Œ€ํ•ด ๊ถ๊ธˆํ–ˆ๊ฑฐ๋‚˜ Kubernetes ๋ฐฐํฌ ์„ค์ • ๊ด€๋ฆฌ์— ๋Œ€ํ•ด ๊ด€์‹ฌ ์žˆ๋‹ค๋ฉด ๊ผญ ํ™œ์šฉํ•ด๋ณด์„ธ์š”!

โœจKustomize๋ž€?

Kustomize๋Š” Kubernetes ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ค์ •์„ ํ…œํ”Œ๋ฆฟ ์—†์ด YAML ํŒŒ์ผ ๊ทธ๋Œ€๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ํˆด์ž…๋‹ˆ๋‹ค.

๋ณต์žกํ•œ ํ…œํ”Œ๋ฆฟ ์–ธ์–ด๋ฅผ ๋ณ„๋„๋กœ ๋ฐฐ์šธ ํ•„์š” ์—†์ด, ๋ฆฌ์†Œ์Šค ๋ฐฐํฌ๋ฅผ ์œ„ํ•œ ๊ธฐ์กด YAML ํŒŒ์ผ๋“ค์€ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋ฉด์„œ ํ™˜๊ฒฝ๋ณ„๋กœ ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ์ˆ˜์ •ํ•˜๋Š” ๋ฐฉ์‹์ธ๋ฐ์š”.

๋˜ํ•œ kubectl(1.14 ๋ฒ„์ „ ์ด์ƒ)์— ๋‚ด์žฅ๋˜์–ด ์žˆ์–ด ๋ณ„๋„ ์„ค์น˜ ์—†์ด๋„ ๋ฐ”๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— Kustomize๋Š” ์ ‘๊ทผ์„ฑ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

Kustomize๋ฅผ ํ™œ์šฉํ•˜๋ ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด Base ์„ค์ •๊ณผ Overlays ์„ค์ •, ๊ทธ๋ฆฌ๊ณ  kustomization.yaml์ด๋ž€ ๋ช…์„ธ ํŒŒ์ผ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  • Base ์„ค์ •: Kubernetes ๋ฆฌ์†Œ์Šค๋ฅผ ๋ฐฐํฌํ•˜๋Š” ๊ธฐ๋ณธ YAML ํŒŒ์ผ๋“ค(์˜ˆ: Deployment, Service)

  • Overlay ์„ค์ •: Base ์„ค์ • ์ค‘ ํ™˜๊ฒฝ๋ณ„๋กœ ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•  ์‚ฌํ•ญ์„ ์ •์˜ํ•œ ํŒŒ์ผ๋“ค์„ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ๊ตฌ๋ถ„(์˜ˆ: dev, staging, prod)

  • kustomization.yaml:

    • Kustomize๊ฐ€ ์ฐธ์กฐํ•  ๋ฆฌ์†Œ์Šค ๋ชฉ๋ก, ์ด๋ฏธ์ง€ ์ •๋ณด ๋“ฑ์„ ์ •์˜

    • Base ์„ค์ •์ด ํฌํ•จ๋œ ๋””๋ ‰ํ† ๋ฆฌ์™€ Overlay ์„ค์ •์ด ํฌํ•จ๋œ ๋””๋ ‰ํ† ๋ฆฌ ๋ชจ๋‘์— ํ•„์š”

Kustomize๋ฅผ ๋„์ž…ํ•˜๋ฉด Kubernetes ๋ฆฌ์†Œ์Šค๋ฅผ ๋ฐฐํฌํ•˜๋Š” ๊ธฐ์กด YAML ํŒŒ์ผ๋“ค์€ Base ์„ค์ •์—์„œ ํ•œ ๋ฒˆ๋งŒ ์ •์˜ํ•˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ ์ค‘๋ณต์„ ํ”ผํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์ข‹์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ๊ฐ ํ™˜๊ฒฝ๋ณ„๋กœ ํ•„์š”ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ๋งŒ ๋ณ„๋„๋กœ ๋ช…์‹œํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ™˜๊ฒฝ ๊ฐ„์˜ ์ฐจ์ด์ ์„ ์‰ฝ๊ฒŒ ํŒŒ์•…ํ•˜๊ณ  ์ถ”์ ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฐ ํŠน์ง•์€ GitOps ์›Œํฌํ”Œ๋กœ์šฐ์™€๋„ ์ž˜ ์–ด์šธ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์—, ์„ ์–ธ์  ๋ฐฉ์‹์œผ๋กœ Kubernetes ๋ฆฌ์†Œ์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ์— ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ–ฅ๏ธKustomize๋กœ Nginx ์•ฑ ๋ฐฐํฌ ์„ค์ • ๊ด€๋ฆฌํ•˜๊ธฐ

๊ทธ๋Ÿผ ์ด์ œ๋ถ€ํ„ฐ ์ง์ ‘ Kustomize๋ฅผ ์‚ฌ์šฉํ•ด์„œ Kubernetes ๋ฐฐํฌ ์„ค์ •์„ ๊ด€๋ฆฌํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์‹ค์Šต์€ ์ €ํฌ๊ฐ€ ๊ทธ๋™์•ˆ ์‚ฌ์šฉํ–ˆ๋˜ minikube ํด๋Ÿฌ์Šคํ„ฐ ์œ„์—์„œ ์ง„ํ–‰ํ•  ์˜ˆ์ •์ธ๋ฐ์š”.

  1. Base ์„ค์ •์œผ๋กœ ๊ธฐ๋ณธ Nginx ์•ฑ์„ ๋จผ์ € ์ •์˜ํ•˜๊ณ ,

  2. Nginx ์•ฑ์˜ replica ์ˆ˜๋ฅผ ํ™˜๊ฒฝ๋ณ„(dev, prod)๋กœ ๋‹ค๋ฅด๊ฒŒ ๋ช…์‹œํ•œ ๋‹ค์Œ,

  3. kubectl์˜ Kustomize ๋ช…๋ น์–ด๋กœ Nginx ์•ฑ์„ dev ๋˜๋Š” prod ํ™˜๊ฒฝ์— ๋งž์ถฐ ๋ณ€๊ฒฝํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

1๏ธโƒฃBase ์„ค์ • ๋ช…์‹œ๋ฅผ ์œ„ํ•œ YAML ํŒŒ์ผ ์ƒ์„ฑ

๋ฐฉ๊ธˆ ์‚ดํŽด๋ณธ ๊ฒƒ์ฒ˜๋Ÿผ, ๋ชจ๋“  ํ™˜๊ฒฝ์—์„œ ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉ๋  Base ์„ค์ •๋“ค์„ ๋จผ์ € ๋งŒ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ €๋Š” ๋ณธ ์‹ค์Šต์„ ์œ„ํ•ด kustoimize-test ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋จผ์ € ์ƒ์„ฑํ–ˆ๋Š”๋ฐ์š”.

๊ทธ ์•ˆ์— base ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•ด์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ์„ค์ • ํŒŒ์ผ๋“ค์„ ์ž‘์„ฑํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

base/ 
โ”œโ”€โ”€ nginx-deployment.yaml # Nginx์˜ Deployment์™€ Service ์ •์˜
โ””โ”€โ”€ kustomization.yaml

Nginx Deployment ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์ „์—, ํ„ฐ๋ฏธ๋„์—์„œ ์•„๋ž˜ ๋ช…๋ น์–ด๋กœ ํ…Œ์ŠคํŠธ์šฉ Namespace๋ฅผ ๋จผ์ € ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

kubectl create ns kustomize-test

์ด๋ ‡๊ฒŒ ์‹ค์Šต์ด๋‚˜ ํ…Œ์ŠคํŠธํ•  ๋• ๋ณ„๋„์˜ Namespace๋ฅผ ๋งŒ๋“  ๋‹ค์Œ ๊ทธ ์•ˆ์—์„œ ์ง„ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋‹ค์‹œ Nginx ์•ฑ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋กœ ๋Œ์•„์™€์„œ, base/nginx-deployment.yaml์—๋Š” Nginx Pod 2๊ฐœ๋ฅผ ์‹คํ–‰ํ•˜๋Š” Deployment์™€ ClusterIP ํƒ€์ž…์˜ Service๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

# base/nginx-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-app
  namespace: kustomize-test # ํ…Œ์ŠคํŠธ์šฉ Namespace ์ง€์ •
  labels:
    app: nginx
spec:
  replicas: 2 # ๊ธฐ๋ณธ replica ์ˆ˜
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80

---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  namespace: kustomize-test
spec:
  type: ClusterIP
  selector:
    app: nginx 
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

๊ทธ๋ฆฌ๊ณ  base/kustomization.yaml ํŒŒ์ผ์˜ ๋‚ด์šฉ์€ ์•„๋ž˜์™€ ๊ฐ™์ด Nginx ๋ฐฐํฌ๋ฅผ ์œ„ํ•œ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ํฌํ•จํ•˜๋„๋ก ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

# base/kustomization.yaml

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - nginx-deployment.yaml

๊ทธ๋Ÿผ ์•„๋ž˜์™€ ๊ฐ™์€ ๊ตฌ์กฐ์˜ base ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ๋งŒ๋“ค์–ด์ง€๊ฒ ์ฃ .

์ด๋ ‡๊ฒŒ base ๋””๋ ‰ํ† ๋ฆฌ ์•ˆ์— ์ƒ์„ฑํ•œ ์„ค์ •๋“ค์€ ๊ฐ ํ™˜๊ฒฝ์—์„œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ ์šฉํ•  ๋•Œ์˜ ๊ธฐ์ค€์ด ๋˜๋Š” ๊ฒ๋‹ˆ๋‹ค.

2๏ธโƒฃOverlay ์„ค์ •์„ ์œ„ํ•œ YAML ํŒŒ์ผ ์ƒ์„ฑ

Nginx ์•ฑ ๋ฐฐํฌ๋ฅผ ์œ„ํ•œ Base ์„ค์ •์„ ๋งˆ์ณค์œผ๋‹ˆ, ์ด์ œ ๊ฐ๊ธฐ ๋‹ค๋ฅธ ํ™˜๊ฒฝ์—์„œ ์ด Nginx ์•ฑ์„ ์–ด๋–ป๊ฒŒ ๋ณ€๊ฒฝํ• ์ง€ ๋จผ์ € ์ •์˜ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

base์—์„œ ์ •์˜ํ•œ Nginx Deployment์˜ Replica ์ˆ˜(๊ธฐ๋ณธ 2๊ฐœ)๋ฅผ ๊ฐœ๋ฐœ(dev) ํ™˜๊ฒฝ์—์„œ๋Š” 1๋กœ, ํ”„๋กœ๋•์…˜(prod) ํ™˜๊ฒฝ์—์„œ๋Š” 4๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ด…์‹œ๋‹ค.

  • dev: Nginx์˜ Deployment์˜ Replica ์ˆ˜๋ฅผ 1๋กœ ์ˆ˜์ •

  • prod: Nginx์˜ Deployment์˜ Replica ์ˆ˜๋ฅผ 4๋กœ ์ˆ˜์ •

๋จผ์ € ๊ฐ ํ™˜๊ฒฝ์„ ์œ„ํ•œ Overlay ์„ค์ •์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด, kustomize-test ๋””๋ ‰ํ† ๋ฆฌ๋กœ ๋‹ค์‹œ ๋Œ์•„์˜จ ๋‹ค์Œ, overlays ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ƒˆ๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

overlays ๋””๋ ‰ํ† ๋ฆฌ ์•ˆ์— dev ๋””๋ ‰ํ† ๋ฆฌ์™€ prod ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด ๋””๋ ‰ํ† ๋ฆฌ ์•ˆ์— ๊ฐ ํ™˜๊ฒฝ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ •์˜ํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ธ๋ฐ์š”.

์ง€๊ธˆ๊นŒ์ง€์˜ kustomize-test ๋””๋ ‰ํ† ๋ฆฌ์˜ ๊ตฌ์กฐ๋Š” ์•„๋ž˜์™€ ๊ฐ™๊ฒ ์ฃ ?

์ด์ œ dev ํ™˜๊ฒฝ์—์„œ Nginx ์•ฑ์˜ Replica ์ˆ˜๋ฅผ 1๋กœ ์ค„์ด๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ YAML ํŒŒ์ผ๋กœ ์ •์˜ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์ด YAML ํŒŒ์ผ ์ด๋ฆ„์„ replicas-patch.yaml๋กœ ์ง€์ •ํ• ๊ฒŒ์š”.

replicas-patch.yaml ํŒŒ์ผ์—๋Š” base์—์„œ ์ •์˜ํ•œ Deployment์—์„œ spec.replicas ๊ฐ’์„ 1๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๋‚ด์šฉ์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

replicas-patch.yaml์˜ metadata.name ํ•„๋“œ์™€ metadata.namespace ํ•„๋“œ์˜ ๊ฐ’์€ base์˜ Deployment์—์„œ ์ •์˜ํ•œ ๊ฐ’๊ณผ ์ผ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

# overlays/dev/replicas-patch.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-app # base์— ์ •์˜๋œ Deployment ์ด๋ฆ„
  namespace: kustomize-test # ํ…Œ์ŠคํŠธ์šฉ Namespace ์ง€์ •
spec:
  replicas: 1 # dev ํ™˜๊ฒฝ์—์„œ ํ•„์š”ํ•œ Replica ์ˆ˜ ์ง€์ •

๊ทธ ๋‹ค์Œ, ๋™์ผํ•œ ๊ฒฝ๋กœ์— kustomization.yaml ํŒŒ์ผ์„ ์•„๋ž˜์™€ ๊ฐ™์ด ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

# overlays/dev/kustomization.yaml

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - ../../base # base ๋””๋ ‰ํ† ๋ฆฌ์˜ ๊ฒฝ๋กœ
patches:
  - path: replicas-patch.yaml

์—ฌ๊ธฐ์„œ patches๋ž€, base์—์„œ ์ •์˜ํ•œ ๋ฆฌ์†Œ์Šค YAML ํŒŒ์ผ์˜ ํŠน์ • ๋ถ€๋ถ„๋งŒ ์„ ํƒ์ ์œผ๋กœ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์ถ”๊ฐ€ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํ•„๋“œ์ž…๋‹ˆ๋‹ค.

๋ณธ ์‹ค์Šต์—์„œ๋Š” base/deployment.yaml ํŒŒ์ผ ๋‚ด์šฉ ์ค‘ Replica ์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋‚ด์šฉ๋งŒ ๋‹ด๊ธด replicas-patch.yaml๋กœ ๋ฆฌ์†Œ์Šค ํŒจ์น˜๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

prod ๋””๋ ‰ํ† ๋ฆฌ ์•ˆ์—๋„ ์•„๋ž˜์™€ ๊ฐ™์ด replicas-patch.yaml์™€ kustomization.yaml ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

# overlays/prod/replicas-patch.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-app # base์— ์ •์˜๋œ Deployment ์ด๋ฆ„
  namespace: kustomize-test # ํ…Œ์ŠคํŠธ์šฉ Namespace ์ง€์ •
spec:
  replicas: 4 # prod ํ™˜๊ฒฝ์—์„œ ํ•„์š”ํ•œ Replica ์ˆ˜ ์ง€์ •
# overlays/prod/kustomization.yaml

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - ../../base # base ๋””๋ ‰ํ† ๋ฆฌ์˜ ๊ฒฝ๋กœ
patches:
  - path: replicas-patch.yaml

๊ทธ๋Ÿผ ์•„๋ž˜์™€ ๊ฐ™์ด Overlay ์„ค์ • ํŒŒ์ผ๋“ค๋„ ๋ชจ๋‘ ์ค€๋น„๊ฐ€ ๋˜์—ˆ๋Š”๋ฐ์š”.

์ด์ œ kubectl ๋ช…๋ น์–ด๋กœ ๊ฐ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ Nginx Deployment๋ฅผ ๋ฐฐํฌํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

3๏ธโƒฃ๊ฐ ํ™˜๊ฒฝ๋ณ„ Nginx ์•ฑ ๋ฐฐํฌํ•˜๊ธฐ

๋จผ์ € base ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ์ •์˜ํ–ˆ๋˜ ๊ธฐ๋ณธ ๋งค๋‹ˆํŽ˜์ŠคํŠธ ํŒŒ์ผ๋กœ Nginx ์•ฑ์„ ๋ฐฐํฌํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ ๊ฒฝ๋กœ์˜ ํ„ฐ๋ฏธ๋„์—์„œ ์•„๋ž˜ ๋ช…๋ น์–ด๋กœ Nginx Deployemnt์™€ Service๋ฅผ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค.

kubectl apply -f base/nginx-deployment.yaml

๊ทธ๋Ÿผ ์œ„ ์ด๋ฏธ์ง€์—์„œ ๋ณด์ด๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, base ๋””๋ ‰ํ† ๋ฆฌ ๋‚ด ๋งค๋‹ˆํŽ˜์ŠคํŠธ์—์„œ ์ •์˜ํ–ˆ๋˜ Deployment(Replica 2๊ฐœ)์™€ Service๊ฐ€ ๋ฐฐํฌ๋œ ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์ƒํƒœ์—์„œ dev ํ™˜๊ฒฝ์˜ Overlay ์„ค์ •์„ ์ ์šฉํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Kustomize๋กœ ์ •์˜๋œ ํŠน์ • ํ™˜๊ฒฝ์˜ ์„ค์ •์„ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ์— ๋ฐฐํฌํ•˜๋ ค๋ฉด, ํ„ฐ๋ฏธ๋„์—์„œ ํ•ด๋‹นํ•˜๋Š” Overlay ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋Œ€์ƒ์œผ๋กœ kubectl apply -k {overlay ๋””๋ ‰ํ† ๋ฆฌ ๊ฒฝ๋กœ} ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ์š”.

์šฐ๋ฆฌ๋Š” dev ํ™˜๊ฒฝ์˜ Overlay ์„ค์ •์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ž˜์™€ ๊ฐ™์€ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

kubectl apply -k overlays/dev

๋ฐฉ๊ธˆ ์ „ ์ •์˜ํ•œ dev ํ™˜๊ฒฝ์˜ ์„ค์ •์ด ์ œ๋Œ€๋กœ ์ ์šฉ๋˜์—ˆ๋‹ค๋ฉด Deployment์˜ Replica ์ˆ˜๊ฐ€ 1๊ฐœ๋กœ ๊ฐ์†Œํ•ด์•ผ ํ•˜๋Š”๋ฐ์š”. ์‹ค์ œ๋กœ ์ค„์–ด๋“ค์—ˆ์„๊นŒ์š”?

dev ํ™˜๊ฒฝ์—์„œ์˜ Nginx ์•ฑ ๋ฐฐํฌ ์„ค์ •์ด ์ œ๋Œ€๋กœ ์ ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!

kubectl -n kustomize-test describe deployment nginx-app ๋ช…๋ น์–ด๋กœ Deployment์˜ Event๋ฅผ ์‚ดํŽด๋ณด๋ฉด Replica ์ˆ˜๊ฐ€ 2์—์„œ 1๋กœ ์ค„์—ˆ๋‹ค๊ณ  ๋‚˜์˜ค๋„ค์š”.

์ด์ œ prod ํ™˜๊ฒฝ์˜ ์„ค์ •์„ ์ ์šฉํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ์„ค์ •์€ Nginx Deployment์˜ Replica ์ˆ˜๊ฐ€ 4๊ฐœ๋กœ ์ง€์ •๋˜์–ด ์žˆ๋Š”๋ฐ์š”. ์‹ค์ œ๋กœ ๋ฐ˜์˜๋˜๋Š”์ง€ ํ™•์ธํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์•„๊นŒ dev ํ™˜๊ฒฝ ์ ์šฉ ๋•Œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ kubectl apply -k {overlay ๋””๋ ‰ํ† ๋ฆฌ ๊ฒฝ๋กœ} ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋˜๋Š”๋ฐ์š”. ์ด๋ฒˆ์—” ์•„๋ž˜์™€ ๊ฐ™์ด prod ๋””๋ ‰ํ† ๋ฆฌ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•˜๋ฉด ๋˜๊ฒ ์ฃ ?

kubectl apply -k overlays/prod

์œ„ ๋ช…๋ น์–ด๋ฅผ ํ„ฐ๋ฏธ๋„์— ์‹คํ–‰ํ•˜๋ฉด...

์šฐ๋ฆฌ๊ฐ€ ๊ธฐ๋Œ€ํ–ˆ๋˜ ๋Œ€๋กœ Nginx Deployment์˜ Pod ์ˆ˜๊ฐ€ 4๊ฐœ๋กœ ๋Š˜์–ด๋‚˜๋ฉด์„œ ์ฐจ๊ทผ์ฐจ๊ทผ ์ผœ์ง€๊ณ  ์žˆ๋„ค์š”!

Nginx Deployment์˜ Event ํ˜„ํ™ฉ์„ kubectl describe ๋ช…๋ น์–ด๋กœ ์‚ดํŽด๋ณด๋ฉด, ์•„๋ž˜์ฒ˜๋Ÿผ Replica ์ˆ˜๊ฐ€ 1์—์„œ 4๋กœ ๋Š˜์–ด๋‚ฌ๋‹ค๊ณ  ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค!๐ŸŽ‰

์ง€๊ธˆ๊นŒ์ง€ ์‚ดํŽด๋ณธ ๊ฒƒ์ฒ˜๋Ÿผ Kustomize๋ฅผ ํ™œ์šฉํ•˜๋ฉด Kubernetes ํด๋Ÿฌ์Šคํ„ฐ์— ๋ฐฐํฌ๋œ ๋ฆฌ์†Œ์Šค๋ฅผ ์›ํ•˜๋Š” ํ™˜๊ฒฝ๋ณ„๋กœ ๋‹ค๋ฅด๊ฒŒ ์—…๋ฐ์ดํŠธํ•˜๋ฉด์„œ ์ƒํ™ฉ์— ๋”ฐ๋ฅธ ์œ ๋™์ ์ธ ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋ณธ ๊ฐ€์ด๋“œ์—์„  Kustomize์— ๋Œ€ํ•ด ๋น ๋ฅด๊ฒŒ ๊ฐ์„ ์žก๊ณ  ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก Replica ์ˆ˜์™€ ๊ฐ™์ด ๊ฐ„๋‹จํ•œ ์„ค์ •๋งŒ ๋‹ค๋ค˜๋Š”๋ฐ์š”.

์‹ค์ œ๋กœ ConfigMap์ด๋‚˜ Secret๊ณผ ๊ฐ™์€ Kubernetes ๋ฆฌ์†Œ์Šค๋„ Kustomize๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ, Kubernetes๋ฅผ ์šด์˜ ์ค‘์ด๊ฑฐ๋‚˜ ํ•™์Šตํ•˜๊ณ  ์žˆ๋‹ค๋ฉด Kustomize์— ๋Œ€ํ•ด ์งš๊ณ  ๋„˜์–ด๊ฐ€์‹œ๋Š” ๊ฑธ ์ถ”์ฒœ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

๐Ÿ”ญ๋งˆ๋ฌด๋ฆฌ

์ด๋ฒˆ ์•„ํ‹ฐํด์—์„œ๋Š” Kustomize๋ฅผ ์ด์šฉํ•ด์„œ ํ™˜๊ฒฝ๋ณ„๋กœ ์•ฑ์„ ๋‹ค๋ฅด๊ฒŒ ๋ฐฐํฌํ•ด๋ณด๋Š” ์‹ค์Šต์„ minikube ํด๋Ÿฌ์Šคํ„ฐ ์œ„์—์„œ ์ง„ํ–‰ํ•ด๋ดค์Šต๋‹ˆ๋‹ค.

์ด 3ํšŒ์— ๊ฑธ์ณ์„œ minikube ์„ค์น˜๋ถ€ํ„ฐ Kubernetes ์‹ค์Šต๊ณผ Cloud Native ํˆด ์‹ค์Šต๊นŒ์ง€ ๋‹ค๋ค„๋ดค๋Š”๋ฐ์š”.

Kubernetes๊ฐ€ ์ด๋ฏธ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š” ๋งŒํผ ์ค‘์š”ํ•˜๋‹ค๋ณด๋‹ˆ, ์—ฌ๋Ÿฌ๋ถ„๋“ค์ด minikube๋กœ Kubernetes๋ฅผ ๊ณต๋ถ€ํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ๋ฅผ ์ œ๊ณตํ•ด๋“œ๋ฆฌ๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

minikube ์‹ค์Šต ๊ฐ€์ด๋“œ ์‹œ๋ฆฌ์ฆˆ๋Š” ์—ฌ๊ธฐ์„œ ๋งˆ์น˜๋ ค๊ณ  ํ•˜๋Š”๋ฐ์š”. ํ˜น์‹œ minikube๋‚˜ Kubernetes, Cloud Native์™€ ๊ด€๋ จํ•ด์„œ ๊ถ๊ธˆํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ค˜์œผ๋ฉด ํ•˜๋Š” ์ฃผ์ œ๊ฐ€ ์žˆ๋‹ค๋ฉด ์–ธ์ œ๋“  ์•Œ๋ ค์ฃผ์„ธ์š”.

๊ทธ๋Ÿฌ๋ฉด ๋‹ค์Œ ์•„ํ‹ฐํด์—์„œ ์ƒˆ๋กœ์šด ์ฃผ์ œ๋กœ ์ฐพ์•„๋ต™๊ฒ ์Šต๋‹ˆ๋‹ค.

์˜ค๋Š˜๋„ ์ฝ์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

โœจ์ด๋ฒˆ ๋‰ด์Šค๋ ˆํ„ฐ๋Š” ์–ด๋– ์…จ๋‚˜์š”?

์ด๋ฒˆ ๊ธ€์—์„œ ๋‹ค๋ฃฌ ์ฃผ์ œ์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜๋Š”์ง€ ์•Œ๋ ค์ฃผ์„ธ์š”! ๋‰ด์Šค๋ ˆํ„ฐ๋ฅผ ๋” ๋‚˜์€ ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ์•„๋ž˜ ํผ์—์„œ ์งง์€ ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›๊ณ  ์žˆ์–ด์š”.

๐Ÿ‘‰ ํ”ผ๋“œ๋ฐฑ ๋ณด๋‚ด๊ธฐ (1~2๋ถ„ ์†Œ์š”)

์—ฌ๋Ÿฌ๋ถ„๋“ค์˜ ์†Œ์ค‘ํ•œ ์˜๊ฒฌ์€ Aidenโ€™s Lab ๋‰ด์Šค๋ ˆํ„ฐ์—๊ฒŒ ํฐ ํž˜์ด ๋ฉ๋‹ˆ๋‹ค!

๐Ÿ”ญAidenโ€™s Lab์—์„œ ๋” ๋งŽ์€ ์•„ํ‹ฐํด์„ ๋งŒ๋‚˜๋ณด์„ธ์š”

๋ฐœํ–‰๋œ ๋‰ด์Šค๋ ˆํ„ฐ๋ฅผ ์•„์นด์ด๋น™ํ•˜๊ณ  ๋‹ค์–‘ํ•œ ์ •๋ณด๋ฅผ ๊ณต์œ ํ•˜๋Š” ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ๋ฅผ ์šด์˜ ์ค‘์ž…๋‹ˆ๋‹ค.