๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•˜๊ณ  ์„œ๋น„์Šค๋ฅผ ํ†ตํ•ด ๋…ธ์ถœํ–ˆ๋‹ค. ์ด์ œ ๋ฌด์—‡์„ ํ•ด์•ผ ํ• ๊นŒ? ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ํ™•์žฅ๊ณผ ์—…๋ฐ์ดํŠธ๋ฅผ ํฌํ•จํ•˜์—ฌ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ์—ฌ๋Ÿฌ ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ๋” ์ž์„ธํžˆ ์„ค๋ช…ํ•  ๊ธฐ๋Šฅ ์ค‘์—๋Š” ๊ตฌ์„ฑ ํŒŒ์ผ๊ณผ ๋ ˆ์ด๋ธ”์ด ์žˆ๋‹ค.

๋ฆฌ์†Œ์Šค ๊ตฌ์„ฑ ๊ตฌ์„ฑํ•˜๊ธฐ

๋งŽ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋“ค์€ ๋””ํ”Œ๋กœ์ด๋จผํŠธ ๋ฐ ์„œ๋น„์Šค์™€ ๊ฐ™์€ ์—ฌ๋Ÿฌ ๋ฆฌ์†Œ์Šค๋ฅผ ํ•„์š”๋กœ ํ•œ๋‹ค. ์—ฌ๋Ÿฌ ๋ฆฌ์†Œ์Šค์˜ ๊ด€๋ฆฌ๋Š” ๋™์ผํ•œ ํŒŒ์ผ์— ๊ทธ๋ฃนํ™”ํ•˜์—ฌ ๋‹จ์ˆœํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค(YAML์—์„œ --- ๋กœ ๊ตฌ๋ถ„). ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

apiVersion: v1
kind: Service
metadata:
  name: my-nginx-svc
  labels:
    app: nginx
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: nginx
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

๋‹จ์ผ ๋ฆฌ์†Œ์Šค์™€ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ์—ฌ๋Ÿฌ ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

kubectl apply -f https://k8s.io/examples/application/nginx-app.yaml
service/my-nginx-svc created
deployment.apps/my-nginx created

๋ฆฌ์†Œ์Šค๋Š” ํŒŒ์ผ์— ํ‘œ์‹œ๋œ ์ˆœ์„œ๋Œ€๋กœ ์ƒ์„ฑ๋œ๋‹ค. ๋”ฐ๋ผ์„œ, ์Šค์ผ€์ค„๋Ÿฌ๊ฐ€ ๋””ํ”Œ๋กœ์ด๋จผํŠธ์™€ ๊ฐ™์€ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์ƒ์„ฑํ•œ ์„œ๋น„์Šค์™€ ๊ด€๋ จ๋œ ํŒŒ๋“œ๋ฅผ ๋ถ„์‚ฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์„œ๋น„์Šค๋ฅผ ๋จผ์ € ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹๋‹ค.

kubectl apply ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ -f ์ธ์ˆ˜๋„ ํ—ˆ์šฉํ•œ๋‹ค.

kubectl apply -f https://k8s.io/examples/application/nginx/nginx-svc.yaml -f https://k8s.io/examples/application/nginx/nginx-deployment.yaml

๊ทธ๋ฆฌ๊ณ  ๊ฐœ๋ณ„ ํŒŒ์ผ ๋Œ€์‹  ๋˜๋Š” ์ถ”๊ฐ€๋กœ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

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

kubectl ์€ ์ ‘๋ฏธ์‚ฌ๊ฐ€ .yaml, .yml ๋˜๋Š” .json ์ธ ํŒŒ์ผ์„ ์ฝ๋Š”๋‹ค.

๋™์ผํ•œ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ๋˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ‹ฐ์–ด(tier)์™€ ๊ด€๋ จ๋œ ๋ฆฌ์†Œ์Šค๋ฅผ ๋™์ผํ•œ ํŒŒ์ผ์— ๋ฐฐ์น˜ํ•˜๊ณ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ์—ฐ๊ด€๋œ ๋ชจ๋“  ํŒŒ์ผ์„ ๋™์ผํ•œ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ๊ทธ๋ฃนํ™”ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ‹ฐ์–ด๊ฐ€ DNS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋กœ ๋ฐ”์ธ๋”ฉ๋˜๋ฉด, ์Šคํƒ์˜ ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•จ๊ป˜ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋‹ค.

URL์„ ๊ตฌ์„ฑ ์†Œ์Šค๋กœ ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์ด๋Š” GitHub์— ์ฒดํฌ์ธ๋œ ๊ตฌ์„ฑ ํŒŒ์ผ์—์„œ ์ง์ ‘ ๋ฐฐํฌํ•˜๋Š” ๋ฐ ํŽธ๋ฆฌํ•˜๋‹ค.

kubectl apply -f https://raw.githubusercontent.com/kubernetes/website/main/content/en/examples/application/nginx/nginx-deployment.yaml
deployment.apps/my-nginx created

kubectl์—์„œ์˜ ๋Œ€๋Ÿ‰ ์ž‘์—…

kubectl ์ด ๋Œ€๋Ÿ‰์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ž‘์—…์€ ๋ฆฌ์†Œ์Šค ์ƒ์„ฑ๋งŒ์ด ์•„๋‹ˆ๋‹ค. ๋˜ํ•œ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด, ํŠนํžˆ ์ž‘์„ฑํ•œ ๋™์ผํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ญ์ œํ•˜๊ธฐ ์œ„ํ•ด ๊ตฌ์„ฑ ํŒŒ์ผ์—์„œ ๋ฆฌ์†Œ์Šค ์ด๋ฆ„์„ ์ถ”์ถœํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

kubectl delete -f https://k8s.io/examples/application/nginx-app.yaml
deployment.apps "my-nginx" deleted
service "my-nginx-svc" deleted

๋‘ ๊ฐœ์˜ ๋ฆฌ์†Œ์Šค๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ, ๋ฆฌ์†Œ์Šค/์ด๋ฆ„ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ปค๋งจ๋“œ ๋ผ์ธ์—์„œ ๋‘˜๋‹ค ๋ชจ๋‘ ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

kubectl delete deployments/my-nginx services/my-nginx-svc

๋ฆฌ์†Œ์Šค๊ฐ€ ๋งŽ์„ ๊ฒฝ์šฐ, -l ๋˜๋Š” --selector ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ง€์ •๋œ ์…€๋ ‰ํ„ฐ(๋ ˆ์ด๋ธ” ์ฟผ๋ฆฌ)๋ฅผ ์ง€์ •ํ•˜์—ฌ ๋ ˆ์ด๋ธ”๋ณ„๋กœ ๋ฆฌ์†Œ์Šค๋ฅผ ํ•„ํ„ฐ๋งํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฝ๋‹ค.

kubectl delete deployment,services -l app=nginx
deployment.apps "my-nginx" deleted
service "my-nginx-svc" deleted

kubectl ์€ ์ž…๋ ฅ์„ ๋ฐ›์•„๋“ค์ด๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ๊ตฌ๋ฌธ์œผ๋กœ ๋ฆฌ์†Œ์Šค ์ด๋ฆ„์„ ์ถœ๋ ฅํ•˜๋ฏ€๋กœ, $() ๋˜๋Š” xargs ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์—…์„ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

kubectl get $(kubectl create -f docs/concepts/cluster-administration/nginx/ -o name | grep service)
kubectl create -f docs/concepts/cluster-administration/nginx/ -o name | grep service | xargs -i kubectl get {}
NAME           TYPE           CLUSTER-IP   EXTERNAL-IP   PORT(S)      AGE
my-nginx-svc   LoadBalancer   10.0.0.208   <pending>     80/TCP       0s

์œ„์˜ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ, ๋จผ์ € examples/application/nginx/ ์— ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  -o name ์ถœ๋ ฅ ํ˜•์‹์œผ๋กœ ์ƒ์„ฑํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค(๊ฐ ๋ฆฌ์†Œ์Šค๋ฅผ resource/name์œผ๋กœ ์ถœ๋ ฅ). ๊ทธ๋Ÿฐ ๋‹ค์Œ "service"๋งŒ grep ํ•œ ๋‹ค์Œ kubectl get ์œผ๋กœ ์ถœ๋ ฅํ•œ๋‹ค.

ํŠน์ • ๋””๋ ‰ํ„ฐ๋ฆฌ ๋‚ด์˜ ์—ฌ๋Ÿฌ ์„œ๋ธŒ ๋””๋ ‰ํ„ฐ๋ฆฌ์—์„œ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ, --filename,-f ํ”Œ๋ž˜๊ทธ์™€ ํ•จ๊ป˜ --recursive ๋˜๋Š” -R ์„ ์ง€์ •ํ•˜์—ฌ, ์„œ๋ธŒ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ๋Œ€ํ•œ ์ž‘์—…์„ ์žฌ๊ท€์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฆฌ์†Œ์Šค ์œ ํ˜•๋ณ„๋กœ ๊ตฌ์„ฑ๋œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์— ํ•„์š”ํ•œ ๋ชจ๋“  ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ๋ณด์œ ํ•˜๋Š” project/k8s/development ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.

project/k8s/development
โ”œโ”€โ”€ configmap
โ”‚   โ””โ”€โ”€ my-configmap.yaml
โ”œโ”€โ”€ deployment
โ”‚   โ””โ”€โ”€ my-deployment.yaml
โ””โ”€โ”€ pvc
    โ””โ”€โ”€ my-pvc.yaml

๊ธฐ๋ณธ์ ์œผ๋กœ, project/k8s/development ์—์„œ ๋Œ€๋Ÿ‰ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ฉด, ์„œ๋ธŒ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๊ณ , ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ์ฒซ ๋ฒˆ์งธ ๋ ˆ๋ฒจ์—์„œ ์ค‘์ง€๋œ๋‹ค. ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด ๋””๋ ‰ํ„ฐ๋ฆฌ์— ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ ค๊ณ  ํ•˜๋ฉด, ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒƒ์ด๋‹ค.

kubectl apply -f project/k8s/development
error: you must provide one or more resources by argument or filename (.json|.yaml|.yml|stdin)

๋Œ€์‹ , ๋‹ค์Œ๊ณผ ๊ฐ™์ด --filename,-f ํ”Œ๋ž˜๊ทธ์™€ ํ•จ๊ป˜ --recursive ๋˜๋Š” -R ํ”Œ๋ž˜๊ทธ๋ฅผ ์ง€์ •ํ•œ๋‹ค.

kubectl apply -f project/k8s/development --recursive
configmap/my-config created
deployment.apps/my-deployment created
persistentvolumeclaim/my-pvc created

--recursive ํ”Œ๋ž˜๊ทธ๋Š” kubectl {create,get,delete,describe,rollout} ๋“ฑ๊ณผ ๊ฐ™์ด --filename,-f ํ”Œ๋ž˜๊ทธ๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ๋ชจ๋“  ์ž‘์—…์—์„œ ์ž‘๋™ํ•œ๋‹ค.

--recursive ํ”Œ๋ž˜๊ทธ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ -f ์ธ์ˆ˜๊ฐ€ ์ œ๊ณต๋  ๋•Œ๋„ ์ž‘๋™ํ•œ๋‹ค.

kubectl apply -f project/k8s/namespaces -f project/k8s/development --recursive
namespace/development created
namespace/staging created
configmap/my-config created
deployment.apps/my-deployment created
persistentvolumeclaim/my-pvc created

kubectl ์— ๋Œ€ํ•ด ๋” ์ž์„ธํžˆ ์•Œ๊ณ  ์‹ถ๋‹ค๋ฉด, ๋ช…๋ น์ค„ ๋„๊ตฌ (kubectl)๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.

ํšจ๊ณผ์ ์ธ ๋ ˆ์ด๋ธ” ์‚ฌ์šฉ

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

์˜ˆ๋ฅผ ๋“ค์–ด, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋งˆ๋‹ค app ๋ ˆ์ด๋ธ”์— ๋‹ค๋ฅธ ๊ฐ’์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ๋ฐฉ๋ช…๋ก ์˜ˆ์ œ์™€ ๊ฐ™์€ ๋ฉ€ํ‹ฐ-ํ‹ฐ์–ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๊ฐ ํ‹ฐ์–ด๋ฅผ ์ถ”๊ฐ€๋กœ ๊ตฌ๋ณ„ํ•ด์•ผ ํ•œ๋‹ค. ํ”„๋ก ํŠธ์—”๋“œ๋Š” ๋‹ค์Œ์˜ ๋ ˆ์ด๋ธ”์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.

     labels:
        app: guestbook
        tier: frontend

Redis ๋งˆ์Šคํ„ฐ์™€ ์Šฌ๋ ˆ์ด๋ธŒ๋Š” ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋‹ค๋ฅธ tier ๋ ˆ์ด๋ธ”์„ ๊ฐ€์ง€์ง€๋งŒ, ์•„๋งˆ๋„ ์ถ”๊ฐ€๋กœ role ๋ ˆ์ด๋ธ”์„ ๊ฐ€์งˆ ๊ฒƒ์ด๋‹ค.

     labels:
        app: guestbook
        tier: backend
        role: master

๊ทธ๋ฆฌ๊ณ 

     labels:
        app: guestbook
        tier: backend
        role: slave

๋ ˆ์ด๋ธ”์€ ๋ ˆ์ด๋ธ”๋กœ ์ง€์ •๋œ ์ฐจ์›์— ๋”ฐ๋ผ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ถ„ํ• ํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.

kubectl apply -f examples/guestbook/all-in-one/guestbook-all-in-one.yaml
kubectl get pods -Lapp -Ltier -Lrole
NAME                           READY     STATUS    RESTARTS   AGE       APP         TIER       ROLE
guestbook-fe-4nlpb             1/1       Running   0          1m        guestbook   frontend   <none>
guestbook-fe-ght6d             1/1       Running   0          1m        guestbook   frontend   <none>
guestbook-fe-jpy62             1/1       Running   0          1m        guestbook   frontend   <none>
guestbook-redis-master-5pg3b   1/1       Running   0          1m        guestbook   backend    master
guestbook-redis-slave-2q2yf    1/1       Running   0          1m        guestbook   backend    slave
guestbook-redis-slave-qgazl    1/1       Running   0          1m        guestbook   backend    slave
my-nginx-divi2                 1/1       Running   0          29m       nginx       <none>     <none>
my-nginx-o0ef1                 1/1       Running   0          29m       nginx       <none>     <none>
kubectl get pods -lapp=guestbook,role=slave
NAME                          READY     STATUS    RESTARTS   AGE
guestbook-redis-slave-2q2yf   1/1       Running   0          3m
guestbook-redis-slave-qgazl   1/1       Running   0          3m

์นด๋‚˜๋ฆฌ(canary) ๋””ํ”Œ๋กœ์ด๋จผํŠธ

์—ฌ๋Ÿฌ ๋ ˆ์ด๋ธ”์ด ํ•„์š”ํ•œ ๋˜ ๋‹ค๋ฅธ ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” ๋™์ผํ•œ ์ปดํฌ๋„ŒํŠธ์˜ ๋‹ค๋ฅธ ๋ฆด๋ฆฌ์Šค ๋˜๋Š” ๊ตฌ์„ฑ์˜ ๋””ํ”Œ๋กœ์ด๋จผํŠธ๋ฅผ ๊ตฌ๋ณ„ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ƒˆ ๋ฆด๋ฆฌ์Šค๊ฐ€ ์™„์ „ํžˆ ๋กค์•„์›ƒ๋˜๊ธฐ ์ „์— ์‹ค์ œ ์šด์˜ ํŠธ๋ž˜ํ”ฝ์„ ์ˆ˜์‹ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ƒˆ๋กœ์šด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฆด๋ฆฌ์Šค(ํŒŒ๋“œ ํ…œํ”Œ๋ฆฌํŠธ์˜ ์ด๋ฏธ์ง€ ํƒœ๊ทธ๋ฅผ ํ†ตํ•ด ์ง€์ •๋จ)์˜ ์นด๋‚˜๋ฆฌ ๋ฅผ ์ด์ „ ๋ฆด๋ฆฌ์Šค์™€ ๋‚˜๋ž€ํžˆ ๋ฐฐํฌํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, track ๋ ˆ์ด๋ธ”์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ๋ฆด๋ฆฌ์Šค๋ฅผ ๊ตฌ๋ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ธฐ๋ณธ(primary), ์•ˆ์ •(stable) ๋ฆด๋ฆฌ์Šค์—๋Š” ๊ฐ’์ด stable ์ธ track ๋ ˆ์ด๋ธ”์ด ์žˆ๋‹ค.

     name: frontend
     replicas: 3
     ...
     labels:
        app: guestbook
        tier: frontend
        track: stable
     ...
     image: gb-frontend:v3

๊ทธ๋Ÿฐ ๋‹ค์Œ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ’(์˜ˆ: canary)์œผ๋กœ track ๋ ˆ์ด๋ธ”์„ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ช…๋ก ํ”„๋ก ํŠธ์—”๋“œ์˜ ์ƒˆ ๋ฆด๋ฆฌ์Šค๋ฅผ ์ƒ์„ฑํ•˜์—ฌ, ๋‘ ์„ธํŠธ์˜ ํŒŒ๋“œ๊ฐ€ ๊ฒน์น˜์ง€ ์•Š๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.

     name: frontend-canary
     replicas: 1
     ...
     labels:
        app: guestbook
        tier: frontend
        track: canary
     ...
     image: gb-frontend:v4

ํ”„๋ก ํŠธ์—”๋“œ ์„œ๋น„์Šค๋Š” ๋ ˆ์ด๋ธ”์˜ ๊ณตํ†ต ์„œ๋ธŒ์…‹์„ ์„ ํƒํ•˜์—ฌ(์ฆ‰, track ๋ ˆ์ด๋ธ” ์ƒ๋žต) ๋‘ ๋ ˆํ”Œ๋ฆฌ์นด ์„ธํŠธ์— ๊ฑธ์ณ ์žˆ์œผ๋ฏ€๋กœ, ํŠธ๋ž˜ํ”ฝ์ด ๋‘ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ๋ฆฌ๋””๋ ‰์…˜๋œ๋‹ค.

  selector:
     app: guestbook
     tier: frontend

์•ˆ์ • ๋ฐ ์นด๋‚˜๋ฆฌ ๋ฆด๋ฆฌ์Šค์˜ ๋ ˆํ”Œ๋ฆฌ์นด ์ˆ˜๋ฅผ ์กฐ์ •ํ•˜์—ฌ ์‹ค์ œ ์šด์˜ ํŠธ๋ž˜ํ”ฝ์„ ์ˆ˜์‹ ํ•  ๊ฐ ๋ฆด๋ฆฌ์Šค์˜ ๋น„์œจ์„ ๊ฒฐ์ •ํ•œ๋‹ค(์ด ๊ฒฝ์šฐ, 3:1). ํ™•์‹ ์ด ๋“ค๋ฉด, ์•ˆ์ • ๋ฆด๋ฆฌ์Šค์˜ track์„ ์ƒˆ๋กœ์šด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฆด๋ฆฌ์Šค๋กœ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ์นด๋‚˜๋ฆฌ๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ณด๋‹ค ๊ตฌ์ฒด์ ์ธ ์˜ˆ์‹œ๋Š”, Ghost ๋ฐฐํฌ์— ๋Œ€ํ•œ ํŠœํ† ๋ฆฌ์–ผ์„ ํ™•์ธํ•œ๋‹ค.

๋ ˆ์ด๋ธ” ์—…๋ฐ์ดํŠธ

์ƒˆ๋กœ์šด ๋ฆฌ์†Œ์Šค๋ฅผ ๋งŒ๋“ค๊ธฐ ์ „์— ๊ธฐ์กด ํŒŒ๋“œ ๋ฐ ๊ธฐํƒ€ ๋ฆฌ์†Œ์Šค์˜ ๋ ˆ์ด๋ธ”์„ ๋‹ค์‹œ ์ง€์ •ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. ์ด๊ฒƒ์€ kubectl label ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ชจ๋“  nginx ํŒŒ๋“œ์— ํ”„๋ก ํŠธ์—”๋“œ ํ‹ฐ์–ด๋กœ ๋ ˆ์ด๋ธ”์„ ์ง€์ •ํ•˜๋ ค๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹คํ–‰ํ•œ๋‹ค.

kubectl label pods -l app=nginx tier=fe
pod/my-nginx-2035384211-j5fhi labeled
pod/my-nginx-2035384211-u2c7e labeled
pod/my-nginx-2035384211-u3t6x labeled

๋จผ์ € "app=nginx" ๋ ˆ์ด๋ธ”์ด ์žˆ๋Š” ๋ชจ๋“  ํŒŒ๋“œ๋ฅผ ํ•„ํ„ฐ๋งํ•œ ๋‹ค์Œ, "tier=fe" ๋ ˆ์ด๋ธ”์„ ์ง€์ •ํ•œ๋‹ค. ๋ ˆ์ด๋ธ”์„ ์ง€์ •ํ•œ ํŒŒ๋“œ๋ฅผ ๋ณด๋ ค๋ฉด, ๋‹ค์Œ์„ ์‹คํ–‰ํ•œ๋‹ค.

kubectl get pods -l app=nginx -L tier
NAME                        READY     STATUS    RESTARTS   AGE       TIER
my-nginx-2035384211-j5fhi   1/1       Running   0          23m       fe
my-nginx-2035384211-u2c7e   1/1       Running   0          23m       fe
my-nginx-2035384211-u3t6x   1/1       Running   0          23m       fe

๊ทธ๋Ÿฌ๋ฉด ํŒŒ๋“œ ํ‹ฐ์–ด์˜ ์ถ”๊ฐ€ ๋ ˆ์ด๋ธ” ์—ด(-L ๋˜๋Š” --label-columns ๋กœ ์ง€์ •)๊ณผ ํ•จ๊ป˜, ๋ชจ๋“  "app=nginx" ํŒŒ๋“œ๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

๋” ์ž์„ธํ•œ ๋‚ด์šฉ์€, ๋ ˆ์ด๋ธ” ๋ฐ kubectl label์„ ์ฐธ๊ณ ํ•˜๊ธธ ๋ฐ”๋ž€๋‹ค.

์–ด๋…ธํ…Œ์ด์…˜ ์—…๋ฐ์ดํŠธ

๋•Œ๋กœ๋Š” ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ฆฌ์†Œ์Šค์— ์ฒจ๋ถ€ํ•˜๋ ค๊ณ  ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์–ด๋…ธํ…Œ์ด์…˜์€ ๋„๊ตฌ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋“ฑ๊ณผ ๊ฐ™์€ API ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ž„์˜์˜ ๋น„-์‹๋ณ„ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์ด๋‹ค. ์ด๋Š” kubectl annotate ์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

kubectl annotate pods my-nginx-v4-9gw19 description='my frontend running nginx'
kubectl get pods my-nginx-v4-9gw19 -o yaml
apiVersion: v1
kind: pod
metadata:
  annotations:
    description: my frontend running nginx
...

๋” ์ž์„ธํ•œ ๋‚ด์šฉ์€, ์–ด๋…ธํ…Œ์ด์…˜ ๋ฐ kubectl annotate ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜๊ธธ ๋ฐ”๋ž€๋‹ค.

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์Šค์ผ€์ผ๋ง

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋กœ๋“œ๊ฐ€ ์ฆ๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ถ•์†Œ๋˜๋ฉด, kubectl ์„ ์‚ฌ์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์Šค์ผ€์ผ๋งํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, nginx ๋ ˆํ”Œ๋ฆฌ์นด ์ˆ˜๋ฅผ 3์—์„œ 1๋กœ ์ค„์ด๋ ค๋ฉด, ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

kubectl scale deployment/my-nginx --replicas=1
deployment.apps/my-nginx scaled

์ด์ œ ๋””ํ”Œ๋กœ์ด๋จผํŠธ๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ํŒŒ๋“œ๊ฐ€ ํ•˜๋‚˜๋งŒ ์žˆ๋‹ค.

kubectl get pods -l app=nginx
NAME                        READY     STATUS    RESTARTS   AGE
my-nginx-2035384211-j5fhi   1/1       Running   0          30m

์‹œ์Šคํ…œ์ด ํ•„์š”์— ๋”ฐ๋ผ 1์—์„œ 3๊นŒ์ง€์˜ ๋ฒ”์œ„์—์„œ nginx ๋ ˆํ”Œ๋ฆฌ์นด ์ˆ˜๋ฅผ ์ž๋™์œผ๋กœ ์„ ํƒํ•˜๊ฒŒ ํ•˜๋ ค๋ฉด, ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

kubectl autoscale deployment/my-nginx --min=1 --max=3
horizontalpodautoscaler.autoscaling/my-nginx autoscaled

์ด์ œ nginx ๋ ˆํ”Œ๋ฆฌ์นด๊ฐ€ ํ•„์š”์— ๋”ฐ๋ผ ์ž๋™์œผ๋กœ ํ™•์žฅ๋˜๊ฑฐ๋‚˜ ์ถ•์†Œ๋œ๋‹ค.

๋” ์ž์„ธํ•œ ๋‚ด์šฉ์€, kubectl scale, kubectl autoscale ๋ฐ horizontal pod autoscaler ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜๊ธธ ๋ฐ”๋ž€๋‹ค.

๋ฆฌ์†Œ์Šค ์ธํ”Œ๋ ˆ์ด์Šค(in-place) ์—…๋ฐ์ดํŠธ

๋•Œ๋กœ๋Š” ์ž์‹ ์ด ๋งŒ๋“  ๋ฆฌ์†Œ์Šค๋ฅผ ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ, ์ค‘๋‹จ์—†์ด ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•  ๋•Œ๊ฐ€ ์žˆ๋‹ค.

kubectl apply

๊ตฌ์„ฑ ํŒŒ์ผ ์…‹์„ ์†Œ์Šค ์ œ์–ด์—์„œ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์œผ๋ฉฐ (์ฝ”๋“œ๋กœ์„œ์˜ ๊ตฌ์„ฑ ์ฐธ์กฐ), ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ตฌ์„ฑํ•˜๋Š” ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ๋ฒ„์ „์„ ์ง€์ •ํ•˜๊ณ  ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ, kubectl apply๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์„ฑ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํด๋Ÿฌ์Šคํ„ฐ๋กœ ํ‘ธ์‹œํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด ๋ช…๋ น์€ ํ‘ธ์‹œํ•˜๋ ค๋Š” ๊ตฌ์„ฑ์˜ ๋ฒ„์ „์„ ์ด์ „ ๋ฒ„์ „๊ณผ ๋น„๊ตํ•˜๊ณ  ์ง€์ •ํ•˜์ง€ ์•Š์€ ์†์„ฑ์— ๋Œ€ํ•œ ์ž๋™ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ฎ์–ด์“ฐ์ง€ ์•Š์€ ์ฑ„ ์ˆ˜์ •ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ ์šฉํ•œ๋‹ค.

kubectl apply -f https://k8s.io/examples/application/nginx/nginx-deployment.yaml
deployment.apps/my-nginx configured

์ฐธ๊ณ ๋กœ kubectl apply ๋Š” ์ด์ „์˜ ํ˜ธ์ถœ ์ดํ›„ ๊ตฌ์„ฑ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํŒ๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด ๋ฆฌ์†Œ์Šค์— ์–ด๋…ธํ…Œ์ด์…˜์„ ์ฒจ๋ถ€ํ•œ๋‹ค. ํ˜ธ์ถœ๋˜๋ฉด, kubectl apply ๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด, ์ด์ „ ๊ตฌ์„ฑ๊ณผ ์ œ๊ณต๋œ ์ž…๋ ฅ ๋ฐ ๋ฆฌ์†Œ์Šค์˜ ํ˜„์žฌ ๊ตฌ์„ฑ ๊ฐ„์— 3-way diff๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

ํ˜„์žฌ, ์ด ์–ด๋…ธํ…Œ์ด์…˜ ์—†์ด ๋ฆฌ์†Œ์Šค๊ฐ€ ์ƒ์„ฑ๋˜๋ฏ€๋กœ, kubectl apply ์˜ ์ฒซ ๋ฒˆ์งธ ํ˜ธ์ถœ์€ ์ œ๊ณต๋œ ์ž…๋ ฅ๊ณผ ๋ฆฌ์†Œ์Šค์˜ ํ˜„์žฌ ๊ตฌ์„ฑ ์‚ฌ์ด์˜ 2-way diff๋กœ ๋Œ€์ฒด๋œ๋‹ค. ์ด ์ฒซ ๋ฒˆ์งธ ํ˜ธ์ถœ ์ค‘์—๋Š”, ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์„ค์ •๋œ ํŠน์„ฑ์˜ ์‚ญ์ œ๋ฅผ ๊ฐ์ง€ํ•  ์ˆ˜ ์—†๋‹ค. ์ด๋Ÿฌํ•œ ์ด์œ ๋กœ, ๊ทธ ํŠน์„ฑ๋“ค์„ ์‚ญ์ œํ•˜์ง€ ์•Š๋Š”๋‹ค.

kubectl apply ์— ๋Œ€ํ•œ ๋ชจ๋“  ํ›„์† ํ˜ธ์ถœ, ๊ทธ๋ฆฌ๊ณ  kubectl replace ๋ฐ kubectl edit ์™€ ๊ฐ™์ด ๊ตฌ์„ฑ์„ ์ˆ˜์ •ํ•˜๋Š” ๋‹ค๋ฅธ ๋ช…๋ น์€, ์–ด๋…ธํ…Œ์ด์…˜์„ ์—…๋ฐ์ดํŠธํ•˜์—ฌ, kubectl apply ์— ๋Œ€ํ•œ ํ›„์† ํ˜ธ์ถœ์ด 3-way diff๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ญ์ œ๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

kubectl edit

๋˜๋Š”, kubectl edit๋กœ ๋ฆฌ์†Œ์Šค๋ฅผ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

kubectl edit deployment/my-nginx

์ด๊ฒƒ์€ ๋จผ์ € ๋ฆฌ์†Œ์Šค๋ฅผ get ํ•˜์—ฌ, ํ…์ŠคํŠธ ํŽธ์ง‘๊ธฐ์—์„œ ํŽธ์ง‘ํ•œ ๋‹ค์Œ, ์—…๋ฐ์ดํŠธ๋œ ๋ฒ„์ „์œผ๋กœ ๋ฆฌ์†Œ์Šค๋ฅผ apply ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค.

kubectl get deployment my-nginx -o yaml > /tmp/nginx.yaml
vi /tmp/nginx.yaml
# ํŽธ์ง‘ํ•œ ๋‹ค์Œ, ํŒŒ์ผ์„ ์ €์žฅํ•œ๋‹ค.

kubectl apply -f /tmp/nginx.yaml
deployment.apps/my-nginx configured

rm /tmp/nginx.yaml

์ด๋ฅผ ํ†ตํ•ด ๋ณด๋‹ค ์ค‘์š”ํ•œ ๋ณ€๊ฒฝ์„ ๋” ์‰ฝ๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฐธ๊ณ ๋กœ EDITOR ๋˜๋Š” KUBE_EDITOR ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŽธ์ง‘๊ธฐ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋” ์ž์„ธํ•œ ๋‚ด์šฉ์€, kubectl edit ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜๊ธธ ๋ฐ”๋ž€๋‹ค.

kubectl patch

kubectl patch ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ API ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ธํ”Œ๋ ˆ์ด์Šค ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๋ช…๋ น์€ JSON ํŒจ์น˜, JSON ๋ณ‘ํ•ฉ ํŒจ์น˜ ๊ทธ๋ฆฌ๊ณ  ์ „๋žต์  ๋ณ‘ํ•ฉ ํŒจ์น˜๋ฅผ ์ง€์›ํ•œ๋‹ค. kubectl patch๋ฅผ ์‚ฌ์šฉํ•œ ์ธํ”Œ๋ ˆ์ด์Šค API ์˜ค๋ธŒ์ ํŠธ ์—…๋ฐ์ดํŠธ์™€ kubectl patch๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.

ํŒŒ๊ดด์ (disruptive) ์—…๋ฐ์ดํŠธ

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

kubectl replace -f https://k8s.io/examples/application/nginx/nginx-deployment.yaml --force
deployment.apps/my-nginx deleted
deployment.apps/my-nginx replaced

์„œ๋น„์Šค ์ค‘๋‹จ์—†์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์—…๋ฐ์ดํŠธ

์–ธ์  ๊ฐ€๋Š”, ์œ„์˜ ์นด๋‚˜๋ฆฌ ๋””ํ”Œ๋กœ์ด๋จผํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ์™€ ๊ฐ™์ด, ์ผ๋ฐ˜์ ์œผ๋กœ ์ƒˆ ์ด๋ฏธ์ง€ ๋˜๋Š” ์ด๋ฏธ์ง€ ํƒœ๊ทธ๋ฅผ ์ง€์ •ํ•˜์—ฌ, ๋ฐฐํฌ๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•œ๋‹ค. kubectl ์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์—…๋ฐ์ดํŠธ ์ž‘์—…์„ ์ง€์›ํ•˜๋ฉฐ, ๊ฐ ์—…๋ฐ์ดํŠธ ์ž‘์—…์€ ์„œ๋กœ ๋‹ค๋ฅธ ์‹œ๋‚˜๋ฆฌ์˜ค์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋””ํ”Œ๋กœ์ด๋จผํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ƒ์„ฑํ•˜๊ณ  ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•ˆ๋‚ดํ•œ๋‹ค.

nginx 1.14.2 ๋ฒ„์ „์„ ์‹คํ–‰ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ๋‹ค.

kubectl create deployment my-nginx --image=nginx:1.14.2
deployment.apps/my-nginx created

3๊ฐœ์˜ ๋ ˆํ”Œ๋ฆฌ์นด๋ฅผ ํฌํ•จํ•œ๋‹ค(์ด์ „๊ณผ ์ƒˆ ๊ฐœ์ •ํŒ์ด ๊ณต์กดํ•  ์ˆ˜ ์žˆ์Œ).

kubectl scale deployment my-nginx --current-replicas=1 --replicas=3
deployment.apps/my-nginx scaled

1.16.1 ๋ฒ„์ „์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๋ ค๋ฉด, ์œ„์—์„œ ๋ฐฐ์šด kubectl ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ .spec.template.spec.containers[0].image ๋ฅผ nginx:1.14.2 ์—์„œ nginx:1.16.1 ๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค.

kubectl edit deployment/my-nginx

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

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

์ตœ์ข… ์ˆ˜์ • August 12, 2022 at 1:44 PM PST: [ko] sync the documents using comment (40bc0a1513)