Controller
- pod๋ฅผ ๊ด๋ฆฌํ๋ ์ญํ , pod์ ๊ฐ์๋ฅผ ๊ฒฐ์ ํ๊ณ ๋ณด์ฅํด์ค
- API, etcd,scheduler, cotroller ๊ฐ ํจ๊ป ํ์
ํ๋ฉด์ pod์ ๊ฐ์๋ฅผ ๋ณด์ฅ
- ์์ฒญํ์ฌ ๋ณด์ฅํด๋์ pod ์ค ํ๋์ ๋ฌธ์ ๊ฐ ์๊ธฐ๊ฒ๋๋ฉด
- controller๊ฐ API์๊ฒ pod ํ๋๋ฅผ ๋ ๋ง๋ค๋๋ก ์์ฒญ
- scheduler๋ฅผ ํตํ์ฌ pod๋ฅผ ๋ฐฐ์นํ๋๋ก ํ์ฌ ์์ฒญ๋ pod์ ๊ฐ์๋ฅผ ๋ณด์ฅ
์ปจํธ๋กค๋ฌ์ ์ข ๋ฅ
1. Replication Controller(RC)
- ์๊ตฌํ๋ pod์ ๊ฐ์๋ฅผ ๋ณด์ฅํ๋ฉฐ ํ๋ ์งํฉ์ ์คํ์ ํญ์ ์์ ์ ์ผ๋ก ์ ์งํ๋ ๊ฒ์ ๋ชฉํ
- ์๊ตฌํ๋ pod์ ๊ฐ์๊ฐ ๋ถ์กฑํ๋ฉด template๋ฅผ ์ด์ฉํด์ pod ์ถ๊ฐ
- ์๊ตฌํ๋ pod ์ ๋ณด๋ค ๋ง์ผ๋ฉด ์ต๊ทผ์ ์์ฑ๋ pod๋ฅผ ์ญ์
- ๊ธฐ๋ณธ ๊ตฌ์ฑ
- selector : RC๊ฐ ๊ด๋ฆฌํ Pod๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐ ์ฌ์ฉ
- replicas : RC์ ์ํด์ ๊ด๋ฆฌ๋๋ Pod์ ์์ธ๋ฐ, ๊ทธ ์ซ์๋งํผ Pod์ ์๋ฅผ ์ ์ง
- template : Pod๋ฅผ ์๋ก ๋ง๋ค ๋ ์ด๋ค Pod๋ฅผ ๋ง๋ค์ง์ ๋ํ ์ ๋ณด๊ฐ ํ์ํ๋ฐ (๋์ปค ์ด๋ฏธ์ง, ํฌํธ, ๋ผ๋ฒจ ๋ฑ) ์ด์ ๋ํ ์ ๋ณด๋ฅผ ์ ์ํ ํ ํ๋ฆฟ
๋ ํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ ์์ 1
$ cat rc-nginx.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: rc-nginx
spec:
replicas: 3 # ๋ฐฐํฌ ๊ฐฏ์
selector:
app: webui # key:value ์ด๋ฐ key, value๋ฅผ ๊ฐ์ง๋ pod๋ฅผ replicas ์ ๋งํผ ์ด์ํด์ค
template: # ์ถ๊ฐ๋ก pod๋ฅผ ์์ฑํ ๊ฒฝ์ฐ pod template๋ฅผ ๋ณด๊ณ ์์ฑ
metadata:
name: nginx-pod
labels:
app: webui # selector์ ์๋ key, value๋ฅผ ๋ฐ๋์ ๋ผ๋ฒจ๋ก ํฌํจํ๊ณ ์์ด์ผ ํจ
spec:
containers:
- name: nginx-container
image: nginx:1.14
$ kubectl create -f rc-nginx.yaml
- ํ์ฌ ๋์์ค์ธ pod ์
$ watch kubectl get pods -o wide
- rc์ ์ ๋ณด๋ฅผ ์ถ๋ ฅ(2๊ฐ์ง ๋ฐฉ๋ฒ)
$ kubectl get replicationcontrollers $ kubectl get rc
- rc์ ์ ๋ณด๋ฅผ ์์ธํ๊ฒ ์ถ๋ ฅ
$ kubectl describe rc rc-nginx
- ํ๋ ์ญ์ ์ replication controller๊ฐ ํ๋ ์ผ์?
$ kubectl get pods $ kubectl delete pod rc-nginx-XXXX
๋ ํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ ์์ 2
- yaml ํ์ผ ์์ ํ์ฌ pod scale out/down
$ cat edit rc-nginx.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: rc-nginx
spec:
replicas: 3
selector:
app: webui # key:value ์ด๋ฐ key, value๋ฅผ ๊ฐ์ง๋ pod๋ฅผ replicas ์ ๋งํผ ์ด์ํด์ค
template: # ์ถ๊ฐ๋ก pod๋ฅผ ์์ฑํ ๊ฒฝ์ฐ pod template๋ฅผ ๋ณด๊ณ ์์ฑ
metadata:
name: nginx-pod
labels:
app: webui # selector์ ์๋ key, value๋ฅผ ๋ฐ๋์ ๋ผ๋ฒจ๋ก ํฌํจํ๊ณ ์์ด์ผ ํจ
spec:
containers:
- name: nginx-container
image: nginx:1.14
- command๋ก pod scale out/down
$ kubectl scale rc rc-nginx --relicas=3
๋ฒ์ ๋ณ๊ฒฝ
- ์๋น์ค ๋์ ์ค์ ์๋ก ์์ฑ๋๋ pod์ ๋ฒ์ ๋ณ๊ฒฝ ๊ฐ๋ฅ(Rolling Update)
- ๊ธฐ์กด pod์ ์ํฅ์ ์์
$ cat edit rc-nginx.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: rc-nginx
spec:
replicas: 3
selector:
app: webui # key:value ์ด๋ฐ key, value๋ฅผ ๊ฐ์ง๋ pod๋ฅผ replicas ์ ๋งํผ ์ด์ํด์ค
template: # ์ถ๊ฐ๋ก pod๋ฅผ ์์ฑํ ๊ฒฝ์ฐ pod template๋ฅผ ๋ณด๊ณ ์์ฑ
metadata:
name: nginx-pod
labels:
app: webui # selector์ ์๋ key, value๋ฅผ ๋ฐ๋์ ๋ผ๋ฒจ๋ก ํฌํจํ๊ณ ์์ด์ผ ํจ
spec:
containers:
- name: nginx-container
image: nginx:1.15 # ์๋ก ์์ฑ๋๋
- ๋์์ค์ธ pod ํ์ธ
$ kubectl describe pod rc rc-nginx-XXX
- pod ์ญ์ (rc ์ญ์ ํ๋ฉด pod๊น์ง ๋ค ์ญ์ )
$ kubectl delete pod rc rc-nginx-XXX
- pod ์ญ์ ๋ก ์์ฑ๋ ์๋ก์ด pod ํ์ธ
$ kubectl describe pod rc rc-nginx-YYY
2. ReplicaSet
- replication controller์ ๊ฐ์ ์ญํ ์ ํ๋ ์ปจํธ๋กค๋ฌ
- replication controller ๋ณด๋ค ๋ ๋ค์ํ ํํ์ selector ์ง์
selector:
matchLabels:
component: redis
matchExpressions: # ๋ค์๋ค์
- {key: tier, operator: In, values: [cache]}
- {key: environment, operator: Notln, values: [dev]}
- matchExpressions ์ฐ์ฐ์
- In : key์ values๋ฅผ ์ง์ ํ์ฌ key,value๊ฐ ์ผ์นํ๋ pod๋ง ์ฐ๊ฒฐ
- Notln : key๋ ์ผ์นํ๊ณ value๋ ์ผ์นํ์ง ์๋ pod์ ์ฐ๊ฒฐ
- Exists : key์ ๋ง๋ label์ pod๋ฅผ ์ฐ๊ฒฐ
- DoesNotExist : key์ ๋ค๋ฅธ label์ pod๋ฅผ ์ฐ๊ฒฐ
$cat rs-nginx.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: rs-nginx
spec:
replicas: 3
selector:
matchLabels:
app: webui
template:
metadata:
name: nginx-pod
labels:
app: webui
spec:
containers:
- name: nginx-container
image: nginx:1.14
$ kubectl create -f rs-nginx.yaml
- ๋์์ค์ธ pod ์ ํ์ธ
$ watch kubectl get pods -o wide
- rs์ ์ ๋ณด๋ฅผ ์ถ๋ ฅ(2๊ฐ์ง ๋ฐฉ๋ฒ)
$ kubectl get replicasets
$ kubectl get rs
$ kubectl describe rs rs-nginx
- ํ๋ ์ญ์ ์ rc๊ฐ ํ๋ ์ผ์? ์ปจํธ๋กค๋ฌ๊ฐ pod ์ ๊ณ์ ์ ์ง
$ kubectl get pods
$ kubectl delete pod rs-nginx-XXXX
- pod๋ ๊ทธ๋๋ก ๋๊ณ ์ปจํธ๋กค๋ฌ๋ง ์ญ์
$ kubectl delete rs rs-nginx --cacade=false # ์ฐ์ ์ญ์ ๊ธฐ๋ฅ์ ๋นํ์ฑํ ํ๋ ์ต์
$ kubectl get rs
$ kubectl get pods
$ kubectl delete pod --all
# 3. Deployment
- ReplicaSet์ ์ ์ดํด์ฃผ๋ ๋ถ๋ชจ ์ญํ , ReplicaSet์ ์ปจํธ๋กคํด์ pod ์ ์กฐ์
- ๋ชฉ์ : Rolling Update & Rolling Back
- Rolling Update
- ํ๋ ์ธ์คํด์ค๋ฅผ ์ ์ง์ ์ผ๋ก ์๋ก์ด ๊ฒ์ผ๋ก ์ ๋ฐ์ดํธ ํ์ฌ deployment update๊ฐ ์๋น์ค ์ค๋จ ์์ด ์ด๋ฃจ์ด์ง ์ ์๋๋ก ํจ
- Rolling Back : ์ด์ ๋ฒ์ ์ผ๋ก
- Rolling Update
์์
$cat deploy-nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: deploy-nginx
spec:
replicas: 3
selector:
matchLabels:
app: webui
template:
metadata:
name: nginx-pod
labels:
app: webui
spec:
containers:
- name: nginx-container
image: nginx:1.14
$ kubectl create -f deploy-nginx.yaml
- ๋์์ค์ธ pod ์ ํ์ธ
$ watch kubectl get pods -o wide
- rs๋ฅผ ์ง์๋ deployment๊ฐ rs๋ฅผ ๋ค์ ์์ฑํ์ฌ ์ ์งํ ์ ์๋๋ก ํจ(deploy๊ฐ ์ต์์ ๊ฐ๋ )
$ kubectl delete rs deploy-nginx-XXX
$ kubectl get deployments
$ kubectl get replicasets
$ kubectl get pods
$ kubectl delete deployment deploy-nginx
Rolling Update & Rolling Back
- Rolling Update
$ kubectl set image deployment <deploy_name> <container_name> = <new_version image>
- Rolling Back
$ kubectl rollout history deployment <deploy_name>
$ kubectl rollout undo deploy <deploy_name>
doploy ์์ 1
$cat deploy-nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: app-deploy
spec:
replicas: 3
selector:
matchLabels:
app: webui
template:
metadata:
name: nginx-pod
labels:
app: webui
spec:
containers:
- image: nginx:1.14
name: web
ports :
- containerPort: 80
$ kubectl create -f deployment-exam.ymal --record
$ kubectl get deployment,rs,pod,svc
# Rolling Update
$ kubectl set image deploy app-deploy web=nginx:1.15 --record # record์ต์
: ์
๋ฐ์ดํธ ๊ณผ์ ์ history๋ก ๊ธฐ๋ก
$ kubectl set image deploy app-deploy web=nginx:1.16 --record
$ kubectl set image deploy app-deploy web=nginx:1.17 --record
# controlling Rolling Update
$ kubectl rollout pause deploy app-deploy # ์
๋ฐ์ดํธ ์ผ์์ ์ง
$ kubectl rollout resume deploy app-deploy # ์
๋ฐ์ดํธ ์ฌ์์
$ kubectl rollout status deploy app-deploy # ์
๋ฐ์ดํธ ์ํ
$ kubectl rollout history deployment app-deploy # deploy ํ์คํ ๋ฆฌ ํ์ธ
$ kubectl rollout undo deployment app-deploy # ์ด์ ๋ฒ์ ์ผ๋ก ๋กค๋ฐฑ
$ kubectl rollout undo deployment app-deploy --to-revision=3 # revision=3์ผ๋ก ๋กค๋ฐฑ
doploy ์์ 2
- yaml ํ์ผ๋ก ์์
$cat deployment-exam2.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: deploy-nginx
annotations:
kubernetes.io/change-cause: version 1.14
spec:
progressDeadlineSeconds:600
revisionHistoryLimit: 10
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
replicas: 3
selector:
matchLabels:
app: webui
template:
metadata:
name: nginx-pod
labels:
app: webui
spec:
containers:
- image: nginx:1.14
name: web
ports :
- containerPort: 80
$ kubectl apply -f deployment-exam2.yaml
$ kubectl get deployment,rs,pod,svc
# ์ด๋ฏธ์ง ์
๋ฐ์ดํธ
$ vi deployment-exam2.yaml
-> annotations:
kubernetes.io/change-cause: version 1.15
...
spec:
containers:
- image: nginx:1.15
name: web
#apply
$ kubectl apply -f deployment-exam2.yaml
# ํ์คํ ๋ฆฌ ํ์ธ & ์ด๋ฏธ์ง ๋กค๋ฐฑ
$ kubectl rollout history deployment app-deploy
$ kubectl rollout undo deployment app-deploy
4. DaemonSet
- ์ ์ฒด ๋
ธ๋์์ pod๊ฐ ๋
ธ๋๋น ํ ๊ฐ์ฉ ์คํ๋๋๋ก ๋ณด์ฅ
- ๋ ธ๋์์ ์คํ๋๋ pod๊ฐ ๋ฌธ์ ๊ฐ ์๊ธธ ๊ฒฝ์ฐ ์ญ์ ๋ ํ ๋ ธ๋ ์์ฑํด์ฃผ๋ ์ญํ
- ๋ก๊ทธ ์์ ๊ธฐ, ๋ชจ๋ํฐ๋ง ์์ด์ ํธ์ ๊ฐ์ ํ๋ก๊ทธ๋จ ์คํ์ ์ ์ฉ
$cat daemonset-nginx.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: daemonset-nginx
spec:
replicas: 3
selector:
matchLabels:
app: webui
template:
metadata:
name: nginx-pod
labels:
app: webui
spec:
containers:
- image: nginx:1.14
name: nginx-container
$ kubectl create -f daemonset-nginx.yaml
$ kubectl get daemonset
$ kubectl get pods
# daemonset์ผ๋ก ๋์์ค์ธ pod ์ญ์ ํ๋ฉด?
$ kubectl delete daemonset-nginx-XXX # daemonset rolling update - ์คํ๋๊ณ ์๋ ์ปจํ
์ด๋ ๋ฒ์ ์์ ๋ณ๊ฒฝ
$ kubectl edit ds daemonset-nginx
...
-> containers:
- image: nginx:1.15 # rolling back
$ kubectl rollout undo daemonset daemonset-nginx # ์ญ์
$ kubectl delete daemonsets.apps daemonset-nginx
5. statefulset
- pod์ ์ํ๋ฅผ ์ ์งํด์ฃผ๋ ์ปจํธ๋กค๋ฌ
- pod ์ด๋ฆ
- ์ปจํธ๋กค๋ฌ๋ฅผ ์ด์ฉํด์ pod ์ญ์ ๋ฐ ์ฌ์์ฑํ ๊ฒฝ์ฐ pod์ ์ด๋ฆ์ด ๋ณด์ฅ๋์ง ์๊ณ ์์ฑ๋จ
- statefulset ์ผ๋ก ์คํํ ๊ฒฝ์ฐ, ์์ฐจ์ ์ผ๋ก ๋ฒํธ๊ฐ ๋ถ์ด ์์ฑ๋จ
- ์์ฑ ์์์ ๋ฐ๋ฅธ ๋ฒํธ๊ฐ ๋ถ์ด pod ์ด๋ฆ์ด ๋ณด์ฅ
- pod ๋ณผ๋ฅจ(์คํ ๋ฆฌ์ง)
- pod ์ด๋ฆ
$cat statefulset-exam.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: sf-nginx
spec:
replicas: 3
serviceName: sf-service
podManagementPolicy: Parallel
selector:
matchLabels:
app: webui
template:
metadata:
name: nginx-pod
labels:
app: webui
spec:
containers:
- name: nginx-container
image: nginx:1.14
$ kubectl create -f statefulset-exam.yaml
$ kubectl get statefulsets,pod # ๋์์ค์ธ ๋๋ฒ์งธ pod ์ญ์ -> 1๋ฒ์ด ์์ ํ ์ญ์ ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฐ ๋ค์ 1๋ฒ์ ์์ฑํจ
$ kubectl delete pod sf-nginx-1
# scale down / up
$ kubectl scale statefulset sf-nginx --replicas=2 # 2๋ฒ pod ์ญ์
$ kubectl scale statefulset sf-nginx --replicas=4 # 3๋ฒ pod ์์ฑ
# rolling update / rolling back
$ kubectl edit statefulsets.apps sf-nginx
$ kubectl rollout undo statefulsets.apps sf-nginx
6. JOB
- Kubernetessms pod๋ฅผ running์ค์ธ ์ํ๋ก ์ ์ง
- Batch ์ฒ๋ฆฌํ๋ pod๋ ์์ ์ด ์๋ฃ๋๋ฉด ์ข ๋ฃ๋จ
- Batch ์ฒ๋ฆฌ์ ์ ํฉํ ์ปจํธ๋กค๋ฌ๋ก pod์ ์ฑ๊ณต์ ์ธ ์๋ฃ๋ฅผ ๋ณด์ฅ
- ๋น์ ์ ์ข ๋ฃ ์ ๋ค์ ์คํ
- ์ ์ ์ข ๋ฃ์ ์๋ฃ
$cat job-exam.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: centos-job
spec:
# completions: 5 # ์คํํด์ผ ํ job์ ์๊ฐ ๋ช๊ฐ์ธ์ง ์ง์
# parallelism: 2 # ๋ณ๋ ฌ์ฑ. ๋์ running๋๋ pod ์
# activeDeadlineSecons: 15 # ์ง์ ์๊ฐ ๋ด์ job์ ์๋ฃ, ์ง์ ์๊ฐ์์ ๋๋์ง ์์ผ๋ฉด ๊ฐ์ ์๋ฃ
template:
spec:
containers:
- name: centos-container
image: centos:7
command: ["bash"]
args:
- "-c"
- "echo 'Hello World'; sleep 50; echo 'Bye'"
restartPolicy: Never # ๋น์ ์ ์ข
๋ฃ์ pod๋ง restart
# restartPolicy: OnFailure # ๋น์ ์ ์ข
๋ฃ์ ์ปจํ
์ด๋๋ฅผ restart
# backoffLimit : 3 # restart limit ๊น์ง restart ๋๊ณ ๊ทธ๋๋ ์๋๋ฉด ์์
์์ฒด๋ฅผ ์ญ์
- 50์ด ๋์ ์คํ
- 50์ด ์ด๋ด์ ๋น์ ์ ์ข ๋ฃ๋๋ฉด -> ๋ค์ pod ์์ฑํ์ฌ ์ฌ์ํ
- 50์ด ํ ์ ์ ์ข ๋ฃ๋๋ฉด ๋(๋์ด์์ ์คํ x)
$ kubectl create -f job-exam.yaml
$ kubectl get job,pods
$ kubectl get pods
$ kubectl delete jobs.apps centos-job
7. CronJob
- CronJob์์ job์ ์ปจํธ๋กค ๊ธฐ๋ฅ ํฌํจ, job ์ปจํธ๋กค๋ฌ๋ก ์คํํ application pod๋ฅผ ์ฃผ๊ธฐ์ ์ผ๋ก ๋ฐ๋ณตํ์ฌ ์คํ
- Linux์ cronjob์ ์ค์ผ์ค๋ง ๊ธฐ๋ฅ์ job controller์ ์ถ๊ฐํ API(์ฌ์ฉ์๊ฐ ์ํ๋ ์ฌ๊ฐ์ job ์คํ ์์ฝ ์ง์)
- ๋ค์๊ณผ ๊ฐ์ ๋ฐ๋ณตํด์ ์คํํ๋ job์ ์ด์ํด์ผ ํ ๋ ์ฌ์ฉ
- Data Backup
- Send email
- Cleaning tasks
- Cronjob Schedule: โ0 3 1 * * โ
- Minutes (from 0 to 59)
- Hours (from 0 to 23)
- Day (from 1 to 31)
- Month (from 1 to 12)
- Day of the week (from 0 to 6)
$cat cronjob-exam.yaml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: cronjob-exam
spec:
schedule: "* * * * *"
startingDeadlineSeconds: 500
# successfulJobHistoryLimit: 3 # ์ฑ๊ณตํ job์ ๋ํด์ history 3๊ฐ๊น์ง๋ง ๋จ๊ธฐ๊ฒ ์ด
concurrencyPolicy: Forbid # ํ๋ฒ์ ํ๋์ฉ๋ง running
# concurrencyPolicy: ALLOW # ํ๋ฒ์ ์ฌ๋ฌ๊ฐ์ job์ด running ์ค์ด์ด๋ ๋จ
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
args:
- /bin/sh
- -c
- "echo 'Hello World'; sleep 10; echo 'Bye'"
restartPolicy: Never
$ kubectl create -f cronjob-exam.yaml
$ kubectl get cronjob
$ kubectl get pods
$ kubectl delete cronjob cronjob-exam