/ kubernetes

Kubernetes StatefulSets

StatefulSets

beta feature in 1.7
이전에는 PetSets이였고 이제부터 StatefulSets로 변경되었다.

사용용도

  • 안정적인 고유한 네트워크 식별자
  • 안정적인 영구 스토리지
  • 순서 있는 안전한 배포 및 확장
  • 순서 있는 안전한 삭제 및 종료
  • 순서가 지정된 자동 롤링 업데이트

stateless한 요구사항은 DeploymentReplicaSet을 이용한다.

한계

  • Kubernetes 1.5+
  • alpha/beta 기능이라서 apiserver에서 --runtime-config옵션으로 기능 비활성화 가능함
  • 스토리지는 storage class를 이용해서 프로비저닝을 하거나 아니면 미리 만들어 둔 디스크를 사용함
  • 삭제나 스케일 다운을 할 경우 스토리지빼고는 모두 지움(스토리지의 안정성을 위함)
  • Pods의 네트워크를 식별을 책임지기 위해 Headless Service가 꼭 필요함

구성요소

Headless Service

network domain 관리용

StatefulSet

N개의 Replica Unique Pod를 생성하는 일을 함

volumeClaimTemplates

PersistentVolumes을 프로비저닝 하는 역할

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx
---
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
  name: web
spec:
  serviceName: "nginx"
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: nginx
        image: gcr.io/google_containers/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: my-storage-class
      resources:
        requests:
          storage: 1Gi

Pod Idenity

Ordinal Index

N replica 가 존재함 정수형 순서값을 할당 받음 [0, N)

Stable Network ID

  • Pod Hostname : $(statefulset name)-$(ordinal)
  • StatefulSet Domain : $(service name).$(namespace).svc.cluster.local
  • Pod DNS : $(podname).$(govering service domain)

Stable Storage

  • VolumeClaimTemplate에 명시된 PersistentVolume을 생성함
  • StorageClass로 생성하고 없으면 기본 StorageClass를 사용
  • Pod가 스케쥴이 될때 PersistentVolume을 volumeMounts
  • Pod나 StatefulSet이 삭제될때 PersistentVolume은 삭제 되지 않음
  • 삭제는 수동으로 해야함

배포와 확장 보증

  • StatefulSet에 N replica 값으로 Pods가 순서대로 배포됨(0...N-1)
  • Pods가 삭제되면 생성된 순서와 반대순으로 종료됨(N-1...0)
  • 모든 선행 작업이 기동되고 준비가 되어야 Pod 확장이 적용됨
  • 모든 선행 종료가 되어야 Pod가 종료됨

Pod 관리 정책

.spec.podManagementPolicy

OrderedReady

StatefulSets의 기본정책

Parallel

병렬로 배포되고 종료되게 함 다른 Pod의 작업을 기다리지 않음

업데이트 전략

.spec.updateStrategy

On Delete

  • 업데이트 내용 반영은 pod 삭제 후에 반영됨
  • .spec.updateStrategy 값이 없으면 선택되는 기본값
  • .spec.updateStrategy.type 필드에 OnDelete값 설정

Rolling Updates

  • .spec.updateStrategy.typeRollingUpdate 설정함
  • Pod 업데이트 순서는 삭제 순서와 같고 선행 작업이 완전히 완료되야만 다음 진행

Partitions

.spec.updateStrategy.rollingUpdate.partition