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

Subscribe to flynn's devnote

Don’t miss out on the latest issues. Sign up now to get access to the library of members-only issues.
jamie@example.com
Subscribe