kubernetes에서 외부 트래픽에 대한 접근방식인 external policy를 알아보고자 합니다.
External Policy란?
(Docs :: https://kubernetes.io/ko/docs/tasks/access-application-cluster/create-external-load-balancer/)
설명에 앞서 External Policy가 등장한 배경부터 알아야합니다.
kubernetes의 service 타입이 LoadBalancer 혹은 Nodeport일 경우, 외부에서 kuberntes pod로 트래픽이 들어올 때 의도치 않은 두번째 홉 이 발생하게 됩니다.
이는 아래 그림처럼 표현을 해보겠습니다.

Loadbalance를 통하여 외부트래픽이 도착해야할 Pod는 Pod #1이지만, 처음 트래픽을 받은 Node가 Node1이 아닌 Node2인 경우, 최종 도착지가 Pod #1이기에 kube-proxy를 통하여 cluster 내부의 Pod #1로 보내게됩니다.
이때, 의도치 않은 2번째 홉이 발생하게 됩니다.
이는 Nodeport 또한 마찬가지로 발생하는 문제입니다.
이를 해결하기 위하여 externalpolicy가 나타나게 됩니다.
ExternalPolicy : Cluster 의 경우,
kubernetes docs문서에서는 아래와 같이 Cluster에 대해 말하고있습니다.
Cluster의 경우, 2번째 홉을 발생할 수 있으며, 이에따라 Letancy가 늘어나지만, 전체 Cluster에 대한 고른 부하분산에 이점이있습니다.

외부에서 들어온 트래픽이 최종 도착지 pod인 Pod #1로 도착한다 하였을 때,
위와같이 두번째 홉이 발생할 수 있지만, Pod#1 은 각기 고른 부하분산을 하게됩니다.
다만 외부에서 들어온 Client source IP는 SNAT으로 인하여 최종적으로 Pod #1은 Client의 source ip를 확인 할 수 없게됩니다.

(Docs :: https://kubernetes.io/ko/docs/tutorials/services/source-ip/ )
ExternalPolicy : Local 의 경우,
Local의 경우, 외부에서 들어온 트래픽은 Node간 이동이 불가능하여 client source ip를 보존하고 두번 째 홉이 발생하는 것을 방지하지만,
Node간 트래픽 이동이 불가능 함에 따른 부하분산이 불균형하게 됩니다.

결과적으로 보면, ExternalPolicy 의 Cluster와 Local 은 필요에 따라 사용할 수 있으며,
Client Source IP를 알아야한다면, 부하분산이 불균형해지더라도 Local을 사용하며,
트래픽 양이 많지않거나, Clinet source ip를 보존할 필요가 없는 경우, Cluster로 사용하는 것이 좋습니다.