Kube-proxy의 역할

작성자 김아름 수정일 2022-10-17 15:26

#kubernetes, #쿠버네티스, #kube proxy

들어가며

  • 클러스터를 처음 구축하면 kube-system 네임스페이스에 kube-proxy가 생성됩니다.

  • 모든 노드에서 동작 중인 kube-proxy는 어떠한 역할을 하는지 살펴보겠습니다.



kube-proxy란?

kube-proxy는 쿠버네티스 클러스터를 구성하는 모듈 중 하나로, 모든node에 배포되어 동작하고 있습니다.


쿠버네티스의 서비스는 클러스터 내부에서 서로 통신할 수 있는 IP를 가지고 있지만,

외부에서 바로 클러스터로 접근할 수는 없습니다.

하지만 kube-proxy가 외부로의 접근을 허용할 수 있게 합니다.

즉, kube-proxy는 pod의 networking을 관리합니다.


kube-proxy의 proxy 모드는 여러가지 존재합니다.

현재 kube-proxy의 proxy 모드를 조회하는 방법은 아래와 같습니다.

curl localhost:10249/proxyMode
iptables


현재 예시의 kube-proxy는 iptables 모드 입니다.

해당 모드일 때 kube-proxy는 iptables를 관리하는 역할을 합니다.

iptables를 통해 linux kernel의 Netfilter를 설정하고, client로부터 오는 requeset는 Netfilter를 거쳐 직접 pod로 전달됩니다.


이제, 쿠버네티스 서비스는 iptables에 rule이 어떻게 정의되어 있는지 확인해보겠습니다.


스파클링소다에서는 node-exporter가 daemonset으로 관리되고 있습니다.

kubectl get po -n monitoring -owide | grep node-exporter
kube-prometheus-stack-prometheus-node-exporter-65jxx        1/1     Running   11         67d   192.168.50.201   worker   
kube-prometheus-stack-prometheus-node-exporter-fbvhd        1/1     Running   11         69d   192.168.50.200   master  


kubectl get svc -n monitoring  | grep node-exporter
kube-prometheus-stack-prometheus-node-exporter   ClusterIP   6.5.29.170    <none>        9100/TCP                     69d


node-exporter 서비스의 IP로 iptables rule을 찾아보겠습니다.

iptables -t nat -S | grep <service IP>
-A KUBE-SERVICES ! -s 6.2.0.0/16 -d 6.5.29.170/32 -p tcp -m comment --comment "monitoring/kube-prometheus-stack-prometheus-node-exporter:metrics cluster IP" -m tcp --dport 9100 -j KUBE-MARK-MASQ
-A KUBE-SERVICES -d 6.5.29.170/32 -p tcp -m comment --comment "monitoring/kube-prometheus-stack-prometheus-node-exporter:metrics cluster IP" -m tcp --dport 9100 -j KUBE-SVC-Z7CHWQWFV27V5F4E

서비스의 IP (6.5.29.170) 로 통신이 들어오면, KUBE-SVC-Z7CHWQWFV27V5F4E  로 점프하라고 되어있습니다.


KUBE-SVC-Z7CHWQWFV27V5F4E 의 iptables rule을 찾아보겠습니다.

iptables -t nat -S | grep <KUBE-SVC-NAME>

iptables -t nat -S | grep KUBE-SVC-Z7CHWQWFV27V5F4E
-N KUBE-SVC-Z7CHWQWFV27V5F4E
-A KUBE-SERVICES -d 6.5.29.170/32 -p tcp -m comment --comment "monitoring/kube-prometheus-stack-prometheus-node-exporter:metrics cluster IP" -m tcp --dport 9100 -j KUBE-SVC-Z7CHWQWFV27V5F4E
-A KUBE-SVC-Z7CHWQWFV27V5F4E -m comment --comment "monitoring/kube-prometheus-stack-prometheus-node-exporter:metrics" -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-RNDQ2GZJZI6WRFQN
-A KUBE-SVC-Z7CHWQWFV27V5F4E -m comment --comment "monitoring/kube-prometheus-stack-prometheus-node-exporter:metrics" -j KUBE-SEP-4EC74EFQJKBG53LO

처음엔 50%의 확률(--probability 0.50000000000)로 한 pod(KUBE-SEP-RNDQ2GZJZI6WRFQN)로 접근을 하고,

그 다음엔 다른 pod(KUBE-SEP-4EC74EFQJKBG53LO)로 접근하라는 rule이 명시되어 있습니다.

해당 결과는 다른 노드에서 조회해보아도 동일합니다.


이러한 rule을 만들도록 kernel에게 요청한 것이 바로 kube-proxy 입니다.




마치며

  • kube-proxy의 역할과 실제 예제를 통해 kube-proxy에 대해 알아보았습니다.


아티클이 유용했나요?

훌륭합니다!

피드백을 제공해 주셔서 감사합니다.

도움이 되지 못해 죄송합니다!

피드백을 제공해 주셔서 감사합니다.

아티클을 개선할 수 있는 방법을 알려주세요!

최소 하나의 이유를 선택하세요
CAPTCHA 확인이 필요합니다.

피드백 전송

소중한 의견을 수렴하여 아티클을 개선하도록 노력하겠습니다.

02-558-8300