Print
카테고리: [ Cloud Computing & MSA ]
조회수: 11797

StatefulSet


1. 개념

StatefulSet은 이름 그대로 고유 상태가 유지되는 Pod Set을 의미한다.

StatefulSet은 Deloyment(ReplicaSet)와 마찬가지로 동일한 이미지를 가진 Pod를 배포한다. 하지만, set 안의 Pod에 대한 순서와 고유성을 보장한다는 점에서 다르다. Deployment를 통해 Pod를 배포하게 되면 State와 상관 없이 동일한 역할을 하는 Pod가 여러개 띄워지지만, StatefulSet을 통해 Pod를 배포하게 되면 동일한 스펙을 지녔지만 서로 교체 불가능한 Pod가 생성된다.

StatefulSet을 적용하면 Pod가 다시 스케쥴링 될 때 명명규칙과 네트워크, 저장소가 그대로 유지된다.


2. 예시

StatefulSet은 Pod가 고유한 IP/Storage/식별자를 갖게 되므로, 다음과 같은 경우에 사용할 수 있다.


3. Headless Service

Headless 서비스는 해당 Pod Set에 대해 직접 접근 가능한 고유 IP를 부여한다.

ClusterIP, NodePort, LoadBalancer와 같은 다른 타입의 서비스는 클라이언트가 Pod에 접근하기 위해 kube-proxy로 접근한 후 프록시되어 pod에 액세스 하게 된다. 프록시로 접근하는 경우, 현재 연결된 Pod와 다음번에 연결될 Pod가 같다는 보장을 할 수 없기 때문에, Stateful한 애플리케이션에 적합하지 않다.

Headless 타입의 서비스를 생성하면 클러스터 네트워크 내부에서 서비스에 속한 Pod에 직접 접근 가능한 고유 IP와 DNS가 생긴다.

$ nslookup web-0.nginx
Server:    10.0.0.10
Address 1: 10.0.0.10 kube-dns.kube-system.svc.cluster.local

Name:      web-0.nginx
Address 1: 10.244.1.6

$ nslookup web-1.nginx
Server:    10.0.0.10
Address 1: 10.0.0.10 kube-dns.kube-system.svc.cluster.local

Name:      web-1.nginx
Address 1: 10.244.2.6

 


4. Headless Service 생성

Headless Service를 생성하는 방법은 StatefulSet에 대해 ClusterIP: None인 서비스를 생성하는 것이다.

apiVersion: v1
kind: Service
metadata:
  name: headless-app
  labels:
    app: headless-app
spec:
  ports:
  - port: 80
    name: headless-app-port
  clusterIP: None
  selector:
    app: headless-app

$ k apply -f headless-service.yaml -n headless
service/nginx created
statefulset.apps/web created

## Pod가 순차적으로 생겨난다.
$ k get pods -n headless -o wide
NAME    READY   STATUS    RESTARTS   AGE   IP           NODE             NOMINATED NODE   READINESS GATES
web-0   1/1     Running   0          90s   10.1.25.67   docker-desktop   <none>           <none>
web-1   1/1     Running   0          65s   10.1.25.68   docker-desktop   <none>           <none>