이번 장에서는 Service가 Pod로 어떻게 트래픽을 포워딩할 수 있는지 알아보도록 하겠습니다.
일단 kubernetes의 Service는 뭘까요?
Pod가 2개 이상 있을경우 엔드포인트도 2개가 된다는 건데요. 이들을 한데 묶어 Service라는 가상의 Loadbalancer가 트래픽을 분하도록 해주는 Kubernetes Resource중 하나입니다.
Service는 타입이 총 4가지가 있습니다.
- ClusterIP: 클러스터 내부에서만 사용할 수 있는 Service
- NodePort: 노드 외부에서 접속 가능하도록 해주는 Service
- LoadBalancer: CSP사의 Loadbalancer와 연계하여 외부에서 접속 가능하도록 해주는 Service
- External Name: External Name 서비스와 DNS를 매핑하는 Service. 해당 서비스로 접근하면 매핑된 DNS로 리다이렉트됨.
자 그럼, Service는 어떻게 Pod로 트래픽을 포워딩할까요?
아래 아키텍처로 짐작할 수 있습니다.
[테스트 환경 구성]
저는 먼저 nginx 파드를 생성하고 Service를 NodePort 타입으로 만들어봤습니다.
NodePort는 30042로 확인됩니다.
엔드포인트도 해당 Pod 주소로 잘 찍히는걸 확인할 수 있습니다.
iptables를 통해 체인을 확인해보면 KUBE-NODEPORTS가 확인되는데요.
이것을 계속 확인해보면 아래와 같이 서비스로 생성된 NodePort를 볼 수 있습니다. 제가 기존 생성했던 Port번호와 같은걸 확인할 수 있습니다. 만약 NodePort가 2개라면 2개가 생성되어있을겁니다. 계속 확인해보겠습니다.
이번엔 KUBE-SVC-* 체인이 확인되는데요 해당 체인은 ClusterIP로 인해 생성되는 체인이라고 보면 됩니다. 즉 Network Flow는 NodePort > ClusterIP > Pod라는 것을 유추해볼 수 있습니다.
해당 체인도 확인해보면 아래와 같이 Service와 연결된 POD의 IP주소도 확인 됩니다.
이것들은 Pod마다 생기는 체인인데요
해당 체인을 또 살펴보면 DNAT라는이름의 체인으로 10.100.119.7로 DNAT룰이 설정되어있는 것을 볼 수 있습니다.
이쯤에서 궁금해하실 것 같은 부분은 그럼"Pod가 2개 이상일 경우 로드밸런싱 알고리즘은 어떻게 되는거지?"
정답은 kube-proxy mode에 따라 다르다 입니다.
kube-proxy mode가 iptables일 경우 트래픽은 랜덤하게 분배가 되며, 다양한 로드밸런싱 알고리즘을 사용하고 싶다면 ipvs모드로 사용해야합니다.
이로써 Service는 뭔가 IP가 있어서 실체할 것 같지만 가상의IP일 뿐이고 kubernetes에서 무언가 실체하지 않는 것임을 알 수 있고 하나의 Iptables에 세팅된 하나의 룰이라고 보면 될 것 같습니다.
공부를 하다가 NodePort또한 왜 Port가 netstat커맨드로 보이지 않을까 궁금해하시는 분들도 많이 계실 것 같은데요 위 처럼 service는 프로세스 형태로 동작하는 것이 아닌 iptables에 세팅된 하나의 룰이기 때문에 보이지 않았던 것입니다.(참고로 iptables는 체인 및 룰을 설정하는 tool이고, 실제 패킷의 이동에 대한 관여는 netfilter가 수행하게 됩니다. netfilter는 리눅스 커널의 네트워크 스택에 내장된 패킷 처리 프레임워크입니다.)
혹시라도 틀린 정보, 수정이 필요한 부분이 있다면 언제든 피드백 부탁드립니다.! 바로 수정하도록 하겠습니다.
같이공부합시다.
참조:
https://coffeewhale.com/packet-network3
https://kubernetes.io/ko/docs/concepts/services-networking/service/#externalname
https://dramasamy.medium.com/life-of-a-packet-in-kubernetes-part-3-dd881476da0f
'Kubernetes' 카테고리의 다른 글
kube-bench 사용법 및 Install (0) | 2024.03.20 |
---|---|
kubesec install 및 사용법 (1) | 2024.03.19 |
Kubernetes Network Study #1 (Pod to Pod, CNI. Calico) (0) | 2023.11.22 |
[NKS]Velero를 활용하여 특정 네임스페이스를 통으로 백업하고 복원하기 (2) | 2023.07.31 |
Ingress에서 다른 Namespace에 있는 Service로 라우팅 하기 (0) | 2023.07.25 |