์ดํ๋ฆฌ์ผ์ด์ ์ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ workload API ๊ฐ์ฒด
ํฌ๋๋ฅผ ์ง์ ๋ค ๋ค์ ์์ฑํด๋ ๋ฆฌ์์ค๋ฅผ ์ ์ง๊ฐ๋ฅํ Stateful ์ํ
(์ฌ์ฉ ์ผ์ด์ค)
๊ฐ ํ์ํ ๊ฒฝ์ฐ ์ฌ์ฉํ๋ค
- ์ง์ ๋ ํฌ๋์ ์คํ ๋ฆฌ์ง๋ ์์ฒญ๋ ์คํ ๋ฆฌ์ง ํด๋์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก Persistent Volume Provisioner์ ์ํด ํ๋ก๋น์ ๋๋๊ฑฐ๋ ๊ด๋ฆฌ์์ ์ํด ์ฌ์ ํ๋ก๋น์ ๋๋์ด์ผ ํฉ๋๋ค.
- StatefulSet์ ์ญ์ ํ๊ฑฐ๋ ์ถ์ํด๋ StatefulSet๊ณผ ๊ด๋ จ๋ ๋ณผ๋ฅจ์ ์ญ์ ๋์ง ์์ต๋๋ค. ์ด๋ ์ผ๋ฐ์ ์ผ๋ก ๋ชจ๋ ๊ด๋ จ StatefulSet ๋ฆฌ์์ค๋ฅผ ์๋์ผ๋ก ์ ๊ฑฐํ๋ ๊ฒ๋ณด๋ค ๋ ๊ฐ์น ์๋ ๋ฐ์ดํฐ ์์ ์ ๋ณด์ฅํ๊ธฐ ์ํด ์ํ๋ฉ๋๋ค. (๊ด๋ฆฌ์๊ฐ ๊ด๋ฆฌ๋ฅผ ํด์ค์ผํจ)
- StatefulSets๋ ํ์ฌ Pods์ ๋คํธ์ํฌ ID๋ฅผ ์ฑ ์์ง๋ ํค๋๋ฆฌ์ค ์๋น์ค๊ฐ ํ์ํฉ๋๋ค. ์ฌ์ฉ์๋ ์ด ์๋น์ค๋ฅผ ๋ง๋ค ์ฑ ์์ด ์์ต๋๋ค.
- StatefulSet๋ StatefulSet์ ์ญ์ ํ ๋ ํฌ๋์ ์ข ๋ฃ์ ๋ํ ๋ณด์ฅ์ ์ ๊ณตํ์ง ์์ต๋๋ค. StatefulSet์์ ํฌ๋์ ์ง์ ์๋ ์ ์ ์ข ๋ฃ๋ฅผ ๋ฌ์ฑํ๊ธฐ ์ํด ์ญ์ ์ ์ StatefulSet์ 0์ผ๋ก ์ถ์ํ ์ ์์ต๋๋ค.
- ๊ธฐ๋ณธ Pod Management Policy(OrderedReady)์ ํจ๊ป Rolling Updates(๋กค๋ง ์ ๋ฐ์ดํธ)๋ฅผ ์ฌ์ฉํ๋ฉด ๋ณต๊ตฌ์ ์๋ ๊ฐ์ ์ด ํ์ํ ๊ณ ์ฅ ์ํ๊ฐ ๋ ์ ์์ต๋๋ค. (์๋๋ณต๊ตฌ ํ์)
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: nginx
clusterIP : None์ผ๋ก ์์ฑ
- ๊ธฐ์กด ์๋น์ค์ ๋ฌ๋ฆฌ kube-proxy ๊ฐ ๋ฐธ๋ฐ์ฑ์ด๋ ํ๋ก์ ํํ๋ก ๋์ํ์ง ์์.
- ๋๋ฉ์ธ ๋ค์์ ์ฌ์ฉํด์ ํฌ๋์ ์ ๊ทผ ๊ฐ๋ฅํจ.
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
selector:
matchLabels:
app: nginx # has to match .spec.template.metadata.labels
serviceName: "nginx" # ํค๋๋ฆฌ์ค ์๋น์ค ์ค์
replicas: 3 # by default is 1
minReadySeconds: 10 # by default is 0
template:
metadata:
labels:
app: nginx # has to match .spec.selector.matchLabels
spec:
terminationGracePeriodSeconds: 10 # ๊ฐ์ ์ข
๋ฃ๊น์ง ๋ ใ
ฃ์๊ฐ
containers:
- name: nginx
image: registry.k8s.io/nginx-slim:0.8
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates: # pvc๋ฅผ ํฌ๋์ ํจ๊ป ๋ง๋ค์ด์ค (ํ๋์ pvc๊ฐ ํ๋์ฉ ๋ฌผ๋ฆผ)
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "my-storage-class"
resources:
requests:
storage: 1Gi
- serviceName
- ์ฐ๊ฒฐํ ํค๋๋ฆฌ์ค ์๋น์ค ์ง์ , ๋ ์ด๋ธ ์ผ์น
- terminationGracePeriodSeconds
- ์ผ๋ฐํฌ๋์ ๋ค์ด๊ฐ ์ ์๋ ์ค์ . ์ข ๋ฃ ์์ฒญํ ๊ธฐ๋ค๋ฆด ์๊ฐ
- volumeClaimTemplate
- volumeClaim ํ ํ๋ฆฟ ์์ฑ
- volumeMounts
- ๋ถ๋ฅจ ๋ง์ดํธ ์ค์
๋ฐฐํฌ ์์ : 0 ~ n
์ข ๋ฃ/ ์ ๋ฐ์ดํธ ์์ : n ~ 0
OnDelete : ์ญ์ ์ ์๋ก ํ๋ ๋ง๋ฌ
RollingUpdate : ๋ํ๋ก์ด๋จผํธ์ ๋์ผํ ๋กค๋ง์ ๋ฐ์ดํธ ์ ๋ต(ํ๋ ์ ๋ฐ์ดํธ ํ๋ ๊ต์ฒด)
nginx-statefulset.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
selector:
matchLabels:
app: nginx # has to match .spec.template.metadata.labels
serviceName: "nginx"
replicas: 3 # by default is 1
minReadySeconds: 10 # by default is 0
template:
metadata:
labels:
app: nginx # has to match .spec.selector.matchLabels
spec:
terminationGracePeriodSeconds: 10
containers:
- name: nginx
image: registry.k8s.io/nginx-slim:0.8
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "standard"
resources:
requests:
storage: 1Gi
pending์ํ ๋ฐ์
Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal NotTriggerScaleUp 3m37s cluster-autoscaler pod didn't trigger scale-up: Warning FailedScheduling 13s (x5 over 3m39s) default-scheduler 0/3 nodes are available: pod has unbound immediate PersistentVolumeClaims. preemption: 0/3 nodes are available: 3 No preemption victims found for incoming pod..
storageClass ์ค์ ์ ์๋ชปํด์ ์ผ์ด๋ ์ค๋ฅ์๋ค.
->storageClassName: "standard"
๋ํ๋ก์ด๋จผํธ์ ๋ค๋ฅด๊ฒ ๋ ํ๋ฆฌ์นด์ ์ ๊ฐ์ง์ง ์์
web-0 ํ๋๋ฅผ ์ญ์ ํ๋ค ๋ค์ ์คํํด๋ www-web-0 pvc์ ๋ค์ ์ฐ๊ฒฐ๋จ
kubectl run -i --tty --image busybox:1.28 dns-test --restart=Never --rm /bin/sh
kubectl run -i --tty --image busybox:1.28 dns-test --restart=Never --rm /bin/sh If you don't see a command prompt, try pressing enter. / # nslookup web-0.nginx.default.svc Server: 10.8.0.10 Address 1: 10.8.0.10 kube-dns.kube-system.svc.cluster.local Name: web-0.nginx.default.svc Address 1: 10.4.1.45 web-0.nginx.default.svc.cluster.local / # nslookup web-1.nginx.default.svc Server: 10.8.0.10 Address 1: 10.8.0.10 kube-dns.kube-system.svc.cluster.local Name: web-1.nginx.default.svc Address 1: 10.4.2.28 web-1.nginx.default.svc.cluster.local / # nslookup web-2.nginx.default.svc Server: 10.8.0.10 Address 1: 10.8.0.10 kube-dns.kube-system.svc.cluster.local Name: web-2.nginx.default.svc Address 1: 10.4.0.32 web-2.nginx.default.svc.cluster.local
์ฌ๋ฐ๋ฅด๊ฒ ์ฐ๊ฒฐ๋ ๋ชจ์ต
kubectl scale statefulset web --replicas 5
ํ๋์ฉ ์ฐจ๊ทผ์ฐจ๊ทผ ๋ง๋ค์ด์ง๋ ๋ชจ์ต
์ญ์์ผ๋ก ์ญ์ ๋จ
kubectl delete statefulSet <์คํ ์ดํธํ์ ์ด๋ฆ>
-> ํด๋ pvc ์ญ์ ๋์ง ์์.
-> ๋ค์ pod์คํ๋๋ฉด ์ง์ ๋์ด ๋ง์ดํธ๋จ.