T-스테이트풀셋과 연결되는 헤드리스 서비스에 관한 실험

개요

스테이트풀셋에서는 serviceName 필드를 통해서 자신의 파드들의 고유한 네트워크 식별자를 부여할 Service를 지정한다.
그럼 어차피 서비스는 자신이 트래픽을 연결할 파드들을 아는 꼴 아닌가?
그럼 굳이 라벨 셀렉터를 지정할 필요가 있을까?
반대로도 생각해서 굳이 serviceName이 왜 필요한가도 물어볼 수 있을 것 같다.

기본 세팅

스풀 기본 양식을 그대로 활용했다.
여기에서 두 가지 실험을 진행한다.

서비스에서 셀렉터 제거하기

Pasted image 20241227144125.png
어쩌면 당연한 사항인데, 일단 셀렉터를 없애니 엔드포인트는 잡힐 리 만무하다.
Pasted image 20241227144242.png
스풀 쪽에서는 그럼에도 서비스 네임을 가지고는 있는데, 이러면 어차피 무슨 소용인가 싶기는 하다.

스테이트풀셋에서 serviceName 제거

Pasted image 20241227150030.png
이번에는 거꾸로, serviceName을 없앴다.
Pasted image 20241227150352.png
그러자 이번에는 dns 쿼리가 실패한다.
Pasted image 20241227150435.png
각 엔드포인트의 차이를 살펴보았는데, 양식이 달라진 것이 확인된다.
Pasted image 20241227150545.png
이게 원래 스테이트풀셋에서 엔드포인트가 연결되는 방식인데, 여기의 hostname이 사라진 것이다.
Pasted image 20241227150805.png
참고로 serviceName의 유무와는 별개로 엔드포인트는 만들어지기에 일반적인 쿼리는 날리는 것이 가능하다.

분석

serviceName을 지정하는 경우에 각 파드에는 subdomain이라는 필드가 생긴다.
이 필드를 통해서 서비스는 연결을 진행할 때 파드 서브도메인 규칙을 만드는 것 같다.
Pasted image 20241227151553.png
이 필드를 직접 만들 수 있을까 궁금해서 넣어보려했는데, 만들어질 때 반영되지 않았다.

결론

스테이트풀셋은 serviceName 필드를 통해 파드들에 subdomain 필드를 지정하며, 서비스는 자신과 연결되는 파드의 해당 필드를 확인하여 서브 도메인을 생성한다.
그래서 해당 필드를 지정하지 않을 시 각 파드마다 고유한 도메인 이름을 생성할 수 없게 된다.

생각해보면 헤드리스 서비스라는 것은 그냥 자신은 ip가 없는 채 트래픽만 연결해주는 녀석이다.
자신에게 연결되는 놈이 구체적으로 스테이트풀셋에 의한 파드인지 그냥 파드인지 알 길이 없다.
이때 연결되는 놈이 서브도메인을 가지고 있을 때는 이를 활용해 고유한 도메인을 만들어주는 전략이 유효한 것 같다.

참고