본문 바로가기
  • lakescript
스터디 이야기/AWS EKS

[AEWS] 2-1. Amazon EKS Networking - CNI

by lakescript 2024. 3. 12.

 

 

사전 준비

더보기

 

위와 같이 사전 준비가 필요합니다.

저번 글에서 설명했듯이, EKS를 배포하기 위한 VPC를 생성하고, Public Subnet, Private Subnet을 생성합니다. 그 후 EKS Cluster에 접근하기 위한 bastion EC2를 미리 생성합니다.

 

AWS VPC CNI

CNI란?

 

ChatGPT가 알려주는 CNI
컨테이너 네트워킹을 위한 플러그인 기반의 표준입니다. Linux 컨테이너와 네트워크 네임스페이스를 연결하는 방법을 정의하며, 컨테이너가 네트워크에 연결될 때 필요한 인터페이스 생성, IP 주소 할당 등의 작업을 처리합니다.

 

즉, CNI는  Container Network Interface의 약자로 리눅스 컨테이너와 네트워크 네임스페이스를 연결하는 방법이며, 컨테이너 네트워킹을 위한 플러그인 기반의 표준입니다.

 

 

Kubernets CNI란?

ChatGPT가 알려주는 Kuberntes CNI
쿠버네티스(Kubernetes) 클러스터 내에서 컨테이너 간의 네트워킹을 설정하는 표준입니다. CNI는 컨테이너가 서로 통신하고 외부 네트워크와 연결될 수 있도록 하는 다양한 네트워크 플러그인을 지원합니다.

 

즉, Kubernetes에서 CNI는 컨테이너 간의 네트워킹을 설정하고 k8s 네트워크 환경을 구성 하며, Kubernetes는 CNI 표준을 따르는 다양한 네트워크 플러그인을 지원하여, 클러스터 내의 컨테이너가 서로 통신하고 외부 네트워크와 연결될 수 있도록 합니다.

 

K8s CNI 종류에는 Calico, Flannel, Weave Net, Cilium, Amazon VPC CNI for Kubernetes, Azure CNI등이 있습니다.

 

AWS VPC CNI란?

ChatGPT가 알려주는 AWS VPC CNI
AWS VPC CNI(Amazon VPC Container Network Interface)는 AWS에서 제공하는 쿠버네티스 네트워크 플러그인입니다. 이 플러그인은 쿠버네티스 클러스터를 AWS의 Virtual Private Cloud(VPC) 내에서 직접 실행할 수 있게 해주며, 컨테이너에 AWS VPC의 네이티브 IP 주소를 할당합니다. 이를 통해 컨테이너가 VPC 내의 리소스와 직접 통신할 수 있게 되어, 네트워크 성능이 향상되고 관리가 용이해집니다.

 

 

즉, EKS는 클러스터의 네트워크 대역을 VPC로 부터 할당 받기 때문에 파드는 클러스터가 위치한 VPC 내의 subnet들의 IP주소를 할당 받습니다. 그렇기에 파드의 IP 네트워크 대역과 worker node의 IP 대역이 같아서 직접 통신이 가능해집니다.

 

 

K8S Calico CNI 와 AWS VPC CNI 차이

 

kubernetes를 온프레미스 환경에서 구성하여 관리한다면 Node(Host)의 네트워크 대역과 Pod의 네트워크 대역이 다르기 때문에 오버레이(VXLAN, IP-IP 등) 통신이 이루어 집니다. 반면, AWS VPC CNI는 Node(Host)의 네트워크 대역과 Pod의 네트워크 대역이 같기 때문에 직접 통신이 가능합니다.

 

 

위에 사진을 참고해서 정리하자면 Calico CNI는 출발 Pod (10.1.1.1)에서 도착 Pod (10.1.1.2)로 패킷을 전송할 때에 node의 eth0으로 빠져나갈 때 Header를 씌우는 캡슐화(Outer 패킷 처리) 즉, 터널링을 진행합니다. 하지만 AWS VPC CNI는 이러한 작업이 없이 바로 원본 패킷이 전송됩니다.  즉, Calico CNI의 터널링 과정에서 많은 컴퓨팅 리소스가 발생하기에 상대적으로 AWS VPC CNI가 더 효율적입니다.

 

ChatGPT가 알려주는 Overlay 네트워크에서의 터널링
오버레이 네트워크에서 터널링(Tunneling)은 두 네트워크 장치 간에 가상의 직접 연결을 생성하는 기술입니다. 이 기술을 사용하면, 인터넷과 같은 공용 네트워크를 통해 개인 네트워크 트래픽을 안전하게 전송할 수 있습니다. 터널링은 데이터 패킷을 캡슐화하여, 다른 프로토콜 또는 네트워크를 통해 전송되도록 합니다. 이 과정에서 원본 데이터 패킷은 터널 프로토콜의 페이로드로 취급되며, 이 페이로드는 터널의 양 끝점에서만 해석될 수 있습니다.

 

 

현재 내 클러스터의 CNI 정보 확인

kubectl describe daemonset aws-node --namespace kube-system | grep Image | cut -d "/" -f 2

 

Node의 IP 확인

aws ec2 describe-instances --query "Reservations[*].Instances[*].{PublicIPAdd:PublicIpAddress,PrivateIPAdd:PrivateIpAddress,InstanceName:Tags[?Key=='Name']|[0].Value,Status:State.Name}" --filters Name=instance-state-name,Values=running --output table

 

Pod의 IP 확인

kubectl get pod -n kube-system -o=custom-columns=NAME:.metadata.name,IP:.status.podIP,STATUS:.status.phase

 

Node의 IP와 Pod의 IP 대역폭 비교

 

위의 실습을 통해 본 것처럼 Node와 Pod가 같은 대역폭을 쓰기 때문에 직접 통신이 이루어져 AWS VPC CNI가 더 효율적임을 알 수 있습니다.

 


 

 

Reference

- https://gasidaseo.notion.site/AWS-EKS-VPC-CNI-1-POD-f89e3e5967b24f8c9aa5bfaab1a82ceb