Information in this document may be out of date

This document has an older update date than the original, so the information it contains may be out of date. If you're able to read English, see the English version for the most up-to-date information: Declarative Management of Kubernetes Objects Using Configuration Files

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

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜ค๋ธŒ์ ํŠธ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์˜ค๋ธŒ์ ํŠธ ๊ตฌ์„ฑ ํŒŒ์ผ์„ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์ €์žฅํ•˜๊ณ  ํ•„์š”์— ๋”ฐ๋ผ 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"

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

์ตœ์ข… ์ˆ˜์ • March 24, 2021 at 11:13 PM PST: Update to Outdated files in the dev-1.20-ko.7 branch part. 1. (b59a32dfbc)