๋ฆฌ์์ค ๊ด๋ฆฌ
์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌํ๊ณ ์๋น์ค๋ฅผ ํตํด ๋ ธ์ถํ๋ค. ์ด์ ๋ฌด์์ ํด์ผ ํ ๊น? ์ฟ ๋ฒ๋คํฐ์ค๋ ํ์ฅ๊ณผ ์ ๋ฐ์ดํธ๋ฅผ ํฌํจํ์ฌ, ์ ํ๋ฆฌ์ผ์ด์ ๋ฐฐํฌ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐ ๋์์ด ๋๋ ์ฌ๋ฌ ๋๊ตฌ๋ฅผ ์ ๊ณตํ๋ค. ๋ ์์ธํ ์ค๋ช ํ ๊ธฐ๋ฅ ์ค์๋ ๊ตฌ์ฑ ํ์ผ๊ณผ ๋ ์ด๋ธ์ด ์๋ค.
๋ฆฌ์์ค ๊ตฌ์ฑ ๊ตฌ์ฑํ๊ธฐ
๋ง์ ์ ํ๋ฆฌ์ผ์ด์
๋ค์ ๋ํ๋ก์ด๋จผํธ ๋ฐ ์๋น์ค์ ๊ฐ์ ์ฌ๋ฌ ๋ฆฌ์์ค๋ฅผ ํ์๋ก ํ๋ค. ์ฌ๋ฌ ๋ฆฌ์์ค์ ๊ด๋ฆฌ๋ ๋์ผํ ํ์ผ์ ๊ทธ๋ฃนํํ์ฌ ๋จ์ํํ ์ ์๋ค(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 ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํ์์ ์ ์ฐจ์ ์ผ๋ก ์ ๋ฐ์ดํธํ๋ค. ์ ๋ฐ์ดํธ๋๋ ๋์ ํน์ ์์ ์ด์ ๋ ํ๋ฆฌ์นด๋ง ์ค๋จ๋ ์ ์์ผ๋ฉฐ, ์ํ๋ ์์ ํ๋ ์์ ํน์ ์์ ์ ๋ ํ๋ฆฌ์นด๋ง ์์ฑ๋ ์ ์๋ค. ์ด์ ๋ํ ๋ ์์ธํ ๋ด์ฉ์ ๋ณด๋ ค๋ฉด, ๋ํ๋ก์ด๋จผํธ ํ์ด์ง๋ฅผ ๋ฐฉ๋ฌธํ๋ค.
๋ค์ ๋ด์ฉ
- ์ ํ๋ฆฌ์ผ์ด์
๊ฒ์ฌ ๋ฐ ๋๋ฒ๊น
์
kubectl
์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณธ๋ค. - ๊ตฌ์ฑ ๋ชจ๋ฒ ์ฌ๋ก ๋ฐ ํ์ ์ฐธ๊ณ ํ๋ค.