Kubernetes - Statefulset

요약

Kubernetes 기초

Kubernetes 큰 주제 아래에서 세부 개념과 실습 절차를 연결하기 위한 노트입니다.

핵심 포인트

  • Kubernetes 기초
  • 스테이트풀셋 Statefulset
  • Statefulset의 장점
  • Headless서비스 작성 요령
  • 정의

지식 그래프

정리 내용

스테이트풀셋 Statefulset

  • 안정적이고 고유한 네트워크 식별자가 필요한 경우
  • 안정적이고 지속적인 스토리지를 사용해야 하는 경우
  • 질서 정연한 포드의 배치와 확장을 원하는 경우
    • 이름이 랜덤이 아닌 순서대로 생성됨
  • 포드의 자동 롤링 업데이트를 사용하기 원하는 경우

Statefulset의 장점

  • 스테이트풀셋과 곤련된 볼륨은 삭제되지 않음 (관리필요)
  • 포드의 스토리지는 PV나 스토리지 클래스로 프로비저닝 수행해야함
  • 롤링 업데이트를 수행하는 경우 수동으로 복구해야 할 수 있음
    • 롤링 업데이트 수행 시 기존의 스토리지와 충돌로인해 애플리케이션이 오류가 발생할 수 있다.
  • 포드 네트워크 ID를 유지하기 위해 헤드레스(headless)서비스 필

상태를 유지할 수 있다는 장점이 있지만, 포드를 각각 따로 관리해야 한다는 문제점이 동반된다. 따라서 스테이트풀셋을 사용할 건지 디플로이먼트를 사용 할 것인지는 프로젝트 상황에 따라서 달라진다.

Headless서비스 작성 요령

쿠버네티스 서비스 생성 시 .spec.clusterIP 필드 값을 None으로 설정하면 클러스터 IP가 없는 서비스를 만들 수 있습니다. 이런 서비스를 ‘헤드리스 서비스(Headless Service)‘라고 합니다. 헤드리스 서비스의 경우 클러스터 IP가 할당되지 않고, kube-proxy가 이렇나 서비스를 처리하지 않으며, 로드 밸런싱 또는 프록시 동작을 수행하지 않습니다. DNS가 자동으로 구성되는 방법은 서비스에 셀렉터가 정의되어 있는지 여부에 달려있습니다.

정의

  • ClusterIP가 없는 서비스로 단일 진입점이 필요 없을 때 사용
  • Service와 연결된 Pod의 endpoint로 DNS 레코드가 생성됨
    • 쿠버네티스 coreDNS에 등록되며 DNS resolving Service로 요청이 가능해진다.
  • Pod의 DNS 주소: pod-ip-addr.namespace.pod.cluster.local
apiVersion: v1
kind: Service
metadata:
  name: headless-service
spec:
  type: ClusterIP
  clusterIP: None
  selector:
    app: webui
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

출처