AWS/[AEWS] EKS

[ AEWS 2주차 ] #1 EKS VPC CNI란?

BigCo 2024. 3. 12. 19:39

안녕하세요 오늘은 EKS CNI에 대해서 알아보겠습니다. 

 

VPC CNI란?

Amazon EKS 클러스터에 있는 Pod 네트워킹용 플러그 인입니다.

파드의 IP를 할당해주며 파드의 IP 네트워크 대역과 노드(워커)의 IP 대역이 같아서 직접 통신이 가능합니다.

 

k8s Calico CNI 와 AWS VPC CNI의 차이를 알아보겠습니다. 

Calico CNI 경우 노드와 파드의 네트워크 대역이 달라서 파드간 통신하는데 오버레이 즉 VXLAN, IP-IP... 등을 사용하여 통신해야 됩니다.

하지만 AWS VPC CNI를 사용하면 파드간 다른 설정없이 바로 통신이 가능합니다. 

 

AWS VPC CNI로 별다른 설정 없이 pod 간 통신이 가능한 이유는 VPC의 네트워크 대역을 사용하기 때문에 pod간, node 네트워크 대역이 같아 다이렉트로 통신이 가능합니다. 

 

실제로 AWS VPC CNI를 사용하여 어떻게 pod간 통신하는지 알아보겠습니다.

 

 

# 1. 네트워크 기본 정보 확인

현재 테스트 구성도 정보

저는 3개의 서브넷어 각 워커노드를 배포한 상태입니다. 

# CNI 정보 확인
kubectl describe daemonset aws-node --namespace kube-system | grep Image | cut -d "/" -f 2

위 명령어는 클러스터의 kube-system 네임스페이스에서 실행 중인 aws-node 데몬셋에 대한 자세한 정보를 출력합니다.
즉 간단하게 말해서 VPC CNI의 컨테이너 이미지 입니다. 

데몬셋의 역할
- 데몬셋은 각 노드에 하나의 파드를 유지하도록 보장합니다.
- 노드 간 통신 및 네트워크 설정을 관리하는 데몬셋이 AWS 노드에서 실행됩니다
- 모든 노드에 동일한 파드가 실행되어 클러스터 전체에서 특정 기능이나 서비스를 제공하거나 실행할 수 있습니다.

 

amazon-k8s-cni-init:v1.16.4-eksbuild.2 
-> 이 이미지는 EKS에서 사용되는 Kubernetes CNI 초기화를 위한 부분입니다. 이 부분은 초기 네트워크 구성을 설정하고 준비하는 초기화 단계에 사용됩니다.

amazon-k8s-cni:v1.16.4-eksbuild.2 
-> 이 이미지는 실제로 네트워크 인터페이스를 관리하고 Kubernetes 파드 간 통신을 처리하는 본격적인 CNI 구현 부분입니다.

 

AWS CNI는 각 노드에 파드를 배치하는 데몬셋으로 실행되며, 각 파드는 해당 노드의 네트워크 인터페이스를 관리하고 파드 간의 통신을 처리합니다. 이를테면, 클러스터에 워커노드가 3개 있다면, AWS CNI 데몬셋이 3개의 파드를 생성하여 각 노드에 배포됩니다. 이렇게 이름이 "aws-node"로 시작하는게 CNI pod 입니다. 

 

# 2. 노드와 파드 IP 대역 확인

VPC CNI의 가장 큰 특징 중 하나로 노드와 파드가 같은 대역의 IP를 사용하게 됩니다. 
그림에서도 coredns(파드)과 노드의 IP대역이 같은 것을 확인할 수 있습니다.  

AWS VPC CNI는 탄력적 네트워크 인터페이스(ENI)를 사용하여 각 노드에 VPC에서 할당한 IP 주소를 사용합니다. 이로 인해 파드에 할당되는 IP 주소가 해당 노드의 ENI에 할당된 IP 대역 내에서 선택됩니다. 따라서 파드 IP 주소와 노드 IP 주소가 동일한 서브넷에서 나올 수 있습니다.

 

# 3. 노드 간 파드 통신

노드 간 파드 통신이 오버레이 통신 기술 없이 통신이 가능한지 실제로 테스트를 해보겠습니다. 

# 3개의 터미널을 생성해서 각 노드에 접속해줍니다.
ssh ec2-user@$N1
ssh ec2-user@$N2
ssh ec2-user@$N3

이렇게 각각의 노드에 접근한 상태에서 핑 테스틀 진행하겠습니다. 

 

노드1 -> 노드2로 ping

tcpdump를 사용하면 노드1에서 노드2로 핑이간 ip들을 확인할 수 있습니다.

 

노드1 에서 노드 3으로 핑 통신을 해봐도 오버레이 없이 그래도 IP가 찍히는 것을 확인할 수 있습니다. 

 

그럼 파드에서 외부 통신 흐름은 어떻게 될까요??
파드에서 구글로 ping 테스틀 해보겠습니다. 

노드에서 구글로 ping test
tcpdump 확인결과

tcpdump 확인결과 노드에서(192.168.2.75)에서 구글142.250.206.196으로 핑이 간 것을 확인할 수 있습니다.  

 

파드에서 인터넷에 접속햇을 때의 IP 

워커노드에서 외부 접근했을 때의 IP 입니다. 

즉 파드가 외부랑 통신할 때 해당하는 워커노드의 eth0에 매칭되어 있는 공인 IP로 snat 통신하고 있습니다. 

 

이렇게 오늘은 AWS VPC CNI에 대해서 알아봤습니다.

감사합니다.