각 파드는 고유한 IP 주소를 가진다.
각 파드별 IP는 파드 내부의 모든 컨테이너가 공유
각 파드별 IP는 내부의 모든 컨테이너가 공유한다.
파드 간 통신은 NAT 과정 없이 직접 IP로 통신할 수 있도록 보장해야 한다.
쿠버네티스 Service Discovery와 Network Policy는 파드 IP를 기반으로 동작해야 한다.

쿠버네티스는 각 파드에 고유한 IP를 부여하고, 클러스터 전체에서 해당 IP로 '직접' 통신할 수 있도록 네트워크 플러그인(CNI)이 네트워크 구조를 구현한다.
이러한 구조 덕분에 파드 간에는 NAT 없이 직접 IP 기반 통신이 가능한 것
🔥 클러스터는 Flat Network로 구성된다.

🤔Flat Network란?
Overlay Network 기술이나 BGP Protocol을 통해 논리적으로 가상화된 네트워크를 형성하여 라우팅단, 파드 외부와 통신할 때는 NAT나 로드 밸런서를 이용하여 통신
클러스터 내 파드 간 통신을 할 때 NAT 과정 없이 통신이 가능하도록 해주는 주체는 컨테이너 네트워크 인터페이스(CNI)가 구현해준다.
🔥 노드는 서로 직접 라우팅이 가능해야 한다.

💡리눅스 커널 관점에서 컨테이너 브릿지는 그저 인터페이스다.
즉, 컨테이너는 L3 스위치 방식으로 라우팅하는 것이 아니라 자신의 라우팅 테이블을 이용해 라우팅한다.
🔥서비스 추상화
서비스 라고 한다.서비스 네임이 필요🔥 IP-per-POD 모델
쿠버네티스는 각 파드별로 고유 IP를 부여한다고 했다.
pause 컨테이너에 의해 같은 네트워크 네임스페이스를 공유한다.loopback 인터페이스를 통해 내부 통신이 가능하다.💡파드 IP가 변경될 수 있으므로 파드 내에서 동작하는 애플리케이션은 고정 IP 대신
Service나DNS기반으로 통신하는 것이 좋다.(권장)
🤔pause 컨테이너가 뭐길래 파드 내 컨테이너들이 네트워크 네임스페이스를 공유할 수 있는걸까❓
쿠버네티스가 파드를 생성할 때 가장 먼저 실행시키는 컨테이너로, 파드의 인프라 컨테이너라고 한다.
🤔왜 필요할까❓
쿠버네티스의 Pod는 하나 이상의 컨테이너로 구성될 수 있고, 이 컨테이너들은 다음과 같은 리눅스 리소스를 공유하는 형태로 구성된다.
이 공유를 가능하게 하려면, 위 리소스들의 호스트(Owner)가 있어야 한다.
이때 이 호스트 역할을 하는 것이 바로 pause 컨테이너다.
어떻게 동작하나❓
1. 파드가 생성될 때 가장 먼더 pause 컨테이너가 생성됨
2. pause 컨테이너는 거의 '아무 일도 하지 않고' 단순히 sleep 상태로 머뭄
3. 이후에 생성되는 모든 애플리케이션 컨테이너들은 pause 컨테이너의 네트워크, IPC, PID 네임스페이스들을 공유하게 됨
즉, 모든 파드 컨테이너들이 pause 컨테이너의 네임스페이스를 붙잡고 거기에서 동작하는 것이다.

쿠버네티스는 각 노드마다 Pod CIDR을 할당한다.
kube-controller-manater가 수행CNI 플러그인이 수행 -> 라우팅 테이블 구성B Class 대역 사용C Class를 할당즉, 클러스터에 B 클래스 IP 대역을 할당하고 클러스터 내에 존재하는 각 노드에 C 클래스 대역을 할당
- 위 노드들을 다 합치면 하나의 B 클래스 IP 대역이 완성 -> 노드 간 통신이 가능한 이유
📜C 클래스 대역을 할당한다고 해서 2^8 개의 IP를 모두 할당하진 못한다.
-> 쿠버네티스는 보통 마스터 노드에 100개 정도의 워커 노드만 할당 가능하다고 스펙에 정의되어 있음(따라서 C Class의 절반 정도인 약 100개만 할당하면 적당. 그 이상 할당해도 어차피 못 띄움)

🚨하지만,
요즘 나오는 CNI들은 위 방식이 아닌 pod -> veth -> veth -> pod 방식으로 성능 최적화 되어 나온다.
📜이는 추후 CNI 포스팅에서 다룬다.

특징
1. 같은 노드 내 파드 간 통신과 달리 물리 네트워크를 거쳐야 함
2. 터널(캡슐화)이 필요 -> 오버레이 네트워크는 다른 네트워크로 못 감
따라서 만약 가용성 보다 속도(성능)가 중요한 상황이라면, 파드가 동일 노드에 존재하도록 적절히 배치해야 한다.
- 이렇게 파드들의 배치를 고려하는 과정을
Replacement라고 하고, 이는Deployment와는 다르다.

쿠버네티스에서 여러 개의 파드를 하나의 논리적 엔드포인트로 묶어주는 리소스
즉, 변동성 있는 파드 집합에 대해 고정된 접근 지점을 제공하는 역할
Label을 기준으로 파드들을 선택해 하나로 묶는 '추상화된 접근 지점'가상 네트워킹의 끝판왕 = 서비스
🤔서비스는 왜 필요할까❓
- 파드 IP를 특정 서비스의 엔드포인트로 설정했는데, 이 파드가 사라졌을 때 대응 필요
- 쿠버네티스 자체적으로 서버 상태와 목록을 관리하는 리버스 프록시 리소스를 지원하기 위함
서비스를 얘기할 때는 파드를 파드라고 하지 않고, Endpoint라고 부른다.
🔥 특징
1. 파드 수에 관계 없이 가용한 파드로 로드밸런싱하여 트래픽 분산
2. 고정된 서비스 IP로 들어온 요청은 kube-proxy에 의해 실제 IP로 전달
3. 다른 파드들이 서비스명을 통해 쉽게 접근할 수 있도록 서비스 디스커버리 기능 지원


kube-proxy 기술이 예전에는 많이 사용되고 중요했지만, 현재에는 그렇게 많이 사용되지는 않는다.💡 세 개의 서비스가 있지만, 그 중
ClusterIP를 가장 많이 사용한다.
- 서비스의 이름을 이용해 통신한다 → ClusterIP 서비스를 사용하는 것
- naver.com, google.com → www.naver.com , www.google.com
이렇게 전체 네임을 말할 때는 FQDN 이라고 함.
즉, 클러스터 IP를 사용하지만, 그 IP를 알 필요는 없고, FQDN을 이용한다. → 내부 통신에만 사용되고, kube-proxy가 이 일을 수행
CoreDNS(kubeDNS) 라는 장치가 내부적으로 IP → name 으로 변환해주는 장치

외부와 통신할 때 사용되는 서비스
- 노드의 IP, Port 를 클러스터의 IP, Port 로 매핑
- 클러스터는 내부 Pod의 IP,Port 로 매핑
외부 클라이언트 : 실제 물리 네트워크에 물려있는 클라이언트가 될 수 있음

NodePort를 기반으로 동작, 클러스터 외부에 로드밸런서 생성 및 Public IP와 NodePort를 연결
외부 접근 클라이언트 → NodePort 로 변환 → 클러스터 IP → ..
