이쿠의 슬기로운 개발생활

함께 성장하기 위한 보안 개발자 EverNote 내용 공유

클라우드/AWS

EKS AWS CNI 분석

이쿠우우 2021. 5. 3. 20:11
반응형

 

 

 

 

 

EKS AWS CNI 분석

 

 

목적

 

AWS에서 제공되는 kubernetes인 EKS에서 사용되는 CNI인 AWS CNI의 

개념과 동작원리를 파악해봄

 


 

글을 읽는데 필요한 기초 개념

 

 

AWS VPC

Virtual Private Cloud

사용자의 AWS 계정 전용 가상 네트워크.

VPC별로 네트워크를 구성할 수 있고 

각각의 VPC에따라 다르게 네트워크 설정을 줄 수 있음. 

또한 각각의 VPC는 완전히 독립된 네트워크처럼 작동함.

VPC는 하나의 리전에 종속됨.

 

AWS Subnet

VPC 안에 더 많은 네트워크망을 만들기 위해

VPC를 더 작은단위로 나눠놓은 것.

서브넷은 가용영역안에 존재하며 

서브넷안에 RDS, EC2와같은 리소스들을 위치시킬 수 있음.

 

AWS Routing Table

VPC 내부의 Routing을 설정하는 것.

 

IGA : Internet Gateway AWS

인터넷게이트웨이는 VPC와 인터넷을 연결해주는 관문.

Public Subnet  : 인터넷과 연결되어있는 Subnet

Private Subnet : 인터넷과 연결되어있지 않은 Subnet

 

NAT Gateway

Private Subnet이 인터넷과 통신 하기위한 아웃바운드 인스턴스

 

 

 


 

AWS CNI란?

 

AWS EKS는 Kubernetes Network Addon인 CNI( Container Networking Interface )로

VPC( Virtual Private Cloud )의 IP 주소를 Pod에 할당하는 

AWS VPC CNI를 사용하고 있음.

즉 생성되는 Pod가 할당 받는 IP주소는 AWS VPC에서 할당해주는 IP주소가 됨.

 

AWS CNI를 사용하면 

AWS에서 지원하는 VPC 플로우 로그, VPC 라우팅 정책과 네트워크 트래픽 격리를 위한 보안 그룹을 사용할 수 있음.

 

Worker Node 역할을 하는 EC2 인스턴스가 생성될 때

인스턴스에 연결된 네트워크 인터페이스를 기본 네트워크 인터페이스라고 하며,

인스턴스에 연결된 추가 네트워크 인터페이스를 보조 네트워크 인터페이스라고 함. 

 

각 네트워크 인터페이스에는 여러 개의 Private IP 주소가 할당될 수 있음.

Private IP 주소 중 하나는 기본 IP 주소이지만 

네트워크 인터페이스에 할당된 다른 모든 주소는 보조 IP 주소임.

 

[m5.large 인스턴스 유형인 Worker Node의 경우]

각 네트워크 인터페이스에 대해 

3개의 네트워크 인터페이스와 

10개의 프라이빗 IP 주소를 지원함.

 

[AWS CNI는 Network Policy]

AWS CNI는 Network Policy 를 지원하지 않음

그래서 추가적으로 calico, weave net과 같은 CNI를 연동해서 

방화벽 정책을 적용해야함.

 

 

 


 

 

AWS CNI 장점

 

 

1 . 오버레이 네트워크 처럼 캡슐화 및 캡슐화 해제의 오버 헤드가 발생하지 않음

2 . VPC Flow Logs를 사용할 수 있음. Pod에서 송수신되는 IP 트래픽에 대한 정보를 캡처할 수 있음.

3 . ENI ( Elastic Network Interface)를 공유하는 Pod가 적기 때문에 네트워크 대역폭에 대한 경합이 줄어듬.

4 . VPC의 트래픽을 Pod로 직접 라우팅 할 수 있음.

 


 

AWS CNI 단점

 

EC2 인스턴스 유형(예 : m5.large)과 사양에 따라 

Worker Node에 생성할 수 있는 Pod수가 제한이 됨.

 

1 . VPC CNI 사용자 지정 네트워킹을 통해 Pod에 할당할 수 있는 IP주소가 제한되어

Worker Node에 Pod를 배포할 수 있는 수가 제한이 됨.

 

2 . 만약 WorkerNode 중 특정 Node만 인스턴스 유형과 사양을 높다면 해당 Node에 과부하가 걸릴 수 있음

 

 


 

 

 

Worker Node 인스턴스의 기본, 보조 Network interface 확인

 

 

최초 EKS가 설치 되었을때 Worker Node Network interface 상태

 

Worker Node를 생성하면 최초에는 하나의 네트워크 인터페이스가 있음.

이 정보를 확인하기 위해 아래의 절차를 진행함.

 

kubectl get all -n system 

명령으로 default로 배포된 pod를 상태를 보면

모든 Worker Node에 아래와 같이 

aws-node, kube-proxy pod가 daemonset으로 배포되어있고

coredns는 일부 worker node에 배포되어 있음.

 

 

CoreDns가 배포되어 있지 않은 Worker Node

Worker Node Network interface 정보를 확인해보면 아래와 같음.

 

CoreDNS 가 배포되어있는 Worker Node

Worker Node Network interface 정보는 아래와 같음

 

 

결론

aws-node, kube-proxy POD는 network interface에 영향을 안줌.

CoreDNS POD가 배포되면 network interface에 영향을 줌.

즉 최초 Worker Node가 생성되고 Pod가 배포 안되었다면

eth0 interface 1개만 존재하고 있음.

이러한 eth0 interface를 기본 네트워크 인터페이스라고 함

 

 


 

 

Worker Node에 Pod를 배포한 후 Worker Node Network interface 상태

 

Worker Node에 pod 1개 생성된 경우

 

사용자가 pod를 배포해서

Worker Node에 Pod가 생성되면 

생성됨과 동시에 eth1 인터페이스가 아래와 같이 추가됨.

 

 

Pod가 배포되면

eni?? interface는 pod 수와 동일하게 생성됨.

on-premise 환경의 veth 와 같은 역할.

 

Pod가 배포된게 없다면 : eth0 만 존재함

Pod가 생성되면 : eth1 interface가 생성됨.

만약 worker node에 배포됨 pod가 없다면 : eth1 interface는 제거됨.

 

 

Worker Node에 pod 12개 생성된 경우

 

NodeSelector 기능으로 특정 WorkerNode에 12개 Pod를 배포해봄.

그 결과 아래와 같이 eth1, eth2 interface가 생성됨

 

 

결론

 

[eth2 interface가 생성된 이유]

eksctl 을 사용해서 EKS를 생성할때 별도의 옵션을 주지 않으면 

인스턴스 유형이 default로 m5.large로 설정되고 

test 상황도 m5.large로 설정되어 있음.

 

m5.large의 경우 

최대 네트워크 인터페이스 수 : 3

인터페이스당 프라이빗 IPv4 주소 수 : 10

로 설정되어 있는데 이 의미는

 

최대 네트워크 인터페이스 수 : 생성될 수 있는 eth interface 수 

인터페이스당 프라이빗 IPv4 주소 수 : 생성될 수 있는 Pod 수 

의미와 동일함

 

즉 최대 배포할 수 있는 수 10개를 초과 했으니

새로운 interface로 eth1을 추가 해서

추가로 2개의 Pod가 더 배포 될 수 있도록함.

 

이렇게 Pod가 배포될 시 생성되는 eth1,2...  기본 네트워크 인터페이스가 추가됨.

 

 

 

 

[참고 정보 Pod IP 상태]

Pod에 할당되는 IP는 VPC에서 할당가능한 IP로 설정.

 


 

 

AWS에서 해당 정보 확인해보기

 

EC2 > 인스턴스 > 인스턴스 ID클릭 > 네트워킹 

 

정보를 확인해보면 다음과 같이 

프라이빗 IPv4주소와 

eth0, 1, 2 주소가 매칭되는 것을 확인 할 수 있고

보조 프라이빗 IPv4주소와

Pod IP 주소가 일치하는 것을 확인할 수 있음.

 

[ 프라이빗 IPv4 ]

eth0,1,2 기본 네트워크 interface  와 매칭 됨.

 

[ 보조 프라이빗 IPv4 ] 

상위의 프라이빗 IPv4 인터페이스가 추가될때 마다

10개의 보조 프라이빗 IPv4가 새로 할당됨.

보조 네트워크 인터페스에 해당함

 

[ m5.large 인스턴스의 예제 ] 

3개의 프라이빗 IPv4가 생성된경우

총 27개의 보조 프라이빗 IPv4가 생성됨.

이유는 kube-proxy, aws-node, core-dns 3개의 pod가 제외되서 

30-3=27임.

 

 

 

 

[ 보조 프라이빗 IPv4의 경우 VCP Subnet 중 1개로 할당 받음 ] 

아래와같이 총 4개의 subnet이 존재하는데 이 중 1개의 subnet과 매칭되어 

보조 프라이빗 IPv4가 할당됨.

 

 

 

 


 

 

 

 

m5.large 인스턴스 유형인 Worker Node 배포할 수 있는 Pod 수.

 

표 출처 : https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/using-eni.html

 

m5.large의 경우 

최대 네트워크 인터페이스 수 : 3

인터페이스당 프라이빗 IPv4 주소 수 : 10

 

m5.large의 경우 한 worker node당 

3 x 10 = 30임으로 

최대 30개의 Pod가 배포될 수 있음

하지만 실제 운영환경에서는

현재 모든 Node에 kube-proxy와 AWS-node Pod가 동작하고 있고

특정 2개의 Node에는 Core-dns Pod가 배포되어있으니

30 - 3= 27로

m5.large 인스턴스 유형인 worker node에 최대 배포할 수 있는 Pod수는 27개가 됨.

 

 

 

 

 

 

 

 

 


 

참고

 

https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/pod-networking.html

https://www.contino.io/insights/kubernetes-is-hard-why-eks-makes-it-easier-for-network-and-security-architects

 

CNI 설명중 AWS

https://kubernetes.io/ko/docs/concepts/cluster-administration/networking/

 

Deep dive on the AWS CNI Plug-in for Kubernetes

https://www.youtube.com/watch?v=ezcnPcRcJdc

 

VPC란

https://medium.com/harrythegreat/aws-%EA%B0%80%EC%9E%A5%EC%89%BD%EA%B2%8C-vpc-%EA%B0%9C%EB%85%90%EC%9E%A1%EA%B8%B0-71eef95a7098

 

 

 

 

 

 

 

반응형

'클라우드 > AWS' 카테고리의 다른 글

EKS Network Policy 분석  (0) 2021.05.06
EKS AWS CNI - Pod 간 통신  (0) 2021.05.06
AWS Kubernetes (EKS)  (0) 2021.02.23
AWS API 사용 (Python)  (0) 2020.08.12
AWS 1년 무료 서버 생성법  (0) 2020.08.12