연재 시리즈

쿠버네티스 오퍼레이터 스터디 1주차 - statefulset이란

악분 2022. 5. 23. 22:33
반응형

이 글은 1주차에서 진행한 statefulset을 정리한 내용입니다.

 

1. stateful vs stateless

statefulset을 공부하기 전, stateful과 stateless어감부터 느껴야 합니다. 컴퓨터 과학(CS)에서는 관계의 상태를 유지하는 것을 stateful이라고 부릅니다. 반대로, 관계를 유지 않으면 stateless라고 부릅니다

 

대표적인 예로 네트워크 통신이 있습니다. 4계층 관점에서 TCP는 신뢰성을 보장하기 위해 상태를 유지하는 stateful이고 UDP는 상태를 유지하지 않는 stateless 프로토콜입니다. 7계층 관점에서는 HTTP는 상태를 저장하지 않는 stateless프로토콜입니다.

 

그대로 쿠버네티스에 적용하면, 쿠버네티스 어떤? 관계 유지 설정 해주는 것이 바로 statefulset입니다.

 

2. 쿠버네티스에서 stateful이란?

쿠버네티스에서는 어떤 관계를 유지를 하여 애플리케이션의 안정적인 상태를 가지게 합니다. 그러므로, 안정적인 상태가 필요한 애플리케이션(예: DB)에 많이 사용됩니다.

 

그렇다면, 쿠버네티스에서는 어떤 상태를 안정하게 유지할까요?. 공식문서[1]에 설명되어 있는 것처럼 파드신원을 유지합니다. 파드 신원은 포괄적인 개념이고 아래 상세항목을 안전한 상태로 유지합니다.

  • 파드 이름
  • 네트워크 신원
  • 스토리지 관계

 

사실 공식문서만 보고 statefulset을 처음 이해하기에는 너무 어렵습니다. 그래서, "쿠버네티스 in action"책 설명처럼 replicaset과 statefulset을 비교하려고 합니다.

replicaset은 deployment로 대체합니다.

 

3. statefulset에서 유지하는 안전한 상태

3.1. 파드 이름

replicaset은 파드가 삭제되면 새로운 이름으로 파드가 생성됩니다. 

deployment예제 링크: https://github.com/choisungwook/kubernetes_operator_study/blob/main/1week/deployment.yaml

삭제한 파드와 생성된 파드이름이 불일치

 

반면, statfulset은 파드이름이 {파드이름}-0부터 시작합니다. 그리고 삭제한 파드는 삭제되었던 파드이름 그대로 생성됩니다.

statefuleset 예제 링크: https://github.com/choisungwook/kubernetes_operator_study/blob/main/1week/statefulset.yaml

이름순서대로 생성되는 파드

 

3.1 네트워크 신원

statefulset은 파드가 재실행되어도 호스트네임이 같습니다. 

  • hostname 이름 규칙: $(statefulset name)-$(ordinal)

statefulset hostname

 

반면 replicaset의 hostname은 랜덤 값이면서 파드가 재실행될때마다 달라집니다. 

replicaset hostname

 

그리고 statefulset은 SRV 레코드가 설정되어 파드마다 고유한 서브도메인을 갖습니다. 서브도메인은 쿠버네티스 서비스리소스 도메인(headless)을 가리킵니다. 서브도메인은 파드가 재실행되어도 변경되지 않습니다. 서브도메인은 statefulset의 servicename필드를 사용하여 이름이 결정됩니다.

  • 서브도메인 이름 규칙: $(podname).$(servicename)

 

서브도메인은 srv타입으로 도메인질의를 해야 확인할 수 있습니다. 서브도메인은 쿠버네티스 서비스 리소스 도메인을 가르키지만 아직 생성되지 않아, 해당도메인과 통신이 되지 않습니다. 이 도메인은 headless글에서 자세히 다룹니다.

kubectl run -it --rm netdebug --image=nicolaka/netshoot --restart=Never -- zsh
nslookup -type=srv week1-sts-0.week1-sts

 

서브도메인 확인

 

3.2 스토리지 관계

replicaset는 파드수가 증가하면 모든 파드가 동일한 pvc를 바라봅니다.

 

statefulset는 파드가 증가하면, 각 파드는 자기만의 pvc를 갖습니다. 그리고 파드가 재부팅되어도 한번 연결된 pvc로 계속 연결됩니다. 이 구조는 자기만의 스토리지를 필요하는 분산 데이터 저장소에 적합합니다.

 

4. 참고자료

[1] 쿠버네티스 공식문서: https://kubernetes.io/ko/docs/concepts/workloads/controllers/statefulset/

[2] 쿠버네티스 in action 책

공백

반응형