1 - ๊ตฌ์„ฑ ํŒŒ์ผ์„ ์ด์šฉํ•œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜ค๋ธŒ์ ํŠธ์˜ ์„ ์–ธํ˜• ๊ด€๋ฆฌ

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜ค๋ธŒ์ ํŠธ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์˜ค๋ธŒ์ ํŠธ ๊ตฌ์„ฑ ํŒŒ์ผ์„ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์ €์žฅํ•˜๊ณ  ํ•„์š”์— ๋”ฐ๋ผ kubectl apply๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์žฌ๊ท€์ ์œผ๋กœ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์—…๋ฐ์ดํŠธํ•จ์œผ๋กœ์จ ์ƒ์„ฑ, ์—…๋ฐ์ดํŠธ ๋ฐ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๋ฐฉ์‹์€ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋˜๋Œ๋ ค ์˜ค๋ธŒ์ ํŠธ ๊ตฌ์„ฑ ํŒŒ์ผ์— ๋ณ‘ํ•ฉํ•˜์ง€ ์•Š๊ณ  ํ™œ์„ฑ ์˜ค๋ธŒ์ ํŠธ์— ๊ฐ€ํ•ด์ง„ ๊ธฐ๋ก์„ ์œ ์ง€ํ•œ๋‹ค. kubectl diff๋Š” ๋˜ํ•œ apply๊ฐ€ ์–ด๋– ํ•œ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์ด๋ฃจ์–ด์งˆ์ง€์— ๋Œ€ํ•œ ํ”„๋ฆฌ๋ทฐ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

์‹œ์ž‘ํ•˜๊ธฐ ์ „์—

kubectl๋ฅผ ์„ค์น˜ํ•œ๋‹ค.

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ํ•„์š”ํ•˜๊ณ , kubectl ์ปค๋งจ๋“œ-๋ผ์ธ ํˆด์ด ํด๋Ÿฌ์Šคํ„ฐ์™€ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์ด ํŠœํ† ๋ฆฌ์–ผ์€ ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ํ˜ธ์ŠคํŠธ๊ฐ€ ์•„๋‹Œ ๋…ธ๋“œ๊ฐ€ ์ ์–ด๋„ 2๊ฐœ ํฌํ•จ๋œ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•œ๋‹ค. ๋งŒ์•ฝ, ์•„์ง ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๋‹ค๋ฉด, minikube๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ๋‹ค์Œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํ”Œ๋ ˆ์ด๊ทธ๋ผ์šด๋“œ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฒ„์ „ ํ™•์ธ์„ ์œ„ํ•ด์„œ, ๋‹ค์Œ ์ปค๋งจ๋“œ๋ฅผ ์‹คํ–‰ kubectl version.

ํŠธ๋ ˆ์ด๋“œ ์˜คํ”„

kubectl ํˆด์€ ์„ธ ๊ฐ€์ง€ ๋ฐฉ์‹์˜ ์˜ค๋ธŒ์ ํŠธ ๊ด€๋ฆฌ๋ฅผ ์ง€์›ํ•œ๋‹ค.

  • ๋ช…๋ นํ˜• ์ปค๋งจ๋“œ
  • ๋ช…๋ นํ˜• ์˜ค๋ธŒ์ ํŠธ ๊ตฌ์„ฑ
  • ์„ ์–ธํ˜• ์˜ค๋ธŒ์ ํŠธ ๊ตฌ์„ฑ

์˜ค๋ธŒ์ ํŠธ ๊ด€๋ฆฌ ๋ฐฉ์‹์˜ ์ข…๋ฅ˜๋ณ„ ์žฅ๋‹จ์ ์— ๋Œ€ํ•œ ๋…ผ์˜๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜ค๋ธŒ์ ํŠธ ๊ด€๋ฆฌ๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.

๊ฐœ์š”

์„ ์–ธํ˜• ์˜ค๋ธŒ์ ํŠธ ๊ตฌ์„ฑ์€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜ค๋ธŒ์ ํŠธ ์ •์˜์™€ ๊ตฌ์„ฑ์— ๋Œ€ํ•œ ํ™•์‹คํ•œ ์ดํ•ด๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ์•„์ง ๊ทธ๋ ‡์ง€ ๋ชปํ•˜๋‹ค๋ฉด, ๋จผ์ € ๋‹ค์Œ ๋ฌธ์„œ๋ฅผ ์ฝ๊ณ  ์ดํ•ดํ•œ๋‹ค.

๋‹ค์Œ์€ ์ด ๋ฌธ์„œ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์šฉ์–ด์— ๋Œ€ํ•œ ์ •์˜์ด๋‹ค.

  • ์˜ค๋ธŒ์ ํŠธ ๊ตฌ์„ฑ ํŒŒ์ผ / ๊ตฌ์„ฑ ํŒŒ์ผ: ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•œ ๊ตฌ์„ฑ์„ ์ •์˜ํ•˜๋Š” ํ•˜๋‚˜์˜ ํŒŒ์ผ. ์ด ์ฃผ์ œ๋Š” ์–ด๋–ป๊ฒŒ kubectl apply์— ๊ตฌ์„ฑ ํŒŒ์ผ์„ ์ „๋‹ฌํ•˜๋Š”์ง€์— ๋Œ€ํ•ด ๋ณด์—ฌ์ค€๋‹ค. ๊ตฌ์„ฑ ํŒŒ์ผ์€ ์ผ๋ฐ˜์ ์œผ๋กœ Git๊ณผ ๊ฐ™์€, ์†Œ์Šค ์ปจํŠธ๋กค์— ์ €์žฅ๋œ๋‹ค.
  • ํ™œ์„ฑ ์˜ค๋ธŒ์ ํŠธ ๊ตฌ์„ฑ / ํ™œ์„ฑ ๊ตฌ์„ฑ: ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ์— ์˜ํ•ด ๊ด€์ธก๋œ ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•œ ํ™œ์„ฑ ๊ตฌ์„ฑ ๊ฐ’. ์ด๊ฒƒ๋“ค์€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ ์ €์žฅ์†Œ์— ์œ ์ง€๋œ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ etcd๊ฐ€ ์‚ฌ์šฉ๋œ๋‹ค.
  • ์„ ์–ธํ˜• ๊ตฌ์„ฑ ์ž‘์„ฑ์ž / ์„ ์–ธํ˜• ์ž‘์„ฑ์ž: ํ™œ์„ฑ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์—…๋ฐ์ดํŠธํ•ด ์ฃผ๋Š” ์‚ฌ๋žŒ์ด๋‚˜ ์†Œํ”„ํŠธ์›จ์–ด. ์ด ์ฃผ์ œ์—์„œ ์–ธ๊ธ‰ํ•˜๋Š” ํ™œ์„ฑ ์ž‘์„ฑ์ž๋Š” ์˜ค๋ธŒ์ ํŠธ ๊ตฌ์„ฑ ํŒŒ์ผ์— ๋ณ€๊ฒฝ์„ ๊ฐ€ํ•˜๊ณ  kubectl apply๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๊ธฐ๋กํ•œ๋‹ค.

์˜ค๋ธŒ์ ํŠธ ์ƒ์„ฑ ๋ฐฉ๋ฒ•

๊ธฐ์กด์— ์กด์žฌํ•˜๋Š” ๊ฒƒ์„ ์ œ์™ธํ•œ, ์ง€์ •ํ•œ ๋””๋ ‰ํ„ฐ๋ฆฌ ๋‚ด ๊ตฌ์„ฑ ํŒŒ์ผ์— ์˜ํ•ด ์ •์˜๋œ ๋ชจ๋“  ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด kubectl apply๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

kubectl apply -f <๋””๋ ‰ํ„ฐ๋ฆฌ>/

์ด๊ฒƒ์€ ๊ฐ ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•ด kubectl.kubernetes.io/last-applied-configuration: '{...}' ์–ด๋…ธํ…Œ์ด์…˜์„ ์„ค์ •ํ•œ๋‹ค. ํ•ด๋‹น ์–ด๋…ธํ…Œ์ด์…˜์€ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ–ˆ๋˜ ์˜ค๋ธŒ์ ํŠธ ๊ตฌ์„ฑ ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ํฌํ•จํ•œ๋‹ค. 

๋‹ค์Œ์€ ์˜ค๋ธŒ์ ํŠธ ๊ตฌ์„ฑ ํŒŒ์ผ์— ๋Œ€ํ•œ ์˜ˆ์‹œ์ด๋‹ค.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  minReadySeconds: 5
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

์ƒ์„ฑ๋  ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ถœ๋ ฅํ•˜๋ ค๋ฉด kubectl diff๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. 

kubectl diff -f https://k8s.io/examples/application/simple_deployment.yaml

kubectl apply๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

kubectl apply -f https://k8s.io/examples/application/simple_deployment.yaml

kubectl get์„ ์‚ฌ์šฉํ•˜์—ฌ ํ™œ์„ฑ ๊ตฌ์„ฑ์„ ์ถœ๋ ฅํ•œ๋‹ค.

kubectl get -f https://k8s.io/examples/application/simple_deployment.yaml -o yaml

์ถœ๋ ฅ์€ kubectl.kubernetes.io/last-applied-configuration ์–ด๋…ธํ…Œ์ด์…˜์ด ํ™œ์„ฑ ๊ตฌ์„ฑ์— ๊ธฐ๋ก๋œ ๊ฒƒ์„ ๋ณด์—ฌ์ฃผ๋ฉฐ, ๊ทธ๊ฒƒ์€ ๊ตฌ์„ฑ ํŒŒ์ผ๊ณผ ์ผ์น˜ํ•œ๋‹ค.

kind: Deployment
metadata:
  annotations:
    # ...
    # This is the json representation of simple_deployment.yaml
    # It was written by kubectl apply when the object was created
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"apps/v1","kind":"Deployment",
      "metadata":{"annotations":{},"name":"nginx-deployment","namespace":"default"},
      "spec":{"minReadySeconds":5,"selector":{"matchLabels":{"app":nginx}},"template":{"metadata":{"labels":{"app":"nginx"}},
      "spec":{"containers":[{"image":"nginx:1.14.2","name":"nginx",
      "ports":[{"containerPort":80}]}]}}}}      
  # ...
spec:
  # ...
  minReadySeconds: 5
  selector:
    matchLabels:
      # ...
      app: nginx
  template:
    metadata:
      # ...
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:1.14.2
        # ...
        name: nginx
        ports:
        - containerPort: 80
        # ...
      # ...
    # ...
  # ...

์˜ค๋ธŒ์ ํŠธ ์—…๋ฐ์ดํŠธ ๋ฐฉ๋ฒ•

๋˜ํ•œ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๊ธฐ์กด์— ์กด์žฌํ•˜๋”๋ผ๋„ ๋””๋ ‰ํ„ฐ๋ฆฌ ๋‚ด ์ •์˜๋œ ๋ชจ๋“  ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ์œ„ํ•ด kubectl apply๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ ‘๊ทผ๋ฐฉ์‹์€ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

  1. ํ™œ์„ฑ ๊ตฌ์„ฑ ๋‚ด ๊ตฌ์„ฑ ํŒŒ์ผ์— ๋‚˜ํƒ€๋‚˜๋Š” ํ•„๋“œ ์„ค์ •
  2. ํ™œ์„ฑ ๊ตฌ์„ฑ ๋‚ด ๊ตฌ์„ฑ ํŒŒ์ผ๋กœ๋ถ€ํ„ฐ ์ œ๊ฑฐ๋œ ํ•„๋“œ ์ •๋ฆฌ
kubectl diff -f <๋””๋ ‰ํ„ฐ๋ฆฌ>/
kubectl apply -f <๋””๋ ‰ํ„ฐ๋ฆฌ>/

๋‹ค์Œ์€ ๊ตฌ์„ฑ ํŒŒ์ผ์˜ ์˜ˆ์‹œ์ด๋‹ค.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  minReadySeconds: 5
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

kubectl apply๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

kubectl apply -f https://k8s.io/examples/application/simple_deployment.yaml

kubectl get์„ ์‚ฌ์šฉํ•˜์—ฌ ํ™œ์„ฑ ๊ตฌ์„ฑ์„ ์ถœ๋ ฅํ•œ๋‹ค.

kubectl get -f https://k8s.io/examples/application/simple_deployment.yaml -o yaml

์ถœ๋ ฅ์€ kubectl.kubernetes.io/last-applied-configuration ์–ด๋…ธํ…Œ์ด์…˜์ด ํ™œ์„ฑ ๊ตฌ์„ฑ์— ๊ธฐ๋ก๋œ ๊ฒƒ์„ ๋ณด์—ฌ์ฃผ๋ฉฐ, ๊ทธ๊ฒƒ์€ ๊ตฌ์„ฑ ํŒŒ์ผ๊ณผ ์ผ์น˜ํ•œ๋‹ค.

kind: Deployment
metadata:
  annotations:
    # ...
    # This is the json representation of simple_deployment.yaml
    # It was written by kubectl apply when the object was created
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"apps/v1","kind":"Deployment",
      "metadata":{"annotations":{},"name":"nginx-deployment","namespace":"default"},
      "spec":{"minReadySeconds":5,"selector":{"matchLabels":{"app":nginx}},"template":{"metadata":{"labels":{"app":"nginx"}},
      "spec":{"containers":[{"image":"nginx:1.14.2","name":"nginx",
      "ports":[{"containerPort":80}]}]}}}}      
  # ...
spec:
  # ...
  minReadySeconds: 5
  selector:
    matchLabels:
      # ...
      app: nginx
  template:
    metadata:
      # ...
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:1.14.2
        # ...
        name: nginx
        ports:
        - containerPort: 80
        # ...
      # ...
    # ...
  # ...

kubectl scale์„ ์‚ฌ์šฉํ•˜์—ฌ ํ™œ์„ฑ ๊ตฌ์„ฑ ๋‚ด replicas ํ•„๋“œ๋ฅผ ์ง์ ‘ ์—…๋ฐ์ดํŠธํ•œ๋‹ค. ์ด๋Š” kubectl apply๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

kubectl scale deployment/nginx-deployment --replicas=2

kubectl get์„ ์‚ฌ์šฉํ•˜์—ฌ ํ™œ์„ฑ ๊ตฌ์„ฑ์„ ์ถœ๋ ฅํ•œ๋‹ค.

kubectl get deployment nginx-deployment -o yaml

์ถœ๋ ฅ์€ replicas ํ•„๋“œ๊ฐ€ 2๋กœ ์„ค์ •๋œ ๊ฒƒ์„ ๋ณด์—ฌ์ฃผ๋ฉฐ, last-applied-configuration ์–ด๋…ธํ…Œ์ด์…˜์€ replicas ํ•„๋“œ๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค.

apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    # ...
    # note that the annotation does not contain replicas
    # because it was not updated through apply
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"apps/v1","kind":"Deployment",
      "metadata":{"annotations":{},"name":"nginx-deployment","namespace":"default"},
      "spec":{"minReadySeconds":5,"selector":{"matchLabels":{"app":nginx}},"template":{"metadata":{"labels":{"app":"nginx"}},
      "spec":{"containers":[{"image":"nginx:1.14.2","name":"nginx",
      "ports":[{"containerPort":80}]}]}}}}      
  # ...
spec:
  replicas: 2 # written by scale
  # ...
  minReadySeconds: 5
  selector:
    matchLabels:
      # ...
      app: nginx
  template:
    metadata:
      # ...
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:1.14.2
        # ...
        name: nginx
        ports:
        - containerPort: 80
      # ...

nginx:1.14.2์—์„œ nginx:1.16.1๋กœ ์ด๋ฏธ์ง€๋ฅผ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด simple_deployment.yaml ๊ตฌ์„ฑ ํŒŒ์ผ์„ ์—…๋ฐ์ดํŠธ ํ•˜๊ณ , minReadySeconds ํ•„๋“œ๋ฅผ ์‚ญ์ œํ•œ๋‹ค.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.16.1 # update the image
        ports:
        - containerPort: 80

๊ตฌ์„ฑ ํŒŒ์ผ์— ์ด๋ฃจ์–ด์ง„ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์ ์šฉํ•œ๋‹ค.

kubectl diff -f https://k8s.io/examples/application/update_deployment.yaml
kubectl apply -f https://k8s.io/examples/application/update_deployment.yaml

kubectl get์„ ์‚ฌ์šฉํ•˜์—ฌ ํ™œ์„ฑ ๊ตฌ์„ฑ์„ ์ถœ๋ ฅํ•œ๋‹ค.

kubectl get -f https://k8s.io/examples/application/update_deployment.yaml -o yaml

์ถœ๋ ฅ์€ ํ™œ์„ฑ ๊ตฌ์„ฑ์— ๋‹ค์Œ์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋ณด์—ฌ์ค€๋‹ค.

  • replicas ํ•„๋“œ๋Š” kubectl scale์— ์˜ํ•ด ์„ค์ •๋œ ๊ฐ’ 2๋ฅผ ์œ ์ง€ํ•œ๋‹ค.
    ์ด๋Š” ๊ตฌ์„ฑ ํŒŒ์ผ์—์„œ ์ƒ๋žต๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ•˜๋‹ค.
  • image ํ•„๋“œ๋Š” nginx:1.14.2์—์„œ nginx:1.16.1๋กœ ์—…๋ฐ์ดํŠธ๋˜์—ˆ๋‹ค.
  • last-applied-configuration ์–ด๋…ธํ…Œ์ด์…˜์€ ์ƒˆ๋กœ์šด ์ด๋ฏธ์ง€๋กœ ์—…๋ฐ์ดํŠธ๋˜์—ˆ๋‹ค.
  • minReadySeconds ํ•„๋“œ๋Š” ์ง€์›Œ์กŒ๋‹ค.
  • last-applied-configuration ์–ด๋…ธํ…Œ์ด์…˜์€ ๋” ์ด์ƒ minReadySeconds ํ•„๋“œ๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค.
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    # ...
    # The annotation contains the updated image to nginx 1.11.9,
    # but does not contain the updated replicas to 2
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"apps/v1","kind":"Deployment",
      "metadata":{"annotations":{},"name":"nginx-deployment","namespace":"default"},
      "spec":{"selector":{"matchLabels":{"app":nginx}},"template":{"metadata":{"labels":{"app":"nginx"}},
      "spec":{"containers":[{"image":"nginx:1.16.1","name":"nginx",
      "ports":[{"containerPort":80}]}]}}}}      
    # ...
spec:
  replicas: 2 # Set by `kubectl scale`.  Ignored by `kubectl apply`.
  # minReadySeconds cleared by `kubectl apply`
  # ...
  selector:
    matchLabels:
      # ...
      app: nginx
  template:
    metadata:
      # ...
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:1.16.1 # Set by `kubectl apply`
        # ...
        name: nginx
        ports:
        - containerPort: 80
        # ...
      # ...
    # ...
  # ...

์˜ค๋ธŒ์ ํŠธ ์‚ญ์ œ ๋ฐฉ๋ฒ•

kubectl apply์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜๋Š” ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ญ์ œํ•˜๋Š”๋ฐ 2๊ฐ€์ง€ ์ ‘๊ทผ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

๊ถŒ์žฅ ๋ฐฉ๋ฒ•: kubectl delete -f <ํŒŒ์ผ๋ช…>

๋ช…๋ นํ˜• ์ปค๋งจ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋˜๋Š” ๋ฐฉ์‹์ธ๋ฐ, ๋ฌด์—‡์ด ์‚ญ์ œ๋˜๋Š”์ง€์— ๋Œ€ํ•ด ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ๋‚˜ํƒ€๋‚ด๋ฏ€๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ์˜๋„ํ•˜์ง€ ์•Š๊ฒŒ ๋ฌด์–ธ๊ฐ€๋ฅผ ์‚ญ์ œํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์ž‘์•„์ง€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

kubectl delete -f <ํŒŒ์ผ๋ช…>

๋Œ€์•ˆ: kubectl apply -f <๋””๋ ‰ํ„ฐ๋ฆฌ/> --prune -l your=๋ ˆ์ด๋ธ”

๋ฌด์—‡์„ ํ•˜๋Š”์ง€ ํŒŒ์•…ํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

kubectl delete์— ๋Œ€ํ•œ ๋Œ€์•ˆ์œผ๋กœ, ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ๋ถ€ํ„ฐ ๊ตฌ์„ฑ ํŒŒ์ผ์ด ์‚ญ์ œ๋œ ํ›„์— ์‚ญ์ œ๋  ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด kubectl apply๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. --prune์„ ์‚ฌ์šฉํ•˜์—ฌ ์ ์šฉํ•˜๋ฉด ์ผ๋ จ์˜ ๋ ˆ์ด๋ธ”์˜ ์ง‘ํ•ฉ๊ณผ ์ผ์น˜ํ•˜๋Š” ๋ชจ๋“  ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•ดAPI ์„œ๋ฒ„์— ์ฟผ๋ฆฌํ•˜๊ณ , ๋ฐ˜ํ™˜๋œ ํ™œ์„ฑ ์˜ค๋ธŒ์ ํŠธ ๊ตฌ์„ฑ์„ ์˜ค๋ธŒ์ ํŠธ ๊ตฌ์„ฑ ํŒŒ์ผ์— ์ผ์น˜์‹œํ‚ค๋ ค๊ณ  ์‹œ๋„ํ•œ๋‹ค. ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์ฟผ๋ฆฌ์— ์ผ์น˜ํ•˜๊ณ , ํ•ด๋‹น ๋””๋ ‰ํ„ฐ๋ฆฌ ๋‚ด ๊ตฌ์„ฑ ํŒŒ์ผ์ด ์—†๊ณ  last-applied-configuration์–ด๋…ธํ…Œ์ด์…˜์ด ์žˆ๋Š” ๊ฒฝ์šฐ, ์‚ญ์ œ๋œ๋‹ค.

kubectl apply -f <๋””๋ ‰ํ„ฐ๋ฆฌ/> --prune -l <๋ ˆ์ด๋ธ”>

์˜ค๋ธŒ์ ํŠธ ํ™•์ธ ๋ฐฉ๋ฒ•

ํ™œ์„ฑ ์˜ค๋ธŒ์ ํŠธ์˜ ๊ตฌ์„ฑ์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด -o yaml๊ณผ ํ•จ๊ป˜ kubectl get์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

kubectl get -f <ํŒŒ์ผ๋ช…|url> -o yaml

์–ด๋–ป๊ฒŒ apply๊ฐ€ ์ฐจ์ด๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ  ๋ณ€๊ฒฝ์„ ๋ณ‘ํ•ฉํ•˜๋Š”๊ฐ€

kubectl apply๊ฐ€ ํ•˜๋‚˜์˜ ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•œ ํ™œ์„ฑ ๊ตฌ์„ฑ์„ ์—…๋ฐ์ดํŠธํ•  ๋•Œ, API ์„œ๋ฒ„์— ํŒจ์น˜ ์š”์ฒญ์„ ๋ณด๋ƒ„์œผ๋กœ์จ ๊ทธ๊ฒƒ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. ๊ทธ ํŒจ์น˜๋Š” ํ™œ์„ฑ ์˜ค๋ธŒ์ ํŠธ ๊ตฌ์„ฑ์˜ ํŠน์ • ํ•„๋“œ์— ๋Œ€ํ•œ ๋ฒ”์œ„์˜ ์—…๋ฐ์ดํŠธ๋กœ ํ•œ์ •ํ•œ๋‹ค. kubectl apply ์ปค๋งจ๋“œ๋Š” ๊ตฌ์„ฑ ํŒŒ์ผ, ํ™œ์„ฑ ๊ตฌ์„ฑ, ๊ทธ๋ฆฌ๊ณ  ํ™œ์„ฑ ๊ตฌ์„ฑ์— ์ €์žฅ๋œ last-applied-configuration์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด ํŒจ์น˜ ์š”์ฒญ์„ ๊ณ„์‚ฐํ•œ๋‹ค.

ํŒจ์น˜ ๊ณ„์‚ฐ ๋ณ‘ํ•ฉ

kubectl apply ๋ช…๋ น์€ kubectl.kubernetes.io/last-applied-configuration ์–ด๋…ธํ…Œ์ด์…˜์— ๊ตฌ์„ฑ ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ๊ธฐ๋กํ•œ๋‹ค. ์ด๊ฒƒ์€ ๊ตฌ์„ฑ ํŒŒ์ผ๋กœ๋ถ€ํ„ฐ ์ œ๊ฑฐ๋˜์—ˆ๊ณ  ํ™œ์„ฑ ๊ตฌ์„ฑ์œผ๋กœ๋ถ€ํ„ฐ ์ง€์›Œ์งˆ ํ•„์š”๊ฐ€ ์žˆ๋Š” ํ•„๋“œ๋ฅผ ํ™•์ธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ๋‹ค์Œ์€ ์–ด๋–ค ํ•„๋“œ๊ฐ€ ์‚ญ์ œ ๋˜๋Š” ์„ค์ •๋ผ์•ผ ํ•˜๋Š”์ง€ ๊ณ„์‚ฐํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๋‹จ๊ณ„์ด๋‹ค.

  1. ์‚ญ์ œํ•  ํ•„๋“œ๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค. ์ด๊ฒƒ์€ last-applied-configuration ๋‚ด ์กด์žฌํ•˜๊ณ  ๊ตฌ์„ฑ ํŒŒ์ผ๋กœ๋ถ€ํ„ฐ ์œ ์‹ค๋œ ํ•„๋“œ์ด๋‹ค.
  2. ์ถ”๊ฐ€ ๋˜๋Š” ์„ค์ •๋˜์–ด์•ผ ํ•  ํ•„๋“œ๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค. ์ด๊ฒƒ์€ ํ™œ์„ฑ ๊ตฌ์„ฑ๊ณผ ๋ถˆ์ผ์น˜ํ•˜๋Š” ๊ฐ’์„ ๊ฐ€์ง€๋Š” ๊ตฌ์„ฑ ํŒŒ์ผ ๋‚ด ์กด์žฌํ•˜๋Š” ํ•„๋“œ์ด๋‹ค.

๋‹ค์Œ์€ ์˜ˆ์‹œ์ด๋‹ค. ๋””ํ”Œ๋กœ์ด๋จผํŠธ ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•œ ๊ตฌ์„ฑ ํŒŒ์ผ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•œ๋‹ค.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.16.1 # update the image
        ports:
        - containerPort: 80

๋˜ํ•œ, ์ด๊ฒƒ์€ ๋™์ผํ•œ ๋””ํ”Œ๋กœ์ด๋จผํŠธ ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•œ ํ™œ์„ฑ ๊ตฌ์„ฑ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•œ๋‹ค.

apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    # ...
    # note that the annotation does not contain replicas
    # because it was not updated through apply
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"apps/v1","kind":"Deployment",
      "metadata":{"annotations":{},"name":"nginx-deployment","namespace":"default"},
      "spec":{"minReadySeconds":5,"selector":{"matchLabels":{"app":nginx}},"template":{"metadata":{"labels":{"app":"nginx"}},
      "spec":{"containers":[{"image":"nginx:1.14.2","name":"nginx",
      "ports":[{"containerPort":80}]}]}}}}      
  # ...
spec:
  replicas: 2 # written by scale
  # ...
  minReadySeconds: 5
  selector:
    matchLabels:
      # ...
      app: nginx
  template:
    metadata:
      # ...
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:1.14.2
        # ...
        name: nginx
        ports:
        - containerPort: 80
      # ...

๋‹ค์Œ์€ kubectl apply์— ์˜ํ•ด ์ˆ˜ํ–‰๋  ๋ณ‘ํ•ฉ ๊ณ„์‚ฐ์ด๋‹ค.

  1. last-applied-configuration์œผ๋กœ๋ถ€ํ„ฐ ๊ฐ’์„ ์ฝ์–ด ๊ตฌ์„ฑ ํŒŒ์ผ์˜ ๊ฐ’๊ณผ ๋น„๊ตํ•˜์—ฌ ์‚ญ์ œํ•  ํ•„๋“œ๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค. last-applied-configuration์— ๋ณด์ด๋Š” ๊ฒƒ๊ณผ๋Š” ๋ฌด๊ด€ํ•˜๊ฒŒ ๋กœ์ปฌ์˜ ์˜ค๋ธŒ์ ํŠธ ๊ตฌ์„ฑ ํŒŒ์ผ ๋‚ด null์ด๋ผ๊ณ  ๋ช…์‹œ์ ์œผ๋กœ ์„ค์ •๋œ ํ•„๋“œ๋ฅผ ์ง€์šด๋‹ค. ์ด ์˜ˆ์‹œ์—์„œ, minReadySeconds์€ last-applied-configuration ์–ด๋…ธํ…Œ์ด์…˜ ๋‚ด ๋‚˜ํƒ€๋‚˜์ง€๋งŒ, ๊ตฌ์„ฑ ํŒŒ์ผ ๋‚ด์—๋Š” ๋ณด์—ฌ์ง€์ง€ ์•Š๋Š”๋‹ค. ์กฐ์น˜: ํ™œ์„ฑ ๊ตฌ์„ฑ์œผ๋กœ๋ถ€ํ„ฐ minReadySeconds์„ ์ง€์šด๋‹ค.
  2. ๊ตฌ์„ฑ ํŒŒ์ผ๋กœ๋ถ€ํ„ฐ ๊ฐ’์„ ์ฝ์–ด ํ™œ์„ฑ ๊ตฌ์„ฑ ๋‚ด ๊ฐ’๊ณผ ๋น„๊ตํ•˜์—ฌ ์„ค์ •ํ•  ํ•„๋“œ๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค. ์ด ์˜ˆ์‹œ์—์„œ, ๊ตฌ์„ฑ ํŒŒ์ผ ๋‚ด image ๊ฐ’์€ ํ™œ์„ฑ ๊ตฌ์„ฑ ๋‚ด ๊ฐ’๊ณผ ๋ถˆ์ผ์น˜ํ•œ๋‹ค. ์กฐ์น˜: ํ™œ์„ฑ ๊ตฌ์„ฑ ๋‚ด image ๊ฐ’์„ ์„ค์ •ํ•œ๋‹ค.
  3. ๊ตฌ์„ฑ ํŒŒ์ผ์˜ ๊ฐ’๊ณผ ์ผ์น˜์‹œํ‚ค๊ธฐ ์œ„ํ•ด last-applied-configuration ์–ด๋…ธํ…Œ์ด์…˜์„ ์„ค์ •ํ•œ๋‹ค.
  4. 1, 2, 3์œผ๋กœ๋ถ€ํ„ฐ์˜ ๊ฒฐ๊ณผ๋ฅผ API ์„œ๋ฒ„์— ๋‹จ์ผ ํŒจ์น˜ ์š”์ฒญ์œผ๋กœ ๋ณ‘ํ•ฉํ•œ๋‹ค.

๋‹ค์Œ์€ ๋ณ‘ํ•ฉ์˜ ๊ฒฐ๊ณผ์ธ ํ™œ์„ฑ ๊ตฌ์„ฑ์ด๋‹ค.

apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    # ...
    # The annotation contains the updated image to nginx 1.11.9,
    # but does not contain the updated replicas to 2
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"apps/v1","kind":"Deployment",
      "metadata":{"annotations":{},"name":"nginx-deployment","namespace":"default"},
      "spec":{"selector":{"matchLabels":{"app":nginx}},"template":{"metadata":{"labels":{"app":"nginx"}},
      "spec":{"containers":[{"image":"nginx:1.16.1","name":"nginx",
      "ports":[{"containerPort":80}]}]}}}}      
    # ...
spec:
  selector:
    matchLabels:
      # ...
      app: nginx
  replicas: 2 # Set by `kubectl scale`.  Ignored by `kubectl apply`.
  # minReadySeconds cleared by `kubectl apply`
  # ...
  template:
    metadata:
      # ...
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:1.16.1 # Set by `kubectl apply`
        # ...
        name: nginx
        ports:
        - containerPort: 80
        # ...
      # ...
    # ...
  # ...

์–ด๋–ป๊ฒŒ ์ƒ์ดํ•œ ํ•„๋“œ ํƒ€์ž…์ด ๋ณ‘ํ•ฉ๋˜๋Š”๊ฐ€

๊ตฌ์„ฑ ํŒŒ์ผ ๋‚ด ํŠน์ • ํ•„๋“œ๊ฐ€ ํ•„๋“œ์˜ ํƒ€์ž…์— ๋”ฐ๋ผ ์–ด๋–ป๊ฒŒ ํ™œ์„ฑ ๊ตฌ์„ฑ๊ณผ ํ•จ๊ป˜ ๋ณ‘ํ•ฉ๋˜๋Š”๊ฐ€. ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ํ•„๋“œ ํƒ€์ž…์ด ์žˆ๋‹ค.

  • ๊ธฐ๋ณธ(primitives): ๋ฌธ์ž์—ด, ์ˆซ์ž ๋˜๋Š” ๋ถˆ๋ฆฌ์–ธ ํƒ€์ž…์˜ ํ•„๋“œ. ์˜ˆ๋ฅผ ๋“ค์–ด, image์™€ replicas๋Š” ๊ธฐ๋ณธ ํ•„๋“œ๋‹ค. ์กฐ์น˜: ๊ต์ฒด.

  • ๋งต, ๋˜ํ•œ ์˜ค๋ธŒ์ ํŠธ ๋ผ ์นญํ•จ: ๋งต ํƒ€์ž… ๋˜๋Š” ์„œ๋ธŒํ•„๋“œ๋ฅผ ํฌํ•จํ•˜๋Š” ๋ณตํ•ฉ ํƒ€์ž…์˜ ํ•„๋“œ. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ ˆ์ด๋ธ”, ์–ด๋…ธํ…Œ์ด์…˜,์ŠคํŽ™ ๋ฐ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋Š” ๋ชจ๋‘ ๋งต์ด๋‹ค. ์กฐ์น˜: ๊ตฌ์„ฑ์š”์†Œ ๋˜๋Š” ์„œ๋ธŒํ•„๋“œ ๋ณ‘ํ•ฉ.

  • ๋ฆฌ์ŠคํŠธ: ๊ธฐ๋ณธํƒ€์ž… ๋˜๋Š” ๋งต์ด ๋  ์ˆ˜ ์žˆ๋Š” ์•„์ดํ…œ์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ํฌํ•จํ•˜๋Š” ํ•„๋“œ. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ปจํ…Œ์ด๋„ˆ, ํฌํŠธ, ๊ทธ๋ฆฌ๊ณ  args๋Š” ๋ฆฌ์ŠคํŠธ๋‹ค. ์กฐ์น˜: ๋‹ค์–‘ํ•จ.

kubectl apply๊ฐ€ ๋งต ๋˜๋Š” ๋ฆฌ์ŠคํŠธ ํ•„๋“œ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒฝ์šฐ, ์ผ๋ฐ˜์ ์œผ๋กœ ์ „์ฒด ํ•„๋“œ๋ฅผ ๊ต์ฒดํ•˜๋Š” ๋Œ€์‹ , ๊ฐœ๋ณ„ ๋ถ€ ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ์—…๋ฐ์ดํŠธํ•œ๋‹ค, ์˜ˆ๋ฅผ ๋“ค์–ด, ๋””ํ”Œ๋กœ์ด๋จผํŠธ์— ๋Œ€ํ•œ spec์„ ๋ณ‘ํ•ฉํ•  ๊ฒฝ์šฐ, ์ „์ฒด spec์ด ๊ต์ฒด๋˜์ง€ ์•Š๋Š”๋‹ค. ๋Œ€์‹  replicas์™€ ๊ฐ™์€ spec์˜ ์„œ๋ธŒํ•„๋“œ๊ฐ€ ๋น„๊ต๋˜๊ณ  ๋ณ‘ํ•ฉ๋œ๋‹ค.

๊ธฐ๋ณธ ํ•„๋“œ์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ์‚ฌํ•ญ ๋ณ‘ํ•ฉํ•˜๊ธฐ

๊ธฐ๋ณธ ํ•„๋“œ๋Š” ๊ต์ฒด๋˜๊ฑฐ๋‚˜ ์ง€์›Œ์ง„๋‹ค.

Field in object configuration fileField in live object configurationField in last-applied-configurationAction
YesYes-๊ตฌ์„ฑ ํŒŒ์ผ ๊ฐ’ ํ™œ์„ฑ์œผ๋กœ ์„ค์ •.
YesNo-ํ™œ์„ฑ์„ ๋กœ์ปฌ ๊ตฌ์„ฑ์œผ๋กœ ์„ค์ •.
No-Yesํ™œ์„ฑ ๊ตฌ์„ฑ์œผ๋กœ๋ถ€ํ„ฐ ์ง€์›€.
No-No์•„๋ฌด๊ฒƒ๋„ ์•ˆํ•จ. ํ™œ์„ฑ๊ฐ’ ์œ ์ง€.

๋งต ํ•„๋“œ์— ๋ณ€๊ฒฝ์‚ฌํ•ญ ๋ณ‘ํ•ฉํ•˜๊ธฐ

๋งต์„ ์š”์ฒญํ•˜๋Š” ํ•„๋“œ๋Š” ์„œ๋ธŒํ•„๋“œ์˜ ๊ฐ๊ฐ ๋˜๋Š” ๋งต์˜ ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ๋น„๊ตํ•จ์œผ๋กœ์จ ๋ณ‘ํ•ฉ๋œ๋‹ค.

Key in object configuration fileKey in live object configurationField in last-applied-configurationAction
YesYes-์„œ๋ธŒํ•„๋“œ ๊ฐ’ ๋น„๊ต.
YesNo-ํ™œ์„ฑ์„ ๋กœ์ปฌ ๊ตฌ์„ฑ์œผ๋กœ ์„ค์ •.
No-Yesํ™œ์„ฑ ๊ตฌ์„ฑ์œผ๋กœ๋ถ€ํ„ฐ ์‚ญ์ œ.
No-No์•„๋ฌด๊ฒƒ๋„ ์•ˆํ•จ. ํ™œ์„ฑ๊ฐ’ ์œ ์ง€.

ํƒ€์ž… ๋ฆฌ์ŠคํŠธ์˜ ํ•„๋“œ์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ์‚ฌํ•ญ ๋ณ‘ํ•ฉํ•˜๊ธฐ

๋ฆฌ์ŠคํŠธ์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋ณ‘ํ•ฉํ•˜๋Š” ๊ฒƒ์€ ์„ธ ๊ฐ€์ง€ ์ „๋žต ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

  • ๊ตฌ์„ฑ์š”์†Œ๊ฐ€ ๋ชจ๋‘ ๊ธฐ๋ณธํ˜•์ธ ๊ฒฝ์šฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ต์ฒดํ•œ๋‹ค.
  • ๋ณตํ•ฉ ๊ตฌ์„ฑ์š”์†Œ์˜ ๋ฆฌ์ŠคํŠธ์—์„œ ๊ฐœ๋ณ„ ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ๋ณ‘ํ•ฉํ•œ๋‹ค.
  • ๊ธฐ์ดˆ ๊ตฌ์„ฑ์š”์†Œ์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ณ‘ํ•ฉํ•œ๋‹ค.

์ „๋žต์— ๋Œ€ํ•œ ์„ ํƒ์€ ํ•„๋“œ๋ณ„๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค.

๊ตฌ์„ฑ์š”์†Œ๊ฐ€ ๋ชจ๋‘ ๊ธฐ๋ณธํ˜•์ธ ๊ฒฝ์šฐ ๋ฆฌ์ŠคํŠธ ๊ต์ฒด

๊ธฐ์ดˆ ํ•„๋“œ์™€ ๋™์ผํ•œ ๋ฆฌ์ŠคํŠธ๋กœ ์ทจ๊ธ‰ํ•œ๋‹ค. ์ „์ฒด ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ต์ฒด ๋˜๋Š” ์‚ญ์ œํ•œ๋‹ค. ์ด๊ฒƒ์€ ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•œ๋‹ค.

์˜ˆ์‹œ: ํŒŒ๋“œ ๋‚ด ์ปจํ…Œ์ด๋„ˆ์˜ args ํ•„๋“œ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ์œ„ํ•ด kubectl apply๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์ด๊ฒƒ์€ ํ™œ์„ฑ ๊ตฌ์„ฑ ๋‚ด args์˜ ๊ฐ’์„ ๊ตฌ์„ฑ ํŒŒ์ผ ๋‚ด ๊ฐ’์œผ๋กœ ์„ค์ •ํ•œ๋‹ค. ํ™œ์„ฑ ๊ตฌ์„ฑ์— ์ถ”๊ฐ€ํ–ˆ๋˜ ์ด์ „์˜ ๋ชจ๋“  args๊ตฌ์„ฑ์š”์†Œ๋“ค์€ ์œ ์‹ค๋œ๋‹ค. ๊ตฌ์„ฑ ํŒŒ์ผ ๋‚ด ์ •์˜ํ•œ args ๊ตฌ์„ฑ์š”์†Œ์˜ ์ˆœ์„œ๋Š” ํ™œ์„ฑ ๊ตฌ์„ฑ ๋‚ด ์œ ์ง€๋œ๋‹ค.

# last-applied-configuration value
    args: ["a", "b"]

# configuration file value
    args: ["a", "c"]

# live configuration
    args: ["a", "b", "d"]

# result after merge
    args: ["a", "c"]

์„ค๋ช…: ๋ณ‘ํ•ฉ์€ ์ƒˆ๋กœ์šด ๋ฆฌ์ŠคํŠธ ๊ฐ’์œผ๋กœ ๊ตฌ์„ฑ ํŒŒ์ผ ๊ฐ’์„ ์‚ฌ์šฉํ–ˆ๋‹ค.

๋ณตํ•ฉ ๊ตฌ์„ฑ์š”์†Œ ๋ฆฌ์ŠคํŠธ์— ๋Œ€ํ•œ ๊ฐœ๋ณ„ ๊ตฌ์„ฑ์š”์†Œ ๋ณ‘ํ•ฉ

๋ฆฌ์ŠคํŠธ๋ฅผ ๋งต์œผ๋กœ ์ทจ๊ธ‰ํ•˜๊ณ  ๊ฐ ๊ตฌ์„ฑ์š”์†Œ์˜ ํŠน์ • ํ•„๋“œ๋ฅผ ํ‚ค๋กœ ์ทจ๊ธ‰ํ•œ๋‹ค. ๊ฐœ๋ณ„ ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ์ถ”๊ฐ€, ์‚ญ์ œ, ๋˜๋Š” ์—…๋ฐ์ดํŠธ ํ•œ๋‹ค. ์ด๊ฒƒ์€ ์ˆœ์„œ๋ฅผ ๋ณด์กดํ•˜์ง€ ์•Š๋Š”๋‹ค.

์ด ๋ณ‘ํ•ฉ ์ „๋žต์€ ๊ฐ ํ•„๋“œ์— patchMergeKey๋ผ ์นญํ•˜๋Š” ํŠน๋ณ„ํ•œ ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. patchMergeKey๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์†Œ์Šค ์ฝ”๋“œ: types.go ์˜ ๊ฐ ํ•„๋“œ์— ๋Œ€ํ•ด ์ •์˜ํ•œ๋‹ค. ๋งต ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ณ‘ํ•ฉํ•  ๋•Œ, ์ฃผ์–ด์ง„ ๊ตฌ์„ฑ์š”์†Œ์— ๋Œ€ํ•œ patchMergeKey๋กœ ์ง€์ •ํ•œ ํ•„๋“œ๋Š” ํ•ด๋‹น ๊ตฌ์„ฑ์š”์†Œ์— ๋Œ€ํ•œ ๋งตํ‚ค์™€ ๊ฐ™์ด ์‚ฌ์šฉ๋œ๋‹ค.

์˜ˆ์‹œ: kubectl apply๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ PodSpec์— ๋Œ€ํ•œ containersํ•„๋“œ๋ฅผ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.
์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ฐ ๊ตฌ์„ฑ์š”์†Œ๊ฐ€ name๋ณ„๋กœ ํ‚ค๋กœ ๋˜์–ด ์žˆ๋Š” ๋งต์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ณ‘ํ•ฉํ•œ๋‹ค.

# last-applied-configuration value
    containers:
    - name: nginx
      image: nginx:1.10
    - name: nginx-helper-a # key: nginx-helper-a; will be deleted in result
      image: helper:1.3
    - name: nginx-helper-b # key: nginx-helper-b; will be retained
      image: helper:1.3

# configuration file value
    containers:
    - name: nginx
      image: nginx:1.10
    - name: nginx-helper-b
      image: helper:1.3
    - name: nginx-helper-c # key: nginx-helper-c; will be added in result
      image: helper:1.3

# live configuration
    containers:
    - name: nginx
      image: nginx:1.10
    - name: nginx-helper-a
      image: helper:1.3
    - name: nginx-helper-b
      image: helper:1.3
      args: ["run"] # Field will be retained
    - name: nginx-helper-d # key: nginx-helper-d; will be retained
      image: helper:1.3

# result after merge
    containers:
    - name: nginx
      image: nginx:1.10
      # Element nginx-helper-a was deleted
    - name: nginx-helper-b
      image: helper:1.3
      args: ["run"] # Field was retained
    - name: nginx-helper-c # Element was added
      image: helper:1.3
    - name: nginx-helper-d # Element was ignored
      image: helper:1.3

์„ค๋ช…:

  • ๊ตฌ์„ฑ ํŒŒ์ผ์— "nginx-helper-a"๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง„ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— "nginx-helper-a"๋ผ๋Š” ์ปจํ…Œ์ด๋„ˆ๋Š” ์‚ญ์ œ๋˜์—ˆ๋‹ค.
  • "nginx-helper-b"๋ผ๋Š” ์ปจํ…Œ์ด๋„ˆ๋Š” ํ™œ์„ฑ ๊ตฌ์„ฑ์— args์—
    ๋Œ€ํ•œ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์œ ์ง€ํ–ˆ๋‹ค. kubectl apply๋Š”
    ํ•„๋“œ ๊ฐ’์ด ๋‹ค๋ฆ„์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ (๊ตฌ์„ฑ ํŒŒ์ผ์— args๊ฐ€ ์—†์Œ) ํ™œ์„ฑ ๊ตฌ์„ฑ์—
    "nginx-helper-b"๊ฐ€ ๊ตฌ์„ฑ ํŒŒ์ผ๊ณผ ๋™์ผํ•œ "nginx-helper-b"์ž„์„ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ด๊ฒƒ์€ patchMergeKey ํ•„๋“œ ๊ฐ’(์ด๋ฆ„)์ด ๋‘˜ ๋‹ค ๊ฐ™์•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค..
  • "nginx-helper-c"๋ผ๋Š” ์ด๋ฆ„์˜ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํ™œ์„ฑ ๊ตฌ์„ฑ์— ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์•˜์ง€๋งŒ, ๊ตฌ์„ฑ ํŒŒ์ผ์— ๊ทธ ์ด๋ฆ„์„ ๊ฐ€์ง„ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋‚˜ํƒ€๋‚ฌ๊ธฐ ๋•Œ๋ฌธ์— ์ถ”๊ฐ€๋˜์—ˆ๋‹ค.
  • last-applied-configuration์— ๊ทธ ์ด๋ฆ„์„ ๊ฐ€์ง„ ๊ตฌ์„ฑ์š”์†Œ๊ฐ€ ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— "nginx-helper-d"๋ผ๋Š” ์ด๋ฆ„์˜ ์ปจํ…Œ์ด๋„ˆ๋Š” ์œ ์ง€๋˜์—ˆ๋‹ค.

๊ธฐ์ดˆ ๊ตฌ์„ฑ์š”์†Œ ๋ฆฌ์ŠคํŠธ ๋ณ‘ํ•ฉ

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค 1.5๋กœ๋ถ€ํ„ฐ ๊ธฐ์ดˆ ๊ตฌ์„ฑ์š”์†Œ ๋ณ‘ํ•ฉํ•˜๊ธฐ๋Š” ์ง€์›๋˜์ง€ ์•Š๋Š”๋‹ค.

๊ธฐ๋ณธ ํ•„๋“œ๊ฐ’

์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ๊ฐ’์ด ์ง€์ •๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ, API ์„œ๋ฒ„๋Š” ํ™œ์„ฑ ๊ตฌ์„ฑ ๋‚ด ํŠน์ • ํ•„๋“œ๋ฅผ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

๋‹ค์Œ์€ ๋””ํ”Œ๋กœ์ด๋จผํŠธ์— ๋Œ€ํ•œ ๊ตฌ์„ฑ ํŒŒ์ผ์ด๋‹ค. ํŒŒ์ผ์—๋Š” strategy๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์•˜๋‹ค.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  minReadySeconds: 5
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

kubectl apply๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

kubectl apply -f https://k8s.io/examples/application/simple_deployment.yaml

kubectl get์„ ์‚ฌ์šฉํ•˜์—ฌ ํ™œ์„ฑ ๊ตฌ์„ฑ์„ ์ถœ๋ ฅํ•œ๋‹ค.

kubectl get -f https://k8s.io/examples/application/simple_deployment.yaml -o yaml

์ถœ๋ ฅ์€ API ์„œ๋ฒ„๊ฐ€ ํ™œ์„ฑ ๊ตฌ์„ฑ ๋‚ด ์—ฌ๋Ÿฌ ํ•„๋“œ๋ฅผ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์„ค์ •ํ•œ ๊ฒƒ์„ ๋ณด์—ฌ์ค€๋‹ค. ์ด ํ•„๋“œ๋“ค์€ ๊ตฌ์„ฑ ํŒŒ์ผ์— ์ง€์ •๋˜์ง€ ์•Š์•˜๋‹ค.

apiVersion: apps/v1
kind: Deployment
# ...
spec:
  selector:
    matchLabels:
      app: nginx
  minReadySeconds: 5
  replicas: 1 # defaulted by apiserver
  strategy:
    rollingUpdate: # defaulted by apiserver - derived from strategy.type
      maxSurge: 1
      maxUnavailable: 1
    type: RollingUpdate # defaulted by apiserver
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:1.14.2
        imagePullPolicy: IfNotPresent # defaulted by apiserver
        name: nginx
        ports:
        - containerPort: 80
          protocol: TCP # defaulted by apiserver
        resources: {} # defaulted by apiserver
        terminationMessagePath: /dev/termination-log # defaulted by apiserver
      dnsPolicy: ClusterFirst # defaulted by apiserver
      restartPolicy: Always # defaulted by apiserver
      securityContext: {} # defaulted by apiserver
      terminationGracePeriodSeconds: 30 # defaulted by apiserver
# ...

ํŒจ์น˜ ์š”์ฒญ์—์„œ, ํŒจ์น˜ ์š”์ฒญ์˜ ๋ถ€๋ถ„์œผ๋กœ์„œ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์›Œ์ง€์ง€ ์•Š์€ ๊ฒฝ์šฐ ๊ธฐ๋ณธ ์ฒ˜๋ฆฌ๋œ ํ•„๋“œ๋Š” ๋‹ค์‹œ ๊ธฐ๋ณธ์œผ๋กœ ์„ค์ •๋˜์ง€ ์•Š๋Š”๋‹ค. ์ด๊ฒƒ์€ ๋‹ค๋ฅธ ํ•„๋“œ์— ๋Œ€ํ•œ ๊ฐ’์— ๋”ฐ๋ผ ๊ธฐ๋ณธ ์ฒ˜๋ฆฌ๋œ ํ•„๋“œ์— ๋Œ€ํ•ด ์˜ˆ์ƒํ•˜์ง€ ๋ชปํ•œ ๋™์ž‘์„ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹ค๋ฅธ ํ•„๋“œ๊ฐ€ ๋‚˜์ค‘์— ๋ณ€๊ฒฝ๋˜๋ฉด, ๊ทธ๋กœ๋ถ€ํ„ฐ ๊ธฐ๋ณธ ์ฒ˜๋ฆฌ๋œ ๊ฒƒ์ด ๋ช…์‹œ์ ์œผ๋กœ ์ง€์›Œ์ง€์ง€ ์•Š์€ ํ•œ ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค.

์ด๋Ÿฌํ•œ ์‚ฌ์œ ๋กœ, ์˜๋„ํ•œ ๊ฐ’์ด ์„œ๋ฒ„์˜ ๊ธฐ๋ณธ๊ฐ’๊ณผ ์ผ์น˜ํ•˜๋”๋ผ๋„, ์„œ๋ฒ„์— ์˜ํ•ด ๊ธฐ๋ณธ ์ฒ˜๋ฆฌ๋œ ํŠน์ • ํ•„๋“œ๋Š” ๊ตฌ์„ฑ ํŒŒ์ผ ๋‚ด ๋ช…์‹œ์ ์œผ๋กœ ์ •์˜ํ•  ๊ฒƒ์„ ๊ถŒ๊ณ ํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์„œ๋ฒ„์— ์˜ํ•ด ๋‹ค์‹œ ๊ธฐ๋ณธ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š๊ฒŒ ๋  ์ถฉ๋Œํ•˜๋Š” ๊ฐ’์„ ๋ณด๋‹ค ์‰ฝ๊ฒŒ ์ธ์‹ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค.

Example:

# last-applied-configuration
spec:
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

# configuration file
spec:
  strategy:
    type: Recreate # updated value
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

# live configuration
spec:
  strategy:
    type: RollingUpdate # defaulted value
    rollingUpdate: # defaulted value derived from type
      maxSurge : 1
      maxUnavailable: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

# result after merge - ERROR!
spec:
  strategy:
    type: Recreate # updated value: incompatible with rollingUpdate
    rollingUpdate: # defaulted value: incompatible with "type: Recreate"
      maxSurge : 1
      maxUnavailable: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

์„ค๋ช…:

  1. ์‚ฌ์šฉ์ž๊ฐ€ strategy.type์„ ์ •์˜ํ•˜์ง€ ์•Š๊ณ  ๋””ํ”Œ๋กœ์ด๋จผํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
  2. ์„œ๋ฒ„๋Š” strategy.type์„ RollingUpdate๋กœ ๊ธฐ๋ณธ ์„ค์ •ํ•˜๊ณ  strategy.rollingUpdate๊ฐ’์„ ๊ธฐ๋ณธ ๊ฐ’์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.
  3. ์‚ฌ์šฉ์ž๊ฐ€ strategy.type๋ฅผ Recreate๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค. ์„œ๋ฒ„์—์„œ ํ•ด๋‹น ๊ฐ’์ด ์‚ญ์ œ๋  ๊ฑฐ๋ผ ์˜ˆ์ƒํ•˜์ง€๋งŒ strategy.rollingUpdate๊ฐ’์€ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ๋‚จ์•„ ์žˆ๋‹ค.
    strategy.rollingUpdate๊ฐ’์ด ์ฒ˜์Œ์— ๊ตฌ์„ฑ ํŒŒ์ผ์—์„œ ์ง€์ •๋˜์—ˆ๋‹ค๋ฉด, ์ด๊ฒƒ์„ ์‚ญ์ œํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด ๋” ๋ถ„๋ช…ํ–ˆ์„ ๊ฒƒ์ด๋‹ค.
  4. strategy.rollingUpdate๊ฐ€ ์ง€์›Œ์ง€์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ ์šฉ์€ ์‹คํŒจํ•œ๋‹ค. strategy.rollingupdate ํ•„๋“œ๋Š” Recreate์˜ strategy.type์œผ๋กœ ์ •์˜๋  ์ˆ˜ ์—†๋‹ค.

๊ถŒ๊ณ : ์ด๋“ค ํ•„๋“œ๋Š” ์˜ค๋ธŒ์ ํŠธ ๊ตฌ์„ฑ ํŒŒ์ผ ๋‚ด ๋ช…์‹œ์ ์œผ๋กœ ์ •์˜๋ผ์•ผ ํ•œ๋‹ค.

  • ๋””ํ”Œ๋กœ์ด๋จผํŠธ, ์Šคํ…Œ์ดํŠธํ’€์…‹, ์žก, ๋ฐ๋ชฌ์…‹, ๋ ˆํ”Œ๋ฆฌ์นด์…‹ ๋ฐ ๋ ˆํ”Œ๋ฆฌ์ผ€์ด์…˜์ปจํŠธ๋กค๋Ÿฌ์™€ ๊ฐ™์€ ์›Œํฌ๋กœ๋“œ์— ๋Œ€ํ•œ ์…€๋ ‰ํ„ฐ์™€ ํŒŒ๋“œํ…œํ”Œ๋ฆฟ ๋ ˆ์ด๋ธ”
  • ๋””ํ”Œ๋กœ์ด๋จผํŠธ ๋กค์•„์›ƒ ์ „๋žต

์„œ๋ฒ„ ๊ธฐ๋ณธ ํ•„๋“œ ๋˜๋Š” ๋‹ค๋ฅธ ์ž‘์„ฑ์ž์— ์˜ํ•ด ์„ค์ •๋œ ํ•„๋“œ ์ง€์šฐ๋Š” ๋ฐฉ๋ฒ•

๊ตฌ์„ฑ ํŒŒ์ผ ๋‚ด ๋‚˜ํƒ€๋‚˜์ง€ ์•Š๋Š” ํ•„๋“œ๋Š” ๊ทธ ๊ฐ’์„ null๋กœ ์„ค์ •ํ•˜๊ณ  ๋‚˜์„œ ๊ตฌ์„ฑ ํŒŒ์ผ์„ ์ ์šฉํ•จ์œผ๋กœ์จ ์ง€์›Œ์งˆ ์ˆ˜ ์žˆ๋‹ค. ์„œ๋ฒ„๊ฐ€ ๊ธฐ๋ณธ ๊ฐ’์„ ํ• ๋‹นํ–ˆ๋˜ ํ•„๋“œ์— ๋Œ€ํ•ด์„œ, ์ด๋Š” ๋‹ค์‹œ ๊ธฐ๋ณธ ๊ฐ’์„ ํ• ๋‹นํ•˜๋„๋ก ํ•œ๋‹ค.

๊ตฌ์„ฑ ํŒŒ์ผ๊ณผ ์ง์ ‘ ๋ช…๋ นํ˜• ์ž‘์„ฑ์ž ๊ฐ„์˜ ํ•„๋“œ ์†Œ์œ ๊ถŒ์„ ๋ณ€๊ฒฝ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•

๊ฐœ๋ณ„ ์˜ค๋ธŒ์ ํŠธ ํ•„๋“œ๋ฅผ ๋ณ€๊ฒฝ์‹œํ‚ค๋Š” ๋ฐ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • kubectl apply๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • ๊ตฌ์„ฑ ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  ํ™œ์„ฑ ๊ตฌ์„ฑ์„ ์ง์ ‘ ์ž‘์„ฑํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, kubectl scale์„ ์‚ฌ์šฉํ•œ๋‹ค.

์ง์ ‘ ๋ช…๋ นํ˜• ์ž‘์„ฑ์ž์—์„œ ๊ตฌ์„ฑ ํŒŒ์ผ๋กœ ์†Œ์œ ์ž ๋ณ€๊ฒฝํ•˜๊ธฐ

๊ตฌ์„ฑ ํŒŒ์ผ์— ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. ํ•ด๋‹น ํ•„๋“œ์˜ ๊ฒฝ์šฐ kubectl apply๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๋Š” ํ™œ์„ฑ ๊ตฌ์„ฑ์— ๋Œ€ํ•ด ์ง์ ‘ ์—…๋ฐ์ดํŠธ๋ฅผ ์ ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

๊ตฌ์„ฑ ํŒŒ์ผ์—์„œ ์ง์ ‘ ๋ช…๋ นํ˜• ์ž‘์„ฑ์ž๋กœ ์†Œ์œ ์ž ๋ณ€๊ฒฝํ•˜๊ธฐ

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค 1.5๋กœ๋ถ€ํ„ฐ ๊ตฌ์„ฑ ํŒŒ์ผ์—์„œ ๋ช…๋ นํ˜• ์ž‘์„ฑ์ž๋กœ ์†Œ์œ ๊ถŒ์„ ๋ณ€๊ฒฝํ•˜๋Š”๋ฐ ์ˆ˜๋™ ๋‹จ๊ณ„ ํ•„์š”ํ•˜๋‹ค.

  • ๊ตฌ์„ฑ ํŒŒ์ผ์—์„œ ํ•„๋“œ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค.
  • ํ™œ์„ฑ ์˜ค๋ธŒ์ ํŠธ ์ƒ์˜ kubectl.kubernetes.io/last-applied-configuration ์–ด๋…ธํ…Œ์ด์…˜์—์„œ ํ•„๋“œ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค.

๊ด€๋ฆฌ ๋ฐฉ๋ฒ• ๋ณ€๊ฒฝํ•˜๊ธฐ

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜ค๋ธŒ์ ํŠธ๋Š” ํ•œ ๋ฒˆ์— ์˜ค์ง ํ•˜๋‚˜์˜ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ด€๋ฆฌ๋ผ์•ผ ํ•œ๋‹ค. ํ•˜๋‚˜์˜ ๋ฐฉ๋ฒ•์—์„œ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ์€ ๊ฐ€๋Šฅํ•˜๋‚˜, ์ˆ˜๋™ ํ”„๋กœ์„ธ์Šค์ด๋‹ค.

๋ช…๋ นํ˜• ์ปค๋งจ๋“œ ๊ด€๋ฆฌ์—์„œ ์˜ค๋ธŒ์ ํŠธ ๊ตฌ์„ฑ์œผ๋กœ ์ด์ „ํ•˜๊ธฐ

๋ช…๋ นํ˜• ์ปค๋งจ๋“œ ๊ด€๋ฆฌ์—์„œ ์˜ค๋ธŒ์ ํŠธ ๊ตฌ์„ฑ์œผ๋กœ ์ด์ „ํ•˜๋Š” ๊ฒƒ์€ ์—ฌ๋Ÿฌ ์ˆ˜๋™ ๋‹จ๊ณ„๋ฅผ ํฌํ•จํ•œ๋‹ค.

  1. ํ™œ์„ฑ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋กœ์ปฌ ๊ตฌ์„ฑ ํŒŒ์ผ๋กœ ๋‚ด๋ณด๋‚ธ๋‹ค.

    kubectl get <์ข…๋ฅ˜>/<์ด๋ฆ„> -o yaml > <์ข…๋ฅ˜>_<์ด๋ฆ„>.yaml
    
  2. ๊ตฌ์„ฑ ํŒŒ์ผ์—์„œ ์ˆ˜๋™์œผ๋กœ status ํ•„๋“œ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค.

  3. ์˜ค๋ธŒ์ ํŠธ์˜ kubectl.kubernetes.io/last-applied-configuration ์–ด๋…ธํ…Œ์ด์…˜์„ ์„ค์ •ํ•œ๋‹ค.

    kubectl replace --save-config -f <์ข…๋ฅ˜>_<์ด๋ฆ„>.yaml
    
  4. ์˜ค์ง ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด kubectl apply๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ณ€๊ฒฝํ•œ๋‹ค.

๋ช…๋ นํ˜• ์˜ค๋ธŒ์ ํŠธ ๊ตฌ์„ฑ์—์„œ ์„ ์–ธํ˜• ์˜ค๋ธŒ์ ํŠธ ๊ตฌ์„ฑ์œผ๋กœ ์ด์ „ํ•˜๊ธฐ

  1. ์˜ค๋ธŒ์ ํŠธ์˜ kubectl.kubernetes.io/last-applied-configuration ์–ด๋…ธํ…Œ์ด์…˜์„ ์„ค์ •ํ•œ๋‹ค.

    kubectl replace --save-config -f <์ข…๋ฅ˜>_<์ด๋ฆ„>.yaml
    
  2. ์˜ค์ง ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด kubectl apply๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ณ€๊ฒฝํ•œ๋‹ค.

์ปจํŠธ๋กค๋Ÿฌ ์…€๋ ‰ํ„ฐ์™€ ํŒŒ๋“œํ…œํ”Œ๋ฆฟ ๋ ˆ์ด๋ธ” ์ •์˜ํ•˜๊ธฐ

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

์˜ˆ์‹œ:

selector:
  matchLabels:
      controller-selector: "apps/v1/deployment/nginx"
template:
  metadata:
    labels:
      controller-selector: "apps/v1/deployment/nginx"

๋‹ค์Œ ๋‚ด์šฉ

2 - Kustomize๋ฅผ ์ด์šฉํ•œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜ค๋ธŒ์ ํŠธ์˜ ์„ ์–ธํ˜• ๊ด€๋ฆฌ

Kustomize๋Š” kustomization ํŒŒ์ผ์„ ํ†ตํ•ด ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ๋Œ€๋กœ ๋ณ€๊ฒฝํ•˜๋Š”(customize) ๋…๋ฆฝํ˜• ๋„๊ตฌ์ด๋‹ค.

1.14 ์ดํ›„๋กœ, kubectl๋„ kustomization ํŒŒ์ผ์„ ์‚ฌ์šฉํ•œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜ค๋ธŒ์ ํŠธ์˜ ๊ด€๋ฆฌ๋ฅผ ์ง€์›ํ•œ๋‹ค. kustomization ํŒŒ์ผ์„ ํฌํ•จํ•˜๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ ๋‚ด์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ณด๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

kubectl kustomize <kustomization_directory>

์ด ๋ฆฌ์†Œ์Šค๋ฅผ ์ ์šฉํ•˜๋ ค๋ฉด kubectl apply๋ฅผ --kustomize ๋˜๋Š” -k ํ”Œ๋ž˜๊ทธ์™€ ํ•จ๊ป˜ ์‹คํ–‰ํ•œ๋‹ค.

kubectl apply -k <kustomization_directory>

์‹œ์ž‘ํ•˜๊ธฐ ์ „์—

kubectl์„ ์„ค์น˜ํ•œ๋‹ค.

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ํ•„์š”ํ•˜๊ณ , kubectl ์ปค๋งจ๋“œ-๋ผ์ธ ํˆด์ด ํด๋Ÿฌ์Šคํ„ฐ์™€ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์ด ํŠœํ† ๋ฆฌ์–ผ์€ ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ํ˜ธ์ŠคํŠธ๊ฐ€ ์•„๋‹Œ ๋…ธ๋“œ๊ฐ€ ์ ์–ด๋„ 2๊ฐœ ํฌํ•จ๋œ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•œ๋‹ค. ๋งŒ์•ฝ, ์•„์ง ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๋‹ค๋ฉด, minikube๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ๋‹ค์Œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํ”Œ๋ ˆ์ด๊ทธ๋ผ์šด๋“œ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฒ„์ „ ํ™•์ธ์„ ์œ„ํ•ด์„œ, ๋‹ค์Œ ์ปค๋งจ๋“œ๋ฅผ ์‹คํ–‰ kubectl version.

Kustomize ๊ฐœ์š”

Kustomize๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๊ตฌ์„ฑ์„ ์‚ฌ์šฉ์ž ์ •์˜ํ™”ํ•˜๋Š” ๋„๊ตฌ์ด๋‹ค. ์ด๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์„ฑ ํŒŒ์ผ์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ ๊ธฐ๋Šฅ๋“ค์„ ๊ฐ€์ง„๋‹ค.

  • ๋‹ค๋ฅธ ์†Œ์Šค์—์„œ ๋ฆฌ์†Œ์Šค ์ƒ์„ฑ
  • ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ๊ต์ฐจ ํŽธ์ง‘ ํ•„๋“œ ์„ค์ •
  • ๋ฆฌ์†Œ์Šค ์ง‘ํ•ฉ์„ ๊ตฌ์„ฑํ•˜๊ณ  ์‚ฌ์šฉ์ž ์ •์˜

๋ฆฌ์†Œ์Šค ์ƒ์„ฑ

์ปจํ”ผ๊ทธ๋งต๊ณผ ์‹œํฌ๋ฆฟ์€ ํŒŒ๋“œ์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜ค๋ธŒ์ ํŠธ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์„ค์ •์ด๋‚˜ ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์ปจํ”ผ๊ทธ๋งต์ด๋‚˜ ์‹œํฌ๋ฆฟ์˜ ์‹ค์งˆ์ ์ธ ์†Œ์Šค๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ .properties ํŒŒ์ผ์ด๋‚˜ ssh key ํŒŒ์ผ๊ณผ ๊ฐ™์€ ๊ฒƒ๋“ค์€ ํด๋Ÿฌ์Šคํ„ฐ ์™ธ๋ถ€์— ์žˆ๋‹ค. Kustomize๋Š” ์‹œํฌ๋ฆฟ๊ณผ ์ปจํ”ผ๊ทธ๋งต์„ ํŒŒ์ผ์ด๋‚˜ ๋ฌธ์ž์—ด์—์„œ ์ƒ์„ฑํ•˜๋Š” secretGenerator์™€ configMapGenerator๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

configMapGenerator

ํŒŒ์ผ์—์„œ ์ปจํ”ผ๊ทธ๋งต์„ ์ƒ์„ฑํ•˜๋ ค๋ฉด configMapGenerator ๋‚ด์˜ files ๋ฆฌ์ŠคํŠธ์— ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•œ๋‹ค. ๋‹ค์Œ์€ ํ•˜๋‚˜์˜ .properties ํŒŒ์ผ์—์„œ ๋ฐ์ดํ„ฐ ํ•ญ๋ชฉ์œผ๋กœ ์ปจํ”ผ๊ทธ๋งต์„ ์ƒ์„ฑํ•˜๋Š” ์˜ˆ์ œ์ด๋‹ค.

# application.properties ํŒŒ์ผ์„ ์ƒ์„ฑ
cat <<EOF >application.properties
FOO=Bar
EOF

cat <<EOF >./kustomization.yaml
configMapGenerator:
- name: example-configmap-1
  files:
  - application.properties
EOF

์ƒ์„ฑ๋œ ์ปจํ”ผ๊ทธ๋งต์€ ๋‹ค์Œ ๋ช…๋ น์–ด๋กœ ๊ฒ€์‚ฌํ•  ์ˆ˜ ์žˆ๋‹ค.

kubectl kustomize ./

์ƒ์„ฑ๋œ ์ปจํ”ผ๊ทธ๋งต์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

apiVersion: v1
data:
  application.properties: |
    FOO=Bar    
kind: ConfigMap
metadata:
  name: example-configmap-1-8mbdf7882g

env ํŒŒ์ผ์—์„œ ์ปจํ”ผ๊ทธ๋งต์„ ์ƒ์„ฑํ•˜๋ ค๋ฉด, configMapGenerator์˜ envs ๋ฆฌ์ŠคํŠธ์— ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•œ๋‹ค. ๋‹ค์Œ์€ .env ํŒŒ์ผ์˜ ๋ฐ์ดํ„ฐ ํ•ญ๋ชฉ์œผ๋กœ ์ปจํ”ผ๊ทธ๋งต์„ ์ƒ์„ฑํ•˜๋Š” ์˜ˆ์‹œ๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.

# .env ํŒŒ์ผ ์ƒ์„ฑ
cat <<EOF >.env
FOO=Bar
EOF

cat <<EOF >./kustomization.yaml
configMapGenerator:
- name: example-configmap-1
  envs:
  - .env
EOF

์ƒ์„ฑ๋œ ์ปจํ”ผ๊ทธ๋งต์€ ๋‹ค์Œ ๋ช…๋ น์–ด๋กœ ๊ฒ€์‚ฌํ•  ์ˆ˜ ์žˆ๋‹ค.

kubectl kustomize ./

์ƒ์„ฑ๋œ ์ปจํ”ผ๊ทธ๋งต์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

apiVersion: v1
data:
  FOO: Bar
kind: ConfigMap
metadata:
  name: example-configmap-1-42cfbf598f

์ปจํ”ผ๊ทธ๋งต์€ ๋ฌธ์ž๋กœ๋œ ํ‚ค-๊ฐ’ ์Œ๋“ค๋กœ๋„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฌธ์ž๋กœ๋œ ํ‚ค-๊ฐ’ ์Œ์—์„œ ์ปจํ”ผ๊ทธ๋งต์„ ์ƒ์„ฑํ•˜๋ ค๋ฉด, configMapGenerator ๋‚ด์˜ literals ๋ฆฌ์ŠคํŠธ์— ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•œ๋‹ค. ๋‹ค์Œ์€ ํ‚ค-๊ฐ’ ์Œ์„ ๋ฐ์ดํ„ฐ ํ•ญ๋ชฉ์œผ๋กœ ๋ฐ›๋Š” ์ปจํ”ผ๊ทธ๋งต์„ ์ƒ์„ฑํ•˜๋Š” ์˜ˆ์ œ์ด๋‹ค.

cat <<EOF >./kustomization.yaml
configMapGenerator:
- name: example-configmap-2
  literals:
  - FOO=Bar
EOF

์ƒ์„ฑ๋œ ์ปจํ”ผ๊ทธ๋งต์€ ๋‹ค์Œ ๋ช…๋ น์–ด๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

kubectl kustomize ./

์ƒ์„ฑ๋œ ์ปจํ”ผ๊ทธ๋งต์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

apiVersion: v1
data:
  FOO: Bar
kind: ConfigMap
metadata:
  name: example-configmap-2-g2hdhfc6tk

๋””ํ”Œ๋กœ์ด๋จผํŠธ์—์„œ ์ƒ์„ฑ๋œ ์ปจํ”ผ๊ทธ๋งต์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”, configMapGenerator์˜ ์ด๋ฆ„์„ ์ฐธ์กฐํ•œ๋‹ค. Kustomize๋Š” ์ž๋™์œผ๋กœ ํ•ด๋‹น ์ด๋ฆ„์„ ์ƒ์„ฑ๋œ ์ด๋ฆ„์œผ๋กœ ๊ต์ฒดํ•  ๊ฒƒ์ด๋‹ค.

๋‹ค์Œ์€ ์ƒ์„ฑ๋œ ์ปจํ”ผ๊ทธ๋งต์„ ์‚ฌ์šฉํ•˜๋Š” ๋””ํ”Œ๋กœ์ด๋จผํŠธ์˜ ์˜ˆ์‹œ๋‹ค.

# application.properties ํŒŒ์ผ์„ ์ƒ์„ฑํ•œ๋‹ค.
cat <<EOF >application.properties
FOO=Bar
EOF

cat <<EOF >deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
  labels:
    app: my-app
spec:
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: app
        image: my-app
        volumeMounts:
        - name: config
          mountPath: /config
      volumes:
      - name: config
        configMap:
          name: example-configmap-1
EOF

cat <<EOF >./kustomization.yaml
resources:
- deployment.yaml
configMapGenerator:
- name: example-configmap-1
  files:
  - application.properties
EOF

์ปจํ”ผ๊ทธ๋งต๊ณผ ๋””ํ”Œ๋กœ์ด๋จผํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

kubectl kustomize ./

์ƒ์„ฑ๋œ ๋””ํ”Œ๋กœ์ด๋จผํŠธ๋Š” ์ด๋ฆ„์„ ํ†ตํ•ด์„œ ์ƒ์„ฑ๋œ ์ปจํ”ผ๊ทธ๋งต์„ ์ฐธ์กฐํ•œ๋‹ค.

apiVersion: v1
data:
  application.properties: |
    FOO=Bar    
kind: ConfigMap
metadata:
  name: example-configmap-1-g4hk9g2ff8
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: my-app
  name: my-app
spec:
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - image: my-app
        name: app
        volumeMounts:
        - mountPath: /config
          name: config
      volumes:
      - configMap:
          name: example-configmap-1-g4hk9g2ff8
        name: config

secretGenerator

ํŒŒ์ผ ๋˜๋Š” ๋ฌธ์ž๋กœ๋œ ํ‚ค-๊ฐ’ ์Œ๋“ค๋กœ ์‹œํฌ๋ฆฟ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ํŒŒ์ผ์—์„œ ์‹œํฌ๋ฆฟ์„ ์ƒ์„ฑํ•˜๋ ค๋ฉด secretGenerator ๋‚ด์˜ files ๋ฆฌ์ŠคํŠธ์— ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•œ๋‹ค. ๋‹ค์Œ์€ ํŒŒ์ผ์„ ๋ฐ์ดํ„ฐ ํ•ญ๋ชฉ์œผ๋กœ ๋ฐ›๋Š” ์‹œํฌ๋ฆฟ์„ ์ƒ์„ฑํ•˜๋Š” ์˜ˆ์ œ์ด๋‹ค.

# password.txt ํŒŒ์ผ์„ ์ƒ์„ฑ
cat <<EOF >./password.txt
username=admin
password=secret
EOF

cat <<EOF >./kustomization.yaml
secretGenerator:
- name: example-secret-1
  files:
  - password.txt
EOF

์ƒ์„ฑ๋œ ์‹œํฌ๋ฆฟ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

apiVersion: v1
data:
  password.txt: dXNlcm5hbWU9YWRtaW4KcGFzc3dvcmQ9c2VjcmV0Cg==
kind: Secret
metadata:
  name: example-secret-1-t2kt65hgtb
type: Opaque

๋ฌธ์ž๋กœ๋œ ํ‚ค-๊ฐ’ ์Œ์œผ๋กœ ์‹œํฌ๋ฆฟ์„ ์ƒ์„ฑํ•˜๋ ค๋ฉด, secretGenerator ๋‚ด์˜ literals ๋ฆฌ์ŠคํŠธ์— ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•œ๋‹ค. ๋‹ค์Œ์€ ํ‚ค-๊ฐ’ ์Œ์„ ๋ฐ์ดํ„ฐ ํ•ญ๋ชฉ์œผ๋กœ ๋ฐ›๋Š” ์‹œํฌ๋ฆฟ์„ ์ƒ์„ฑํ•˜๋Š” ์˜ˆ์ œ์ด๋‹ค.

cat <<EOF >./kustomization.yaml
secretGenerator:
- name: example-secret-2
  literals:
  - username=admin
  - password=secret
EOF

์ƒ์„ฑ๋œ ์‹œํฌ๋ฆฟ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

apiVersion: v1
data:
  password: c2VjcmV0
  username: YWRtaW4=
kind: Secret
metadata:
  name: example-secret-2-t52t6g96d8
type: Opaque

์ปจํ”ผ๊ทธ๋งต๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ, ์ƒ์„ฑ๋œ ์‹œํฌ๋ฆฟ๋„ secretGenerator์˜ ์ด๋ฆ„์„ ์ฐธ์กฐํ•จ์œผ๋กœ์จ ๋””ํ”Œ๋กœ์ด๋จผํŠธ์—์„œ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค.

# password.txt ํŒŒ์ผ์„ ์ƒ์„ฑํ•œ๋‹ค.
cat <<EOF >./password.txt
username=admin
password=secret
EOF

cat <<EOF >deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
  labels:
    app: my-app
spec:
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: app
        image: my-app
        volumeMounts:
        - name: password
          mountPath: /secrets
      volumes:
      - name: password
        secret:
          secretName: example-secret-1
EOF

cat <<EOF >./kustomization.yaml
resources:
- deployment.yaml
secretGenerator:
- name: example-secret-1
  files:
  - password.txt
EOF

generatorOptions

์ƒ์„ฑ๋œ ์ปจํ”ผ๊ทธ๋งต๊ณผ ์‹œํฌ๋ฆฟ์€ ์ฝ˜ํ…์ธ  ํ•ด์‹œ ์ ‘๋ฏธ์‚ฌ๊ฐ€ ์ถ”๊ฐ€๋œ๋‹ค. ์ด๋Š” ์ฝ˜ํ…์ธ ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ์ƒˆ๋กœ์šด ์ปจํ”ผ๊ทธ๋งต ์ด๋‚˜ ์‹œํฌ๋ฆฟ์ด ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•œ๋‹ค. ์ ‘๋ฏธ์‚ฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋™์ž‘์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ generatorOptions๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ฐ–์—, ์ƒ์„ฑ๋œ ์ปจํ”ผ๊ทธ๋งต๊ณผ ์‹œํฌ๋ฆฟ์— ๊ต์ฐจ ํŽธ์ง‘ ์˜ต์…˜๋“ค์„ ์ง€์ •ํ•ด์ฃผ๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

cat <<EOF >./kustomization.yaml
configMapGenerator:
- name: example-configmap-3
  literals:
  - FOO=Bar
generatorOptions:
  disableNameSuffixHash: true
  labels:
    type: generated
  annotations:
    note: generated
EOF

์ƒ์„ฑ๋œ ์ปจํ”ผ๊ทธ๋งต์„ ๋ณด๋ ค๋ฉด kubectl kustomize ./๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

apiVersion: v1
data:
  FOO: Bar
kind: ConfigMap
metadata:
  annotations:
    note: generated
  labels:
    type: generated
  name: example-configmap-3

๊ต์ฐจ ํŽธ์ง‘ ํ•„๋“œ ์„ค์ •

ํ”„๋กœ์ ํŠธ ๋‚ด ๋ชจ๋“  ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ฆฌ์†Œ์Šค์— ๊ต์ฐจ ํŽธ์ง‘ ํ•„๋“œ๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์€ ๊ฝค๋‚˜ ์ผ๋ฐ˜์ ์ด๋‹ค. ๊ต์ฐจ ํŽธ์ง‘ ํ•„๋“œ๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • ๋ชจ๋“  ๋ฆฌ์†Œ์Šค์— ๋™์ผํ•œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์„ค์ •
  • ๋™์ผํ•œ ๋„ค์ž„ ์ ‘๋‘์‚ฌ ๋˜๋Š” ์ ‘๋ฏธ์‚ฌ๋ฅผ ์ถ”๊ฐ€
  • ๋™์ผํ•œ ๋ ˆ์ด๋ธ”๋“ค์„ ์ถ”๊ฐ€
  • ๋™์ผํ•œ ์–ด๋…ธํ…Œ์ด์…˜๋“ค์„ ์ถ”๊ฐ€

๋‹ค์Œ์€ ์˜ˆ์ œ์ด๋‹ค.

# deployment.yaml์„ ์ƒ์„ฑ
cat <<EOF >./deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
EOF

cat <<EOF >./kustomization.yaml
namespace: my-namespace
namePrefix: dev-
nameSuffix: "-001"
commonLabels:
  app: bingo
commonAnnotations:
  oncallPager: 800-555-1212
resources:
- deployment.yaml
EOF

์ด ํ•„๋“œ๋“ค์ด ๋””ํ”Œ๋กœ์ด๋จผํŠธ ๋ฆฌ์†Œ์Šค์— ๋ชจ๋‘ ์„ค์ •๋˜์—ˆ๋Š”์ง€ ๋ณด๋ ค๋ฉด kubectl kustomize ./๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    oncallPager: 800-555-1212
  labels:
    app: bingo
  name: dev-nginx-deployment-001
  namespace: my-namespace
spec:
  selector:
    matchLabels:
      app: bingo
  template:
    metadata:
      annotations:
        oncallPager: 800-555-1212
      labels:
        app: bingo
    spec:
      containers:
      - image: nginx
        name: nginx

๋ฆฌ์†Œ์Šค ๊ตฌ์„ฑ๊ณผ ์‚ฌ์šฉ์ž ์ •์˜

ํ”„๋กœ์ ํŠธ ๋‚ด ๋ฆฌ์†Œ์Šค์˜ ์ง‘ํ•ฉ์„ ๊ตฌ์„ฑํ•˜์—ฌ ์ด๋“ค์„ ๋™์ผํ•œ ํŒŒ์ผ์ด๋‚˜ ๋””๋ ‰ํ„ฐ๋ฆฌ ๋‚ด์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ์ผ๋ฐ˜์ ์ด๋‹ค. Kustomize๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ํŒŒ์ผ๋“ค๋กœ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ  ํŒจ์น˜๋‚˜ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž ์ •์˜๋ฅผ ์ด๋“ค์— ์ ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ œ๊ณตํ•œ๋‹ค.

๊ตฌ์„ฑ

Kustomize๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๋ฆฌ์†Œ์Šค๋“ค์˜ ๊ตฌ์„ฑ์„ ์ง€์›ํ•œ๋‹ค. kustomization.yaml ํŒŒ์ผ ๋‚ด resources ํ•„๋“œ๋Š” ๊ตฌ์„ฑ ๋‚ด์— ํฌํ•จํ•˜๋ ค๋Š” ๋ฆฌ์†Œ์Šค๋“ค์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ •์˜ํ•œ๋‹ค. resources ๋ฆฌ์ŠคํŠธ ๋‚ด์— ๋ฆฌ์†Œ์Šค์˜ ๊ตฌ์„ฑ ํŒŒ์ผ์˜ ๊ฒฝ๋กœ๋ฅผ ์„ค์ •ํ•œ๋‹ค. ๋‹ค์Œ ์˜ˆ์ œ๋Š” ๋””ํ”Œ๋กœ์ด๋จผํŠธ์™€ ์„œ๋น„์Šค๋กœ ๊ตฌ์„ฑ๋œ NGINX ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋‹ค.

# deployment.yaml ํŒŒ์ผ ์ƒ์„ฑ
cat <<EOF > deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
spec:
  selector:
    matchLabels:
      run: my-nginx
  replicas: 2
  template:
    metadata:
      labels:
        run: my-nginx
    spec:
      containers:
      - name: my-nginx
        image: nginx
        ports:
        - containerPort: 80
EOF

# service.yaml ํŒŒ์ผ ์ƒ์„ฑ
cat <<EOF > service.yaml
apiVersion: v1
kind: Service
metadata:
  name: my-nginx
  labels:
    run: my-nginx
spec:
  ports:
  - port: 80
    protocol: TCP
  selector:
    run: my-nginx
EOF

# ์ด๋“ค์„ ๊ตฌ์„ฑํ•˜๋Š” kustomization.yaml ์ƒ์„ฑ
cat <<EOF >./kustomization.yaml
resources:
- deployment.yaml
- service.yaml
EOF

kubectl kustomize ./์˜ ๋ฆฌ์†Œ์Šค์—๋Š” ๋””ํ”Œ๋กœ์ด๋จผํŠธ์™€ ์„œ๋น„์Šค ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๋ชจ๋‘ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค.

์‚ฌ์šฉ์ž ์ •์˜

ํŒจ์น˜๋Š” ๋ฆฌ์†Œ์Šค์— ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž ์ •์˜๋ฅผ ์ ์šฉํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. Kustomize๋Š” patchesStrategicMerge์™€ patchesJson6902๋ฅผ ํ†ตํ•ด ์„œ๋กœ ๋‹ค๋ฅธ ํŒจ์น˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ง€์›ํ•œ๋‹ค. patchesStrategicMerge๋Š” ํŒŒ์ผ ๊ฒฝ๋กœ๋“ค์˜ ๋ฆฌ์ŠคํŠธ์ด๋‹ค. ๊ฐ๊ฐ์˜ ํŒŒ์ผ์€ ์ „๋žต์  ๋ณ‘ํ•ฉ ํŒจ์น˜๋กœ ๋ถ„์„๋  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ํŒจ์น˜ ๋‚ด๋ถ€์˜ ๋„ค์ž„์€ ๋ฐ˜๋“œ์‹œ ์ด๋ฏธ ์ฝํ˜€์ง„ ๋ฆฌ์†Œ์Šค ๋„ค์ž„๊ณผ ์ผ์น˜ํ•ด์•ผ ํ•œ๋‹ค. ํ•œ ๊ฐ€์ง€ ์ผ์„ ํ•˜๋Š” ์ž‘์€ ํŒจ์น˜๊ฐ€ ๊ถŒ์žฅ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๊ธฐ ์œ„ํ•ด ๋””ํ”Œ๋กœ์ด๋จผํŠธ ๋ ˆํ”Œ๋ฆฌ์นด ์ˆซ์ž๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค๋Š” ํ•˜๋‚˜์˜ ํŒจ์น˜์™€ ๋ฉ”๋ชจ๋ฆฌ ์ƒํ•œ์„ ์„ค์ •ํ•˜๋Š” ๋‹ค๋ฅธ ํŒจ์น˜๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

# deployment.yaml ํŒŒ์ผ ์ƒ์„ฑ
cat <<EOF > deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
spec:
  selector:
    matchLabels:
      run: my-nginx
  replicas: 2
  template:
    metadata:
      labels:
        run: my-nginx
    spec:
      containers:
      - name: my-nginx
        image: nginx
        ports:
        - containerPort: 80
EOF

# increase_replicas.yaml ํŒจ์น˜ ์ƒ์„ฑ
cat <<EOF > increase_replicas.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
spec:
  replicas: 3
EOF

# ๋‹ค๋ฅธ ํŒจ์น˜๋กœ set_memory.yaml ์ƒ์„ฑ
cat <<EOF > set_memory.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
spec:
  template:
    spec:
      containers:
      - name: my-nginx
        resources:
          limits:
            memory: 512Mi
EOF

cat <<EOF >./kustomization.yaml
resources:
- deployment.yaml
patchesStrategicMerge:
- increase_replicas.yaml
- set_memory.yaml
EOF

๋””ํ”Œ๋กœ์ด๋จผํŠธ๋ฅผ ๋ณด๋ ค๋ฉด kubectl kustomize ./๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      run: my-nginx
  template:
    metadata:
      labels:
        run: my-nginx
    spec:
      containers:
      - image: nginx
        name: my-nginx
        ports:
        - containerPort: 80
        resources:
          limits:
            memory: 512Mi

๋ชจ๋“  ๋ฆฌ์†Œ์Šค ๋˜๋Š” ํ•„๋“œ๊ฐ€ ์ „๋žต์  ๋ณ‘ํ•ฉ ํŒจ์น˜๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ์ž„์˜์˜ ๋ฆฌ์†Œ์Šค ๋‚ด ์ž„์˜์˜ ํ•„๋“œ์˜ ์ˆ˜์ •์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด, Kustomize๋Š” patchesJson6902๋ฅผ ํ†ตํ•œ JSON ํŒจ์น˜ ์ ์šฉ์„ ์ œ๊ณตํ•œ๋‹ค. Json ํŒจ์น˜์˜ ์ •ํ™•ํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด, ํ•ด๋‹น ๋ฆฌ์†Œ์Šค์˜ group, version, kind, name์ด kustomization.yaml ๋‚ด์— ๋ช…์‹œ๋  ํ•„์š”๊ฐ€ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด, patchesJson6902๋ฅผ ํ†ตํ•ด ๋””ํ”Œ๋กœ์ด๋จผํŠธ ์˜ค๋ธŒ์ ํŠธ์˜ ๋ ˆํ”Œ๋ฆฌ์นด ๊ฐœ์ˆ˜๋ฅผ ์ฆ๊ฐ€์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

# deployment.yaml ํŒŒ์ผ ์ƒ์„ฑ
cat <<EOF > deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
spec:
  selector:
    matchLabels:
      run: my-nginx
  replicas: 2
  template:
    metadata:
      labels:
        run: my-nginx
    spec:
      containers:
      - name: my-nginx
        image: nginx
        ports:
        - containerPort: 80
EOF

# json ํŒจ์น˜ ์ƒ์„ฑ
cat <<EOF > patch.yaml
- op: replace
  path: /spec/replicas
  value: 3
EOF

# kustomization.yaml ์ƒ์„ฑ
cat <<EOF >./kustomization.yaml
resources:
- deployment.yaml

patchesJson6902:
- target:
    group: apps
    version: v1
    kind: Deployment
    name: my-nginx
  path: patch.yaml
EOF

kubectl kustomize ./๋ฅผ ์‹คํ–‰ํ•˜์—ฌ replicas ํ•„๋“œ๊ฐ€ ๊ฐฑ์‹ ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      run: my-nginx
  template:
    metadata:
      labels:
        run: my-nginx
    spec:
      containers:
      - image: nginx
        name: my-nginx
        ports:
        - containerPort: 80

ํŒจ์น˜ ๊ธฐ๋Šฅ์— ์ถ”๊ฐ€๋กœ Kustomize๋Š” ํŒจ์น˜๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉ์ž ์ •์˜ํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์˜ค๋ธŒ์ ํŠธ์˜ ํ•„๋“œ ๊ฐ’์„ ์ปจํ…Œ์ด๋„ˆ์— ์ฃผ์ž…ํ•˜๋Š” ๊ธฐ๋Šฅ๋„ ์ œ๊ณตํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด kustomization.yaml์˜ images ํ•„๋“œ์— ์‹ ๊ทœ ์ด๋ฏธ์ง€๋ฅผ ์ง€์ •ํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ด๋ฏธ์ง€๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

cat <<EOF > deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
spec:
  selector:
    matchLabels:
      run: my-nginx
  replicas: 2
  template:
    metadata:
      labels:
        run: my-nginx
    spec:
      containers:
      - name: my-nginx
        image: nginx
        ports:
        - containerPort: 80
EOF

cat <<EOF >./kustomization.yaml
resources:
- deployment.yaml
images:
- name: nginx
  newName: my.image.registry/nginx
  newTag: "1.4.0"
EOF

์‚ฌ์šฉ๋œ ์ด๋ฏธ์ง€๊ฐ€ ๊ฐฑ์‹ ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด kubectl kustomize ./๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      run: my-nginx
  template:
    metadata:
      labels:
        run: my-nginx
    spec:
      containers:
      - image: my.image.registry/nginx:1.4.0
        name: my-nginx
        ports:
        - containerPort: 80

๊ฐ€๋”, ํŒŒ๋“œ ๋‚ด์—์„œ ์‹คํ–‰๋˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋‹ค๋ฅธ ์˜ค๋ธŒ์ ํŠธ์˜ ์„ค์ • ๊ฐ’์„ ์‚ฌ์šฉํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋””ํ”Œ๋กœ์ด๋จผํŠธ ์˜ค๋ธŒ์ ํŠธ์˜ ํŒŒ๋“œ๋Š” Env ๋˜๋Š” ์ปค๋งจ๋“œ ์ธ์ˆ˜๋กœ ํ•ด๋‹น ์„œ๋น„์Šค ๋„ค์ž„์„ ์ฝ์–ด์•ผ ํ•œ๋‹ค๊ณ  ํ•˜์ž. kustomization.yaml ํŒŒ์ผ์— namePrefix ๋˜๋Š” nameSuffix๊ฐ€ ์ถ”๊ฐ€๋˜๋ฉด ์„œ๋น„์Šค ๋„ค์ž„์ด ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๋‹ค. ์ปค๋งจ๋“œ ์ธ์ˆ˜ ๋‚ด์— ์„œ๋น„์Šค ๋„ค์ž„์„ ํ•˜๋“œ ์ฝ”๋”ฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ด ์šฉ๋„์—์„œ Kustomize๋Š” vars๋ฅผ ํ†ตํ•ด containers์— ์„œ๋น„์Šค ๋„ค์ž„์„ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค.

# deployment.yaml ํŒŒ์ผ ์ƒ์„ฑ(๋ฌธ์„œ ๊ตฌ๋ถ„ ๊ธฐํ˜ธ๋ฅผ ๋”ฐ์˜ดํ‘œ๋กœ ๊ฐ์Œˆ)
cat <<'EOF' > deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
spec:
  selector:
    matchLabels:
      run: my-nginx
  replicas: 2
  template:
    metadata:
      labels:
        run: my-nginx
    spec:
      containers:
      - name: my-nginx
        image: nginx
        command: ["start", "--host", "$(MY_SERVICE_NAME)"]
EOF

# service.yaml ํŒŒ์ผ ์ƒ์„ฑ
cat <<EOF > service.yaml
apiVersion: v1
kind: Service
metadata:
  name: my-nginx
  labels:
    run: my-nginx
spec:
  ports:
  - port: 80
    protocol: TCP
  selector:
    run: my-nginx
EOF

cat <<EOF >./kustomization.yaml
namePrefix: dev-
nameSuffix: "-001"

resources:
- deployment.yaml
- service.yaml

vars:
- name: MY_SERVICE_NAME
  objref:
    kind: Service
    name: my-nginx
    apiVersion: v1
EOF

kubectl kustomize ./๋ฅผ ์‹คํ–‰ํ•˜๋ฉด dev-my-nginx-001๋กœ ์ปจํ…Œ์ด๋„ˆ์— ์‚ฝ์ž…๋œ ์„œ๋น„์Šค ๋„ค์ž„์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: dev-my-nginx-001
spec:
  replicas: 2
  selector:
    matchLabels:
      run: my-nginx
  template:
    metadata:
      labels:
        run: my-nginx
    spec:
      containers:
      - command:
        - start
        - --host
        - dev-my-nginx-001
        image: nginx
        name: my-nginx

Base์™€ Overlay

Kustomize๋Š” base ์™€ overlay ์˜ ๊ฐœ๋…์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. base ๋Š” kustomization.yaml ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ๋‹ค. ์ด๋Š” ์‚ฌ์šฉ์ž ์ •์˜์™€ ๊ด€๋ จ๋œ ๋ฆฌ์†Œ์Šค๋“ค์˜ ์ง‘ํ•ฉ์„ ํฌํ•จํ•œ๋‹ค. kustomization.yaml์˜ ๋‚ด๋ถ€์— ํ‘œ์‹œ๋˜๋Š” base๋Š” ๋กœ์ปฌ ๋””๋ ‰ํ„ฐ๋ฆฌ์ด๊ฑฐ๋‚˜ ์›๊ฒฉ ๋ฆฌํฌ์ง€ํ„ฐ๋ฆฌ์˜ ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค. overlay ๋Š” kustomization.yaml์ด ์žˆ๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ๋‹ค๋ฅธ kustomization ๋””๋ ‰ํ„ฐ๋ฆฌ๋“ค์„ bases๋กœ ์ฐธ์กฐํ•œ๋‹ค. base ๋Š” overlay์— ๋Œ€ํ•ด์„œ ์•Œ์ง€ ๋ชปํ•˜๋ฉฐ ์—ฌ๋Ÿฌ overlay๋“ค์—์„œ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค. ํ•œ overlay๋Š” ๋‹ค์ˆ˜์˜ base๋“ค์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ณ , base๋“ค์—์„œ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋“ค์˜ ์œ„์— ์‚ฌ์šฉ์ž ์ •์˜๋„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.

๋‹ค์Œ์€ base์— ๋Œ€ํ•œ ์˜ˆ์ด๋‹ค.

# base๋ฅผ ๊ฐ€์ง€๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ ์ƒ์„ฑ
mkdir base
# base/deployment.yaml ์ƒ์„ฑ
cat <<EOF > base/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
spec:
  selector:
    matchLabels:
      run: my-nginx
  replicas: 2
  template:
    metadata:
      labels:
        run: my-nginx
    spec:
      containers:
      - name: my-nginx
        image: nginx
EOF

# base/service.yaml ํŒŒ์ผ ์ƒ์„ฑ
cat <<EOF > base/service.yaml
apiVersion: v1
kind: Service
metadata:
  name: my-nginx
  labels:
    run: my-nginx
spec:
  ports:
  - port: 80
    protocol: TCP
  selector:
    run: my-nginx
EOF
# base/kustomization.yaml ์ƒ์„ฑ
cat <<EOF > base/kustomization.yaml
resources:
- deployment.yaml
- service.yaml
EOF

์ด base๋Š” ๋‹ค์ˆ˜์˜ overlay์—์„œ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค. ๋‹ค๋ฅธ namePrefix ๋˜๋Š” ๋‹ค๋ฅธ ๊ต์ฐจ ํŽธ์ง‘ ํ•„๋“œ๋“ค์„ ์„œ๋กœ ๋‹ค๋ฅธ overlay์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹ค์Œ ์˜ˆ์ œ๋Š” ๋™์ผํ•œ base๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋‘ overlay๋“ค์ด๋‹ค.

mkdir dev
cat <<EOF > dev/kustomization.yaml
resources:
- ../base
namePrefix: dev-
EOF

mkdir prod
cat <<EOF > prod/kustomization.yaml
resources:
- ../base
namePrefix: prod-
EOF

Kustomize๋ฅผ ์ด์šฉํ•˜์—ฌ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ ์šฉ/ํ™•์ธ/์‚ญ์ œํ•˜๋Š” ๋ฐฉ๋ฒ•

kustomization.yaml์—์„œ ๊ด€๋ฆฌ๋˜๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ์ธ์‹ํ•˜๋ ค๋ฉด kubectl ๋ช…๋ น์–ด์— --kustomize ๋‚˜ -k๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. -k๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด kustomization ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์ฃผ์˜ํ•œ๋‹ค.

kubectl apply -k <kustomization directory>/

๋‹ค์Œ kustomization.yaml์ด ์ฃผ์–ด์ง€๊ณ ,

# deployment.yaml ํŒŒ์ผ ์ƒ์„ฑ
cat <<EOF > deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
spec:
  selector:
    matchLabels:
      run: my-nginx
  replicas: 2
  template:
    metadata:
      labels:
        run: my-nginx
    spec:
      containers:
      - name: my-nginx
        image: nginx
        ports:
        - containerPort: 80
EOF

# kustomization.yaml ์ƒ์„ฑ
cat <<EOF >./kustomization.yaml
namePrefix: dev-
commonLabels:
  app: my-nginx
resources:
- deployment.yaml
EOF

๋””ํ”Œ๋กœ์ด๋จผํŠธ ์˜ค๋ธŒ์ ํŠธ dev-my-nginx๋ฅผ ์ ์šฉํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

> kubectl apply -k ./
deployment.apps/dev-my-nginx created

๋””ํ”Œ๋กœ์ด๋จผํŠธ ์˜ค๋ธŒ์ ํŠธ dev-my-nginx๋ฅผ ๋ณด๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋“ค ์ค‘์— ํ•˜๋‚˜๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

kubectl get -k ./
kubectl describe -k ./

๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•ด์„œ ๋””ํ”Œ๋กœ์ด๋จผํŠธ ์˜ค๋ธŒ์ ํŠธ dev-my-nginx ๋ฅผ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๊ฐ€ ์ ์šฉ๋œ ๊ฒฝ์šฐ์˜ ํด๋Ÿฌ์Šคํ„ฐ ์ƒํƒœ์™€ ๋น„๊ตํ•œ๋‹ค.

kubectl diff -k ./

๋””ํ”Œ๋กœ์ด๋จผํŠธ ์˜ค๋ธŒ์ ํŠธ dev-my-nginx๋ฅผ ์‚ญ์ œํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

> kubectl delete -k ./
deployment.apps "dev-my-nginx" deleted

Kustomize ๊ธฐ๋Šฅ ๋ฆฌ์ŠคํŠธ

ํ•„๋“œ์œ ํ˜•์„ค๋ช…
namespacestring๋ชจ๋“  ๋ฆฌ์†Œ์Šค์— ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ถ”๊ฐ€
namePrefixstring๋ชจ๋“  ๋ฆฌ์†Œ์Šค ๋„ค์ž„์— ์ด ํ•„๋“œ์˜ ๊ฐ’์ด ์ ‘๋‘์‚ฌ๋กœ ์ถ”๊ฐ€๋œ๋‹ค
nameSuffixstring๋ชจ๋“  ๋ฆฌ์†Œ์Šค ๋„ค์ž„์— ์ด ํ•„๋“œ์˜ ๊ฐ’์ด ์ ‘๋ฏธ์‚ฌ๋กœ ์ถ”๊ฐ€๋œ๋‹ค
commonLabelsmap[string]string๋ชจ๋“  ๋ฆฌ์†Œ์Šค์™€ ์…€๋ ‰ํ„ฐ์— ์ถ”๊ฐ€๋  ๋ ˆ์ด๋ธ”
commonAnnotationsmap[string]string๋ชจ๋“  ๋ฆฌ์†Œ์Šค์— ์ถ”๊ฐ€๋  ์–ด๋…ธํ…Œ์ด์…˜
resources[]string์ด ๋ฆฌ์ŠคํŠธ ๋‚ด ๊ฐ๊ฐ์˜ ํ•ญ๋ชฉ์€ ๋ฐ˜๋“œ์‹œ ์กด์žฌํ•˜๋Š” ๋ฆฌ์†Œ์Šค ๊ตฌ์„ฑ ํŒŒ์ผ๋กœ ํ•ด์„๋˜์–ด์•ผ ํ•œ๋‹ค.
configMapGenerator[]ConfigMapArgs์ด ๋ฆฌ์ŠคํŠธ์˜ ๊ฐ ํ•ญ๋ชฉ์€ ์ปจํ”ผ๊ทธ๋งต์„ ์ƒ์„ฑํ•œ๋‹ค.
secretGenerator[]SecretArgs์ด ๋ฆฌ์ŠคํŠธ์˜ ๊ฐ ํ•ญ๋ชฉ์€ ์‹œํฌ๋ฆฟ์„ ์ƒ์„ฑํ•œ๋‹ค.
generatorOptionsGeneratorOptions๋ชจ๋“  ์ปจํ”ผ๊ทธ๋งต ๋ฐ ์‹œํฌ๋ฆฟ ์ƒ์„ฑ์ž(generator)์˜ ๋™์ž‘์„ ์ˆ˜์ •ํ•œ๋‹ค.
bases[]string์ด ๋ฆฌ์ŠคํŠธ ๋‚ด ๊ฐ๊ฐ์˜ ํ•ญ๋ชฉ์€ kustomization.yaml ํŒŒ์ผ์„ ๊ฐ€์ง€๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ํ•ด์„๋˜์–ด์•ผ ํ•œ๋‹ค.
patchesStrategicMerge[]string์ด ๋ฆฌ์ŠคํŠธ ๋‚ด ๊ฐ๊ฐ์˜ ํ•ญ๋ชฉ์€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜ค๋ธŒ์ ํŠธ์˜ ์ „๋žต์  ๋ณ‘ํ•ฉ ํŒจ์น˜๋กœ ํ•ด์„๋˜์–ด์•ผ ํ•œ๋‹ค.
patchesJson6902[]Patch์ด ๋ฆฌ์ŠคํŠธ ๋‚ด ๊ฐ๊ฐ์˜ ํ•ญ๋ชฉ์€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜ค๋ธŒ์ ํŠธ์™€ Json ํŒจ์น˜๋กœ ํ•ด์„๋˜์–ด์•ผ ํ•œ๋‹ค.
vars[]Var๊ฐ๊ฐ์˜ ํ•ญ๋ชฉ์€ ํ•œ ๋ฆฌ์†Œ์Šค์˜ ํ•„๋“œ์—์„œ ํ…์ŠคํŠธ๋ฅผ ์บก์ณํ•œ๋‹ค.
images[]Image๊ฐ๊ฐ์˜ ํ•ญ๋ชฉ์€ ํŒจ์น˜๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ํ•˜๋‚˜์˜ ์ด๋ฏธ์ง€์— ๋Œ€ํ•œ name, tags ๊ทธ๋ฆฌ๊ณ /๋˜๋Š” digest๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค.
configurations[]string์ด ๋ฆฌ์ŠคํŠธ ๋‚ด ๊ฐ๊ฐ์˜ ํ•ญ๋ชฉ์€ Kustomize ๋ณ€ํ™˜ ์„ค์ •์„ ํฌํ•จํ•˜๋Š” ํŒŒ์ผ๋กœ ํ•ด์„๋˜์–ด์•ผ ํ•œ๋‹ค.
crds[]string์ด ๋ฆฌ์ŠคํŠธ ๋‚ด ๊ฐ๊ฐ์˜ ํ•ญ๋ชฉ์€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํƒ€์ž…์— ๋Œ€ํ•œ OpenAPI ์ •์˜ ํŒŒ์ผ๋กœ ํ•ด์„๋˜์–ด์•ผ ํ•œ๋‹ค.

๋‹ค์Œ ๋‚ด์šฉ

3 - ๋ช…๋ นํ˜• ์ปค๋งจ๋“œ๋ฅผ ์ด์šฉํ•œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜ค๋ธŒ์ ํŠธ ๊ด€๋ฆฌํ•˜๊ธฐ

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜ค๋ธŒ์ ํŠธ๋Š” kubectl ์ปค๋งจ๋“œ ๋ผ์ธ ํˆด ์†์— ๋‚ด์žฅ๋œ ๋ช…๋ นํ˜• ์ปค๋งจ๋“œ๋ฅผ ์ด์šฉํ•จ์œผ๋กœ์จ ๋ฐ”๋กœ ์‹ ์†ํ•˜๊ฒŒ ์ƒ์„ฑ, ์—…๋ฐ์ดํŠธ ๋ฐ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๋ฌธ์„œ๋Š” ์–ด๋–ป๊ฒŒ ์ปค๋งจ๋“œ๊ฐ€ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ™œ์„ฑ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ด€๋ฆฌํ•˜๋Š” ์ง€์— ๋Œ€ํ•ด ์„ค๋ช…ํ•œ๋‹ค.

์‹œ์ž‘ํ•˜๊ธฐ ์ „์—

kubectl์„ ์„ค์น˜ํ•œ๋‹ค.

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ํ•„์š”ํ•˜๊ณ , kubectl ์ปค๋งจ๋“œ-๋ผ์ธ ํˆด์ด ํด๋Ÿฌ์Šคํ„ฐ์™€ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์ด ํŠœํ† ๋ฆฌ์–ผ์€ ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ํ˜ธ์ŠคํŠธ๊ฐ€ ์•„๋‹Œ ๋…ธ๋“œ๊ฐ€ ์ ์–ด๋„ 2๊ฐœ ํฌํ•จ๋œ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•œ๋‹ค. ๋งŒ์•ฝ, ์•„์ง ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๋‹ค๋ฉด, minikube๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ๋‹ค์Œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํ”Œ๋ ˆ์ด๊ทธ๋ผ์šด๋“œ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฒ„์ „ ํ™•์ธ์„ ์œ„ํ•ด์„œ, ๋‹ค์Œ ์ปค๋งจ๋“œ๋ฅผ ์‹คํ–‰ kubectl version.

ํŠธ๋ ˆ์ด๋“œ ์˜คํ”„

kubectlํˆด์€ 3๊ฐ€์ง€ ์ข…๋ฅ˜์˜ ์˜ค๋ธŒ์ ํŠธ ๊ด€๋ฆฌ๋ฅผ ์ง€์›ํ•œ๋‹ค.

  • ๋ช…๋ นํ˜• ์ปค๋งจ๋“œ
  • ๋ช…๋ นํ˜• ์˜ค๋ธŒ์ ํŠธ ๊ตฌ์„ฑ
  • ์„ ์–ธํ˜• ์˜ค๋ธŒ์ ํŠธ ๊ตฌ์„ฑ

๊ฐ ์ข…๋ฅ˜๋ณ„ ์˜ค๋ธŒ์ ํŠธ ๊ด€๋ฆฌ์˜ ์žฅ์ ๊ณผ ๋‹จ์ ์— ๋Œ€ํ•œ ๋…ผ์˜๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜ค๋ธŒ์ ํŠธ ๊ด€๋ฆฌ ๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.

์˜ค๋ธŒ์ ํŠธ ์ƒ์„ฑ ๋ฐฉ๋ฒ•

kubectl ํˆด์€ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ์˜ค๋ธŒ์ ํŠธ ํƒ€์ž…์„ ์ƒ์„ฑํ•˜๋Š”๋ฐ ๋™์‚ฌ ํ˜•ํƒœ ๊ธฐ๋ฐ˜์˜ ์ปค๋งจ๋“œ๋ฅผ ์ง€์›ํ•œ๋‹ค. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜ค๋ธŒ์ ํŠธ ํƒ€์ž…์— ์ต์ˆ™ํ•˜์ง€ ์•Š์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ธ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ปค๋งจ๋“œ ์ด๋ฆ„์ด ์ง€์–ด์กŒ๋‹ค.

  • run: ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•  ์ƒˆ๋กœ์šด ํŒŒ๋“œ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
  • expose: ํŒŒ๋“œ์— ๊ฑธ์ณ ํŠธ๋ž˜ํ”ฝ์„ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์Šคํ•˜๋„๋ก ์ƒˆ๋กœ์šด ์„œ๋น„์Šค ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
  • autoscale: ๋””ํ”Œ๋กœ์ด๋จผํŠธ์™€ ๊ฐ™์ด, ํ•˜๋‚˜์˜ ์ปจํŠธ๋กค๋Ÿฌ์— ๋Œ€ํ•ด ์ž๋™์œผ๋กœ ์ˆ˜ํ‰์  ์Šค์ผ€์ผ์ด ์ด๋ฃจ์–ด ์ง€๋„๋ก ์ƒˆ๋กœ์šด Autoscaler ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

๋˜ํ•œ kubectl ํˆด์€ ์˜ค๋ธŒ์ ํŠธ ํƒ€์ž…์— ์˜ํ•ด ๊ตฌ๋™๋˜๋Š” ์ƒ์„ฑ ์ปค๋งจ๋“œ๋ฅผ ์ง€์›ํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ์ปค๋งจ๋“œ๋Š” ๋” ๋งŽ์€ ์˜ค๋ธŒ์ ํŠธ ํƒ€์ž…์„ ์ง€์›ํ•ด์ฃผ๋ฉฐ ๊ทธ ์˜๋„ํ•˜๋Š” ๋ฐ”์— ๋Œ€ํ•ด ๋ณด๋‹ค ๋ช…ํ™•ํ•˜๊ฒŒ ํ•ด์ฃผ์ง€๋งŒ, ์‚ฌ์šฉ์ž๊ฐ€ ์ƒ์„ฑํ•˜๊ณ ์ž ํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ ํƒ€์ž…์— ๋Œ€ํ•ด ์•Œ ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผ ํ•œ๋‹ค.

  • create <์˜ค๋ธŒ์ ํŠธ ํƒ€์ž…> [<์„œ๋ธŒ ํƒ€์ž…>] <์ธ์Šคํ„ด์Šค๋ช…>

์ผ๋ถ€ ์˜ค๋ธŒ์ ํŠธ ํƒ€์ž…์€ create ์ปค๋งจ๋“œ ๋‚ด ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š” ์„œ๋ธŒ ํƒ€์ž…์„ ๊ฐ€์ง„๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์„œ๋น„์Šค ์˜ค๋ธŒ์ ํŠธ๋Š” ClusterIP, LoadBalancer ๋ฐ NodePort ๋“ฑ์„ ํฌํ•จํ•˜๋Š” ์—ฌ๋Ÿฌ ์„œ๋ธŒ ํƒ€์ž…์„ ๊ฐ€์ง„๋‹ค, ๋‹ค์Œ์€ NodePort ์„œ๋ธŒ ํƒ€์ž…์„ ํ†ตํ•ด ์„œ๋น„์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์˜ˆ์ œ์ด๋‹ค.

kubectl create service nodeport <์‚ฌ์šฉ์ž ์„œ๋น„์Šค ๋ช…์นญ>

์ด์ „ ์˜ˆ์ œ์—์„œ, create service nodeport ์ปค๋งจ๋“œ๋Š” create service ์ปค๋งจ๋“œ์˜ ์„œ๋ธŒ ์ปค๋งจ๋“œ๋ผ๊ณ  ์นญํ•œ๋‹ค.

-h ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ธŒ ์ปค๋งจ๋“œ์— ์˜ํ•ด ์ง€์›๋˜๋Š” ์ธ์ˆ˜ ๋ฐ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ฐพ์•„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

kubectl create service nodeport -h

์˜ค๋ธŒ์ ํŠธ ์—…๋ฐ์ดํŠธ ๋ฐฉ๋ฒ•

kubectl ์ปค๋งจ๋“œ๋Š” ์ผ๋ฐ˜์ ์ธ ๋ช‡๋ช‡์˜ ์—…๋ฐ์ดํŠธ ์ž‘์—…์„ ์œ„ํ•ด ๋™์‚ฌ ํ˜•ํƒœ ๊ธฐ๋ฐ˜์˜ ์ปค๋งจ๋“œ๋ฅผ ์ง€์›ํ•œ๋‹ค. ์ด ์ปค๋งจ๋“œ๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜ค๋ธŒ์ ํŠธ์— ์ต์ˆ™ํ•˜์ง€ ์•Š์€ ์‚ฌ์šฉ์ž๊ฐ€ ์„ค์ •๋˜์–ด์•ผ ํ•˜๋Š” ํŠน์ • ํ•„๋“œ๋ฅผ ๋ชจ๋ฅด๋Š” ์ƒํƒœ์—์„œ๋„ ์—…๋ฐ์ดํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ด๋ฆ„ ์ง€์–ด์กŒ๋‹ค.

  • scale: ์ปจํŠธ๋กค๋Ÿฌ์˜ ๋ ˆํ”Œ๋ฆฌ์นด ์ˆ˜๋ฅผ ์—…๋ฐ์ดํŠธ ํ•จ์œผ๋กœ์จ ํŒŒ๋“œ๋ฅผ ์ถ”๊ฐ€ ๋˜๋Š” ์ œ๊ฑฐํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ˆ˜ํ‰์ ์œผ๋กœ ์Šค์ผ€์ผํ•œ๋‹ค.
  • annotate: ์˜ค๋ธŒ์ ํŠธ๋กœ๋ถ€ํ„ฐ ์–ด๋…ธํ…Œ์ด์…˜์„ ์ถ”๊ฐ€ ๋˜๋Š” ์ œ๊ฑฐํ•œ๋‹ค.
  • label: ์˜ค๋ธŒ์ ํŠธ์—์„œ ๋ ˆ์ด๋ธ”์„ ์ถ”๊ฐ€ ๋˜๋Š” ์ œ๊ฑฐํ•œ๋‹ค.

kubectl ์ปค๋งจ๋“œ๋Š” ๋˜ํ•œ ์˜ค๋ธŒ์ ํŠธ ์ธก๋ฉด์—์„œ ๊ตฌ๋™๋˜๋Š” ์—…๋ฐ์ดํŠธ ์ปค๋งจ๋“œ๋ฅผ ์ง€์›ํ•œ๋‹ค. ์ด ์ธก๋ฉด์˜ ์„ค์ •์€ ๋‹ค๋ฅธ ์˜ค๋ธŒ์ ํŠธ ํƒ€์ž…์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ํ•„๋“œ๋ฅผ ์„ค์ • ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

  • set <field>: ์˜ค๋ธŒ์ ํŠธ์˜ ์ธก๋ฉด์„ ์„ค์ •ํ•œ๋‹ค.

kubectl ํˆด์€ ํ™œ์„ฑ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ง์ ‘ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€์ ์ธ ๋ฐฉ๋ฒ•์„ ์ง€์›ํ•˜์ง€๋งŒ, ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜ค๋ธŒ์ ํŠธ ์Šคํ‚ค๋งˆ์— ๋Œ€ํ•œ ์ถ”๊ฐ€์ ์ธ ์ดํ•ด๋ฅผ ์š”๊ตฌํ•œ๋‹ค.

  • edit: ํŽธ์ง‘๊ธฐ์—์„œ ๊ตฌ์„ฑ์„ ์—ด์–ด ํ™œ์„ฑ ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•œ ์›๋ž˜ ๊ทธ๋Œ€๋กœ์˜ ๊ตฌ์„ฑ์„ ๋ฐ”๋กœ ํŽธ์ง‘ํ•œ๋‹ค.
  • patch: ํŒจ์น˜ ๋ฌธ์ž์—ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ™œ์„ฑ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋ฐ”๋กœ ํŽธ์ง‘ํ•œ๋‹ค. ํŒจ์น˜ ๋ฌธ์ž์—ด์— ๋Œ€ํ•œ ๋ณด๋‹ค ์ž์„ธํ•œ ์ •๋ณด๋ฅผ ๋ณด๋ ค๋ฉด API ๊ทœ์ •์—์„œ ํŒจ์น˜ ์„น์…˜์„ ์ฐธ๊ณ ํ•œ๋‹ค.

์˜ค๋ธŒ์ ํŠธ ์‚ญ์ œ ๋ฐฉ๋ฒ•

ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ญ์ œํ•˜๊ธฐ ์œ„ํ•ด delete ์ปค๋งจ๋“œ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  • delete <ํƒ€์ž…>/<์ด๋ฆ„>
kubectl delete deployment/nginx

์˜ค๋ธŒ์ ํŠธ ํ™•์ธ ๋ฐฉ๋ฒ•

์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์ปค๋งจ๋“œ๊ฐ€ ์žˆ๋‹ค.

  • get: ์ผ์น˜ํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ์˜ต์…˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด get -h๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • describe: ์ผ์น˜ํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•ด ์ˆ˜์ง‘ํ•œ ์ƒ์„ธํ•œ ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
  • logs: ํŒŒ๋“œ์—์„œ ์‹คํ–‰ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•œ stdout๊ณผ stderr๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

์ƒ์„ฑ ์ „ ์˜ค๋ธŒ์ ํŠธ ์ˆ˜์ •์„ ์œ„ํ•ด set ์ปค๋งจ๋“œ ์‚ฌ์šฉํ•˜๊ธฐ

create ์ปค๋งจ๋“œ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ”Œ๋ž˜๊ทธ๊ฐ€ ์—†๋Š” ๋ช‡ ๊ฐ€์ง€ ์˜ค๋ธŒ์ ํŠธ ํ•„๋“œ๊ฐ€ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ, ์˜ค๋ธŒ์ ํŠธ ์ƒ์„ฑ ์ „์— ํ•„๋“œ์— ๋Œ€ํ•œ ๊ฐ’์„ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด set๊ณผ create์„ ์กฐํ•ฉํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” set ์ปค๋งจ๋“œ์— create ์ปค๋งจ๋“œ์˜ ์ถœ๋ ฅ์„ ํŒŒ์ดํ”„ ํ•จ์œผ๋กœ์จ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹ค์Œ์€ ๊ด€๋ จ ์˜ˆ์ œ์ด๋‹ค.

kubectl create service clusterip my-svc --clusterip="None" -o yaml --dry-run=client | kubectl set selector --local -f - 'environment=qa' -o yaml | kubectl create -f -
  1. kubectl create service -o yaml --dry-run=client ์ปค๋งจ๋“œ๋Š” ์„œ๋น„์Šค์— ๋Œ€ํ•œ ๊ตฌ์„ฑ์„ ์ƒ์„ฑํ•˜์ง€๋งŒ, ์ด๋ฅผ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API ์„œ๋ฒ„์— ์ „์†กํ•˜๋Š” ๋Œ€์‹  YAML ํ˜•์‹์œผ๋กœ stdout์— ์ถœ๋ ฅํ•œ๋‹ค.
  2. kubectl set selector --local -f - -o yaml ์ปค๋งจ๋“œ๋Š” stdin์œผ๋กœ๋ถ€ํ„ฐ ๊ตฌ์„ฑ์„ ์ฝ์–ด, YAML ํ˜•์‹์œผ๋กœ stdout์— ์—…๋ฐ์ดํŠธ๋œ ๊ตฌ์„ฑ์„ ๊ธฐ๋กํ•œ๋‹ค.
  3. kubectl create -f - ์ปค๋งจ๋“œ๋Š” stdin์„ ํ†ตํ•ด ์ œ๊ณต๋œ ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

์ƒ์„ฑ ์ „ ์˜ค๋ธŒ์ ํŠธ ์ˆ˜์ •์„ ์œ„ํ•ด --edit ์‚ฌ์šฉํ•˜๊ธฐ

์ƒ์„ฑ ์ „์— ์˜ค๋ธŒ์ ํŠธ์— ์ž„์˜์˜ ๋ณ€๊ฒฝ์„ ๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด kubectl create --edit ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹ค์Œ์€ ๊ด€๋ จ ์˜ˆ์ œ์ด๋‹ค.

kubectl create service clusterip my-svc --clusterip="None" -o yaml --dry-run=client > /tmp/srv.yaml
kubectl create --edit -f /tmp/srv.yaml
  1. kubectl create service ์ปค๋งจ๋“œ๋Š” ์„œ๋น„์Šค์— ๋Œ€ํ•œ ๊ตฌ์„ฑ์„ ์ƒ์„ฑํ•˜๊ณ  ์ด๋ฅผ /tmp/srv.yaml์— ์ €์žฅํ•œ๋‹ค.
  2. kubectl create --edit ์ปค๋งจ๋“œ๋Š” ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์ „์— ํŽธ์ง‘์„ ์œ„ํ•ด ๊ตฌ์„ฑ ํŒŒ์ผ์„ ์—ด์–ด์ค€๋‹ค.

๋‹ค์Œ ๋‚ด์šฉ

4 - ๊ตฌ์„ฑ ํŒŒ์ผ์„ ์ด์šฉํ•œ ๋ช…๋ นํ˜• ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜ค๋ธŒ์ ํŠธ ๊ด€๋ฆฌ

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜ค๋ธŒ์ ํŠธ๋Š” YAML ๋˜๋Š” JSON์œผ๋กœ ์ž‘์„ฑ๋œ ์˜คํ”„์ ํŠธ ๊ตฌ์„ฑ ํŒŒ์ผ๊ณผ ํ•จ๊ป˜ kubectl ์ปค๋งจ๋“œ ๋ผ์ธ ํˆด์„ ์ด์šฉํ•˜์—ฌ ์ƒ์„ฑ, ์—…๋ฐ์ดํŠธ ๋ฐ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๋ฌธ์„œ๋Š” ๊ตฌ์„ฑ ํŒŒ์ผ์„ ์ด์šฉํ•˜์—ฌ ์–ด๋–ป๊ฒŒ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ •์˜ํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•ด ์„ค๋ช…ํ•œ๋‹ค.

์‹œ์ž‘ํ•˜๊ธฐ ์ „์—

kubectl์„ ์„ค์น˜ํ•œ๋‹ค.

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ํ•„์š”ํ•˜๊ณ , kubectl ์ปค๋งจ๋“œ-๋ผ์ธ ํˆด์ด ํด๋Ÿฌ์Šคํ„ฐ์™€ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์ด ํŠœํ† ๋ฆฌ์–ผ์€ ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ํ˜ธ์ŠคํŠธ๊ฐ€ ์•„๋‹Œ ๋…ธ๋“œ๊ฐ€ ์ ์–ด๋„ 2๊ฐœ ํฌํ•จ๋œ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•œ๋‹ค. ๋งŒ์•ฝ, ์•„์ง ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๋‹ค๋ฉด, minikube๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ๋‹ค์Œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํ”Œ๋ ˆ์ด๊ทธ๋ผ์šด๋“œ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฒ„์ „ ํ™•์ธ์„ ์œ„ํ•ด์„œ, ๋‹ค์Œ ์ปค๋งจ๋“œ๋ฅผ ์‹คํ–‰ kubectl version.

ํŠธ๋ ˆ์ด๋“œ ์˜คํ”„

kubectl ํˆด์€ 3๊ฐ€์ง€ ์ข…๋ฅ˜์˜ ์˜ค๋ธŒ์ ํŠธ ๊ด€๋ฆฌ๋ฅผ ์ง€์›ํ•œ๋‹ค.

  • ๋ช…๋ นํ˜• ์ปค๋งจ๋“œ
  • ๋ช…๋ นํ˜• ์˜ค๋ธŒ์ ํŠธ ๊ตฌ์„ฑ
  • ์„ ์–ธํ˜• ์˜ค๋ธŒ์ ํŠธ ๊ตฌ์„ฑ

๊ฐ ์ข…๋ฅ˜๋ณ„ ์˜ค๋ธŒ์ ํŠธ ๊ด€๋ฆฌ์˜ ์žฅ์ ๊ณผ ๋‹จ์ ์— ๋Œ€ํ•œ ๋…ผ์˜๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜ค๋ธŒ์ ํŠธ ๊ด€๋ฆฌ๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.

์˜ค๋ธŒ์ ํŠธ ์ƒ์„ฑ ๋ฐฉ๋ฒ•

๊ตฌ์„ฑ ํŒŒ์ผ๋กœ๋ถ€ํ„ฐ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด kubectl create -f๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ณด๋‹ค ์ƒ์„ธํ•œ ์ •๋ณด๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API ์ฐธ์กฐ๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.

  • kubectl create -f <ํŒŒ์ผ๋ช…|url>

์˜ค๋ธŒ์ ํŠธ ์—…๋ฐ์ดํŠธ ๋ฐฉ๋ฒ•

๊ตฌ์„ฑ ํŒŒ์ผ์— ๋”ฐ๋ผ ํ™œ์„ฑ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ์œ„ํ•ด kubectl replace -f ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  • kubectl replace -f <ํŒŒ์ผ๋ช…|url>

์˜ค๋ธŒ์ ํŠธ ์‚ญ์ œ ๋ฐฉ๋ฒ•

๊ตฌ์„ฑ ํŒŒ์ผ์— ์ •์˜ํ•œ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ญ์ œํ•˜๊ธฐ ์œ„ํ•ด kubectl delete -f๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  • kubectl delete -f <ํŒŒ์ผ๋ช…|url>

์˜ค๋ธŒ์ ํŠธ ํ™•์ธ ๋ฐฉ๋ฒ•

๊ตฌ์„ฑ ํŒŒ์ผ์— ์ •์˜ํ•œ ์˜ค๋ธŒ์ ํŠธ์— ๊ด€ํ•œ ์ •๋ณด ํ™•์ธ์„ ์œ„ํ•ด kubectl get -f ๋ช…๋ น์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  • kubectl get -f <ํŒŒ์ผ๋ช…|url> -o yaml

-o yaml ํ”Œ๋ž˜๊ทธ๋Š” ์ „์ฒด ์˜ค๋ธŒ์ ํŠธ ๊ตฌ์„ฑ์ด ์ถœ๋ ฅ๋˜๋„๋ก ์ •์˜ํ•œ๋‹ค. ์˜ต์…˜์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” kubectl get -h๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

์ œ์•ฝ์‚ฌํ•ญ

create, replace, ๊ทธ๋ฆฌ๊ณ  delete ๋ช…๋ น์€ ๊ฐ ์˜ค๋ธŒ์ ํŠธ์˜ ๊ตฌ์„ฑ์ด ๊ทธ ๊ตฌ์„ฑ ํŒŒ์ผ ๋‚ด์— ์™„์ „ํ•˜๊ฒŒ ์ •์˜๋˜๊ณ  ๊ธฐ๋ก๋˜์–ด์งˆ ๊ฒฝ์šฐ ์ž˜ ๋™์ž‘ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ™œ์„ฑ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์—…๋ฐ์ดํŠธ ๋˜๊ณ , ๊ตฌ์„ฑ ํŒŒ์ผ ์•ˆ์— ๋ณ‘ํ•ฉ๋˜์ง€ ์•Š์œผ๋ฉด, ์—…๋ฐ์ดํŠธ ๋‚ด์šฉ์€ ๋‹ค์Œ๋ฒˆ replace๊ฐ€ ์‹คํ–‰๋  ๋•Œ ์‚ญ์ œ๋  ๊ฒƒ์ด๋‹ค. ์ด๋Š” HorizontalPodAutoscaler์™€ ๊ฐ™์€ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ํ™œ์„ฑ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ง์ ‘์ ์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๋„๋ก ํ•  ๊ฒฝ์šฐ ๋ฐœ์ƒํ•œ๋‹ค. ์—ฌ๊ธฐ ์˜ˆ์‹œ๊ฐ€ ์žˆ๋‹ค.

  1. ๊ตฌ์„ฑ ํŒŒ์ผ๋กœ๋ถ€ํ„ฐ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•  ๊ฒฝ์šฐ
  2. ๋˜ ๋‹ค๋ฅธ ์†Œ์Šค๊ฐ€ ์ผ๋ถ€ ํ•„๋“œ๋ฅผ ๋ณ€๊ฒฝํ•จ์œผ๋กœ์จ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์—…๋ฐ์ดํŠธ ๋˜๋Š” ๊ฒฝ์šฐ
  3. ๊ตฌ์„ฑ ํŒŒ์ผ๋กœ๋ถ€ํ„ฐ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋Œ€์ฒดํ•  ๊ฒฝ์šฐ. ์Šคํ… 2์—์„œ์˜ ๋‹ค๋ฅธ ์†Œ์Šค์— ์˜ํ•ด ์ด๋ฃจ์–ด์ง„ ๋ณ€๊ฒฝ์€ ์œ ์‹ค๋œ๋‹ค.

๋™์ผ ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•ด ์—ฌ๋Ÿฌ ๋ช…์˜ ์ž‘์„ฑ์ž๋“ค๋กœ๋ถ€ํ„ฐ์˜ ์ง€์›์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ, ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด kubectl apply๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ตฌ์„ฑ ์ €์žฅ ์—†์ด URL๋กœ๋ถ€ํ„ฐ ์˜ค๋ธŒ์ ํŠธ ์ƒ์„ฑ๊ณผ ํŽธ์ง‘ํ•˜๊ธฐ

๊ตฌ์„ฑ ํŒŒ์ผ์— ๋Œ€ํ•œ URL์„ ๊ฐ€์ง„๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž. kubectl create --edit์„ ์‚ฌ์šฉํ•˜์—ฌ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์ƒ์„ฑ๋˜๊ธฐ ์ „์— ๊ตฌ์„ฑ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ๋…์ž๊ฐ€ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์„ฑ ํŒŒ์ผ์„ ๊ฐ€๋ฅดํ‚ค๋Š” ํŠœํ† ๋ฆฌ์–ผ๊ณผ ์ž‘์—…์— ํŠนํžˆ ์œ ์šฉํ•˜๋‹ค.

kubectl create -f <url> --edit

๋ช…๋ นํ˜• ์ปค๋งจ๋“œ์—์„œ ๋ช…๋ นํ˜• ์˜ค๋ธŒ์ ํŠธ ๊ตฌ์„ฑ์œผ๋กœ ์ „ํ™˜ํ•˜๊ธฐ

๋ นํ˜• ์ปค๋งจ๋“œ์—์„œ ๋ช…๋ นํ˜• ์˜ค๋ธŒ์ ํŠธ ๊ตฌ์„ฑ์œผ๋กœ ์ „ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด ๋ช‡ ๊ฐ€์ง€ ์ˆ˜๋™ ๋‹จ๊ณ„๋ฅผ ํฌํ•จํ•œ๋‹ค.

  1. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ™œ์„ฑ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋กœ์ปฌ ์˜ค๋ธŒ์ ํŠธ ๊ตฌ์„ฑ ํŒŒ์ผ๋กœ ๋‚ด๋ณด๋‚ธ๋‹ค.

    kubectl get <์ข…๋ฅ˜>/<์ด๋ฆ„> -o yaml > <์ข…๋ฅ˜>_<์ด๋ฆ„>.yaml
    
  2. ์ˆ˜๋™์œผ๋กœ ์˜ค๋ธŒ์ ํŠธ ๊ตฌ์„ฑ ํŒŒ์ผ์—์„œ ์ƒํƒœ ํ•„๋“œ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค.

  3. ์ดํ›„ ์˜ค๋ธŒ์ ํŠธ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด, replace๋งŒ ์‚ฌ์šฉํ•œ๋‹ค.

    kubectl replace -f <์ข…๋ฅ˜>_<์ด๋ฆ„>.yaml
    

์ปจํŠธ๋กค๋Ÿฌ ์…€๋ ‰ํ„ฐ์™€ PodTemplate ๋ ˆ์ด๋ธ” ์‚ญ์ œํ•˜๊ธฐ

๊ถŒ๊ณ ๋˜๋Š” ์ ‘๊ทผ๋ฐฉ๋ฒ•์€ ๋‹ค๋ฅธ ์˜๋ฏธ๋ก ์  ์˜๋ฏธ๊ฐ€ ์—†๋Š” ์ปจํŠธ๋กค๋Ÿฌ ์…€๋ ‰ํ„ฐ์˜ ์˜ํ•ด์„œ๋งŒ ์‚ฌ์šฉ๋˜๋Š” ๋‹จ์ผ, ๋ถˆ๋ณ€์˜ PodTemplate ๋ ˆ์ด๋ธ”๋กœ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๋ ˆ์ด๋ธ” ์˜ˆ์‹œ:

selector:
  matchLabels:
      controller-selector: "apps/v1/deployment/nginx"
template:
  metadata:
    labels:
      controller-selector: "apps/v1/deployment/nginx"

๋‹ค์Œ ๋‚ด์šฉ