ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 쿠버네티스 컨트롤러 : 스테이트풀셋(StatefulSets)
    Kubernetes 2018. 6. 22. 09:00
    반응형
    앞서 살펴봤던 리플리카컨트롤러, 리플리케이션셋, 디플로이먼트는 모두 상태가 없는(stateless) 포드들을 관리하는 용도 였습니다. 스테이트풀셋(StatefulSets)은 단어의 의미 그대로 상태를 가지고 있는 포드들을 관리하는 컨트롤러 입니다. 스테이트풀셋을 사용하면 볼륨을 사용해서 특정 데이터를 기록해두고 그걸 포드가 재시작했을때도 유지할 수 있습니다. 여러개의 포드를 띄울때 포드 사이에 순서를 지정해서 지정된 순서대로 포드가  실행되게 할수도 있습니다. 이런식으로 어떠한 상태를 가지고 있어야 할때 사용하는게 스테이트풀 셋입니다.

    스테이트풀셋을 실행할수 있는 예제 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
      template:
        metadata:
          labels:
            app: nginx # has to match .spec.selector.matchLabels
        spec:
          terminationGracePeriodSeconds: 10
          containers:
          - name: nginx
            image: k8s.gcr.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: "my-storage-class"
          resources:
            requests:
              storage: 1Gi
    실행하면 포드가 하나씩 순서대로 실행되는걸 볼 수 있습니다. 기존과는 다르게 포드 이름에 uuid형식의 접미사가 붙는데 아니라 web이라는 이름 뒤에 -0, -1, -2 이렇게 숫자가 순서대로 붙는걸 볼 수 있습니다. 포드가 실행될때는 작은 숫자부터 순서대로 0, 1, 2번이 실행되고 삭제될때는 반대로 큰숫자가 붙은 포드부터 2, 1, 0의 순서로 삭제됩니다. 순서대로 실행되어야 하기 때문에 0번이 정상적으로 실행되지 않았다면 1번은 실행되지 않습니다. 마찬가지로 1번이 실행되지 않았다면 2번 또한 실행되지 않습니다. 실행중인 스테이트풀셋의 replicas를 줄이면 가장큰 2번부터 먼저 삭제됩니다. 스테이트풀셋의 기본동작은 이렇게 순서대로 포드를 관리하는 것이지만 그 옵션은 .spec.podManagementPolicy에서 변경할수도 있습니다. 여기서 기본옵션은 OrderedReady라서 포드를 순서대로 관리하게 하고, 이걸 Parallel으로 변경하면 포드들이 순서없이 병렬로 실행되거나 종료되게 할 수 있습니다.
    스테이트풀셋의 업데이트 방법은 .spec.updateStrategy.type에 지정할수 있습니다. 기본값은 OnDelete입니다. OnDelete일때는 스테이트풀셋의 템플릿을 변경해도 바로 반영되지 않습니다. 수동으로 스테이트풀셋에 속한 포드들을 삭제했을때 새로운 설정을 가진 포드가 실행되게 됩니다. RollingUpdate으로 설정하면 템플릿 변경이 있을때 수동으로 할 필요 없이 자동으로 예전 포드를 삭제하고 새로운 포드를 실행하게 됩니다. .spec.updateStrategy.rollingUpdate.partition 으로 옵션을 지정하면 지정된 파티션 개수보다 많거나 같은 개수의 포드가 한꺼번에 업데이트 됩니다.
    kubectl describe web-0으로 포드 상태를 확인해 보면 Labels에 statefulset.kubernetes.io/pod-name=web-0 처럼 어노테이션이 추가되어 있는 것도 확인할 수 있습니다. 이 라벨을 이용하면 스테이트풀셋이 관리하는 전체 포드중에서 특정 포드에만 서비스를 연결하는 것이 가능합니다. 


    반응형

    댓글

Designed by Tistory.