본문 바로가기

Kubenetes/Kubernetes Internal

쿠버네티스 인터널 - 4 (Service 구현 방식)

kube-proxy가 iptables를 사용하는 방식

 

iptables 프록시 모드

 

API 서버에서 서비스를 만들면 가상 IP가 즉시 할당된다. 그 후에 API 서버는 워커 노드에서 실행중인 모든 kube-proxy 에이전트에 새로운 서비스가 생성됨을 알린다. 그런 다음 각 kube-proxy는 노드에서 실행 중인 해당 서비스에 주소를 지정할 수 있게 한다.

 

이 작업은 iptables 규칙을 몇 가지 설정해 서비스 IP/Port 쌍을 대상으로 하는 각 패킷을 가로채고 목적지 주소를 수정해 패킷을 서비스를 지원하는 포드 중 하나에 리다이렉션 하도록 한다.

 

kube-proxy는 서비스 변경에 대한 API 서버를 보면서 앤드포인트 객체의 변경 사항을 감시한다.  앤드포인트 객체는 서비스를 백업하는 모든 포드의 IP/Port 쌍을 보유한다. 그래서 kube-proxy는 모든 앤드포인트 객체를 감시해야만 한다.

 

새 백업 포드를 생성하거나 삭제할 때마다 앤드포인트 객체가 변경되고 포드의 준비 상태가 변경되거나 포드의 레이블이 변경돼 서비스 범위를 벗어나는 경우에도 앤드포인트 객체가 변경된다.

 

서비스의 가상 IP와 포트 쌍으로 보내진 네트워크 패킷은 수정되고 랜덤으로 선택된 백업 포드로 리다이렉트 된다.

 1) 패킷의 목적지는 처음에 서비스의 IP와 포트로 설정된다. (이 예제에서 서비스는 172.30.0.1:80)

 2) 네트워크로 보내지기 전에 패킷은 먼저 노드에 설정된 iptables 규칙에 따라 노드 A의 커널에 의해 처음 처리된다.

 3) 커널은 패킷이 iptables 규칙 중 하나와 일치하는지 확인한다.

 4) 그들 중 하나는 어떤 패킷이 목적지 IP가 172.30.0.1 이고 목적지 포트가 80인 경우, 패킷의 목적지 IP와 포트는 무작위로 선택된 포드의 IP와 포트로 대체돼야 한다고 명령한다.

 5) 예제의 패킷은 해당 규칙과 일치하므로 대상 IP/포트가 변경된다.

 6) 예제에서 포드 B2는 랜덤으로 선택됐고 패킷의 대상 IP는 10.1.2.1(포드 b2의 IP)로 변경되고 포트는 8080으로 변경된다.