1. Kube-Proxy
- 쿠버네티스 클러스터의 각 노드에서 실행되는 네트워크 프록시
1.1 역할
- 쿠버네티스 서비스(e.g., ClusterIP, NodePort, LoadBalancer)의 IP 관리
- 서비스로 들어온 트래픽을 파드의 엔드포인트로 라우팅
- 서비스에 속한 여러 파드 간에 트래픽을 분산시켜 로드 밸런싱을 제공
1.2 특징
- Watch 메커니즘을 통해 쿠버네티스 API 서버로부터 클러스터 내 모든 서비스와 엔드포인트 정보를 실시간으로 업데이트한다.
- 업데이트된 정보를 기반으로 해당 노드의 iptables 또는 IPVS 규칙을 업데이트한다.
2. CNI (Container Network Interface)
- 네트워크 구성을 관리하기 위한 표준 인터페이스
2.1 역할
- 파드의 네트워크 인터페이스 설정
- 파드의 IP 주소 할당
- 파드 간의 네트워크 연결
- Network Policy 적용
2.2 특징
- 네트워크 인터페이스는 Veth pair(가상 이더넷 인터페이스 쌍) 형태로 설정된다.
- IP 주소 할당은 IPAM(IP Address Management)을 통해 관리된다.
- 노드 간의 네트워크 트래픽은 BGP, IP-in-IP 터널링, VXLAN 등을 사용하여 전달한다.
2.3 CNI 플러그인
- Flannel: 간단하고 빠르게 설정 가능
- Calico: BGP를 통한 고성능 네트워킹 처리
- Weave Net: 네트워크 트래픽 암호화를 이용한 높은 보안성
- Cilium: eBPF를 이용한 고성능 네트워크 및 보안 정책 제공
내가 경험해본 CNI 플러그인은 Calico이다. Calico에 대해 더 자세히 정리해보자.
3. Calico
- 네트워크 보안 정책과 고성능 네트워킹을 제공하는 CNI 플러그인
3.1 특징
- BGP 피어링 설정을 통해 각 노드 간의 네트워크 정보를 교환한다.
- 각 노드는 커널 라우팅 테이블을 구성하고 유지한다.
- 각 노드는 다른 노드로부터 BGP 업데이트를 수신하여 라우팅 테이블에 클러스터 내 모든 파드의 위치 정보를 업데이트한다.
- 라우팅 테이블을 통해 직접적인 파드 간의 통신을 가능하게 한다.
3.2 BGP (Border Gateway Protocol)
- 네트워크 간의 라우팅 정보를 교환하는 프로토콜
- 여기서 Border란 국경, 경계이라는 의미이다.
- 서로 다른 AS를 연결해주는 경계 게이트웨이 프로토콜
- 여기서 AS는 Autonomous System의 약자로 하나의 네트워크 관리자에 의해 관리되는 라우터 집단(그룹, 도메인)을 의미한다.
- AWS에서는 대표적으로 AWS Transit Gateway와 AWS Direct Connect가 BGP로 지원된다.
3.3 BGP를 사용한 파드 간의 트래픽 라우팅
- 패킷 생성 (A 파드): 패킷의 source IP는
10.0.0.1
이고, destination IP는 10.0.1.1
이라고 가정해보자.
- 라우팅 테이블 조회 (A 노드): 이미 BGP를 통해 수신한 라우팅 테이블을 기반으로 destination IP
10.0.1.1
이 B 노드에 있다는 것을 알고있다.
- 패킷 전송 (A 노드 -> B 노드): A 노드에서 B 노드로 패킷을 전송한다.
- 패킷 수신 및 전달 (B 노드): B 노드는 패킷을 수신하고, B 노드의 라우팅 테이블을 조회하여 패킷을 B 파드로 전달한다.
- 패킷 도착: B 파드는 A 파드로부터 전송된 패킷을 수신한다.
3.4 설치 방법