AWES 2주차로, EKS Networking에 대한 내용을 학습 후 정리하였습니다.
Youtube - "이게 돼요? 도커 없이 컨테이너 만들기"를 참고하여 실습한 내용도 정리해두었으니 참고하시기 바랍니다. - Link

Bridge
: 일반적으로 서버에 Docker를 설치하게되면, 가상의 Bridge 네트워크가 생성됩니다.
물리 IP 주소와 전혀 다른, 가상 IP가 생성되게 되는 것이며, Default 옵션입니다.
Host
: Container가 Host의 IP를 공유해서 사용하게 됩니다.
장점은 구조가 심플한 것이지만, 하나의 IP를 사용하기에 Port가 충돌하는 경우가 발생 가능합니다.
Container
: Container 1/2 각각 존재하는 경우, 각 container 1번이 가진 네트워크 인터페이스에 대해 공유가 가능합니다. 즉, Pod와 동일한 개념입니다.
None
: LoopBack 인터페이스를 위한 옵션으로 내부에서만 통신이 이루어지도록 사용됩니다.

A와 B 서버에 각각 Contaienr 2개씩 있다고 생각해보겠습니다.
A서버의 container 1, 2번은 이전에 말했다 싶이, 정상적으로 통신이 가능합니다.
❓그럼, A와 B 서버의 각 container 들끼리는 통신이 가능할까요?
당연히 통신이 불가능합니다.
왜? 서버 내의 컨테이너들은 상대방의 가상 IP를 알 수 있는 방법이 없기 때문입니다.

❗서로 다른 서버에 존재하는 컨테이너들끼리 IP를 알 수 있도록 사용되는 기술
: Overlay Network -> VXLAN or IPIP
예를 든 통신 구조: Container 1 -> A 서버 -> Outer IP -> B 서버 -> Container 4
Kubernetes에서 Overlay Network를 사용하려면?
- Calico, Cillium등과 같은 CNI(Container Network Interface) 툴을 사용하면 됩니다.
CNI을 사용하기 전과 달리, CNI를 사용하면 Secondary IP라는 VPC IP를 추가로 노드에 할당받을 수 있게 됩니다.
즉, Container 1번과 container 4번이 각각 VPC IP를 사용하기 때문에, 통신을 위해서 Outer IP가 필요하지 않습니다.
VPC CNI에는 L-IPAM이라는 IP Pool이 존재하며, 이는 IP를 사용하지 않고 있더라도, 상시적으로 IP가 Pod에 할당될 수 있도록 합니다.
Pod는 각각의 IP를 할당받습니다. 이때, Pod가 제거되거나, 다른 곳으로 이동하는 경우 언제든 IP가 바뀔 수 있습니다.
Service는 특정 Pod를 그룹으로 묶어서 LoadBalancer 처럼 대표 IP를 만드는 역할을 합니다.
즉, 클라이언트는 Service를 통해서 Pod가 죽든 말든 정상적으로 접근이 가능합니다.

Cluster IP
: 예를 들어, Server to Server 경우 외부 통신이 필요없는 경우가 대표적 사례입니다.
Cluster IP를 사용하는 경우 Cluster 내부에서만 통신이 가능하게 됩니다.
Node Port
: 외부와 통신이 필요한 경우 Port를 오픈해야하는 경우에 EC2에 Port를 오픈하는 방식으로 사용됩니다.
LoadBalancer
: 단어 그대로 LoadBalancer를 사용하여 여러 노드에 접근이 가능하도록 합니다.
Service는 LoadBalancer처럼 동작한다고 언급했었습니다.
그렇다면, LoadBalancer를 만들지 않았는데 어떻게 비슷한 동작이 가능한 것일까요?
- 정답은 iptables에 있습니다.

Cluster IP의 경우 172.16.1.11로 현재 설정되어 있습니다. 이는 가상 IP이며, 실제로 VPC등에서 존재하지 않는 IP입니다.




probabilitt 확률은 Pod의 개수에 비례하여 줄어듭니다.
예) Pod가 2개일 경우 0.5와 * 으로 표시됨
위의 일련의 과정들이 정리된 구조이니 참고하시기 바랍니다.

참고 - NodePort의 Port Range = 30000~ 32767

❗중요한 사항이 있는데, 사용자가 아래 그림과 같이 가장 위의 node에 트래픽을 보낼 때, 사용자가 원하는 파드가 없을 수 있습니다. (예: 사용자가 원하는 파드는 IP = 172.16.10.12)
이때, 신기하게도 트래픽은 사용자가 원하는 파드로 트래픽을 보낼 수 있게 되는데, 이는 iptables에 규칙이 명시되어 있어 가능한 것입니다.
kubernetes에서 해당 역할을 하는 것은?
- kube-proxy입니다. kube-proxy는 Service의 정보가 바뀌면, 노티를 받아 일괄로 iptables의 rule을 수정하게 됩니다.


Service는 IP와 Port를 통해 주로 L4 Layer 트래픽을 송수신합니다.
그렇다면, K8S에서 L7 Layer를 담당하는 오브젝트는 무엇일까요?
- Ingress 이며, 호스트명, 경로(Path)기반 라우팅을 처리합니다.
Ingress는 L7 Layer영역의 호스트명, Path기반 등의 관리자 정의 규칙을 기반으로 서비스를 공개할 때, 사용됩니다.
예: foo.example.com → A 서비스, bar.example.com → B 서비스, /api/* → C 서비스 등
TLS 종료나 리다이렉션, 인증, 레이트 리밋 같은 Application Level의 정책이 적용 가능합니다.

실제 Load Balancer type을 사용하는 경우, CLB가 기본적으로 생성됩니다.
CLB는 권장되지 않으며, NLB or ALB를 사용하는 것이 좋습니다.
이를 설정할 수 있는 것이 바로 annotations 입니다.
annotations에 관심이 있는 특정 컴포넌트가 참조해서 사용하는 방식입니다.
예) AWS에서 사용되는 정보들을 K8S Spec에 넣어야하는 경우가 있습니다.
이때, AWS의 기능들이 추가/수정될 때마다, K8S Spec을 수정해야할 것이며, 비효율적이라고 할 수 있습니다.
❗그래서, 아래 이미지와 같이 annotations와 spec 항목을 분리하여서, AWS와 K8S에서 필요한 항목들을 따로 관리할 수 있도록 하는 역할을 합니다.

아래 annotations를 살펴보면 위와 다른 항목이 하나 있는데, "nlb-target-type: "instance""라는 타겟 타입을 정할 수 있는 옵션이 있습니다.

Instance 타입의 경우 이전에 설명했던 통신 방식과 동일하게, iptables를 활용하여 NodePort를 통해서 Pod로 접근하게 됩니다.

IP 타입의 경우 Port가 필요없이 Pod의 IP로 다이렉트 통신이 가능해집니다.
❗iptables를 활용하지 않는 방식이기에, 복잡성이 줄어듭니다.

Manifest 파일을 살펴보면, /* Path로 접근 시, Backend의 echoserver-svc로 보내라는 설정이 담겨 있습니다.

