[Kubernetes](StatuefulSet)Kubernetes StatefulSet Update strategy
업데이트:
스테이트풀셋의 .spec.updateStrategy
필드는 스테이트풀셋의 파드에 대한 컨테이너, 레이블, 리소스의 요청/제한 그리고 주석에 대한 자동화된 롤링 업데이트를 구성하거나 비활성화할 수 있다. 두 가지 가능한 전략이 있다.
RollingUpdate
파드를 순차적으로 업데이트 한다.
OnDelete
파드를 자동으로 업데이트하지 않는다. 사용자는 컨트롤러가 스테이트풀셋의 .spec.template
를 반영하는 수정된 새로운 파드를 생성하도록 수동으로 파드를 삭제해야 한다.
rollingUpdate (default)
#중간생략
spec:
terminationGracePeriodSeconds: 10
containers:
- name: nginx-statefulset
image: nginx
ports:
- containerPort: 80
name: web
env:
- name: testenv
value: testvalue01
env 내용을 추가하고 재배포한다.
$ kubectl apply -f statefulset-env.yaml
service/nginx-statefulset-service unchanged
statefulset.apps/web configured
재시작 순서 확인
$ kubectl get pods | grep web
web-0 1/1 Running 0 10s
web-1 1/1 Running 0 29s
web-2 1/1 Running 0 42s
web-parallel-0 1/1 Running 0 12m
web-parallel-1 1/1 Running 0 12m
web-parallel-2 1/1 Running 0 12m
2→1→0 순으로 파드가 재시작 된 것을 알 수 있다.
partition option
$ kubectl edit statefulset web
statefulset.apps/web edited
## 중략
updateStrategy:
rollingUpdate:
partition: 1
type: RollingUpdate
updateStrategy.rollingUpdate.partition
: 1 추가
업데이트 테스트를 위한 환경변수 변경
metadata:
creationTimestamp: null
labels:
app: nginx-statefulset
spec:
containers:
- env:
- name: testenv
value: testvalue01->04
환경변수 확인
[dewble@instance-1 yaml]$ kubectl get pods -o jsonpath="{range .items[*]}{.metadata.name}{.spec.containers[0].env}{'\n'}{end}" |grep web
web-0[{"name":"testenv","value":"testvalue01"}]
web-1[{"name":"testenv","value":"testvalue04"}]
web-2[{"name":"testenv","value":"testvalue04"}]
.spec.updateStrategy.rollingUpdate.partition
필드 값 1보다 작은 번호의 파드들의 변경 사항을 업데이트하지 않는다.- partition 필드값이 replicas 필드값 보다 크면
.spec.template
필드에 변경 사항이 있더라도 업데이트하지 않는다.
OnDelete
apiVersion: v1
kind: Service
metadata:
name: nginx-statefulset-service
labels:
app: nginx-statefulset-service
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: nginx-statefulset-service
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web-ondelete
spec:
selector:
matchLabels:
app: nginx-statefulset
serviceName: "nginx-statefulset-service"
replicas: 3
template:
metadata:
labels:
app: nginx-statefulset
spec:
terminationGracePeriodSeconds: 10
containers:
- name: nginx-statefulset
image: nginx
ports:
- containerPort: 80
name: web
env:
- name: testenv
value: testvalue01
**updateStrategy:
type: OnDelete**
[dewble@instance-1 yaml]$ kubectl apply -f statefulset-ondelete.yaml
service/nginx-statefulset-service unchanged
statefulset.apps/web-ondelete created
env 변경
[dewble@instance-1 yaml]$ kubectl edit statefulset web-ondelete
statefulset.apps/web-ondelete edited
containers:
- env:
- name: testenv
value: testvalue02
env 변경 확인
[dewble@instance-1 yaml]$ kubectl get pods -o jsonpath="{range .items[*]}{.metadata.name}{.spec.containers[0].env}{'\n'}{end}" |grep web
web-ondelete-0[{"name":"testenv","value":"testvalue01"}]
web-ondelete-1[{"name":"testenv","value":"testvalue01"}]
web-ondelete-2[{"name":"testenv","value":"testvalue01"}]
test value가 변경되지 않았다.
pod 삭제후 확인
[dewble@instance-1 yaml]$ kubectl delete pods web-ondelete-2
pod "web-ondelete-2" deleted
[dewble@instance-1 yaml]$ kubectl get pods -o jsonpath="{range .items[*]}{.metadata.name}{.spec.containers[0].env}{'\n'}{end}" |grep web
web-ondelete-0[{"name":"testenv","value":"testvalue01"}]
web-ondelete-1[{"name":"testenv","value":"testvalue01"}]
web-ondelete-2[{"name":"testenv","value":"testvalue02"}]
web-ondelete-2 의 env 값이 변경된 것을 알 수 있다.
https://kubernetes.io/ko/docs/concepts/workloads/controllers/statefulset/
댓글남기기