AWS VPC CNI와 IP주소 할당 전략 (Secondary IP / Prefix)
AWS VPC CNI
AWS 환경에서 동작하는 Kubernetes 클러스터에 제공하는 CNI(Container Network Interface)로, node에 배치되는 pod들에도 VPC IP를 할당해 pod 간 통신을 구현하는 방법
node와 pod가 동일한 네트워크 대역을 사용한다는 특징이 존재한다.
기존의 다른 kubernetes CNI들이 네트워크 오버레이와 같은 기술을 사용해 pod에 IP를 할당했다면, AWS VPC CNI는 node 내부의 pod 간 통신은 네트워크 브릿지를 통해서 이루어지고, node를 넘어서는 pod 간 통신은 오버레이 기술이 아닌 일반 VPC 통신이 이루어진다. (VPC Native)
EKS는 기본적으로 VPC CNI를 사용하고, kOps로 클러스터를 만드는 경우 cluster 생성 시 networking 파라미터에 amazonvpc를 설정하면 VPC CNI를 사용한다.
AWS VPC CNI를 사용한 클러스터의 각 worker node에는 aws-node라는 pod가 daemonset으로 배포가 되어있다.
이 aws-node pod가 네트워크 인터페이스 관리와 VPC 리소스를 연동하는 역할을 수행한다.
VPC CNI는 VPC 대역망의 IP를 그대로 pod에 할당해주기 때문에 VPC 할당할 수 있는 IP 갯수에 제한이 걸리게 된다.
이에 따라 pod에 ip할당이 안되어 scale-out이 되지 않는 경우도 발생할 수 있게 된다.
인스턴스에 적절하게 pod를 할당하기 위해 인스턴스의 유형을 고려해야한다.
이러한 VPC CNI는 pod에 IP를 할당하는 2가지 모드를 지원한다.
Secondary IP mode
VPC CNI의 기본 모드로 각 node에 연결된 ENI에 대해 여러개의 개별 IP주소를 할당하는 방법
인스턴스에 연결할 수 있는 ENI의 수와 네트워크 인터페이스에 할당할 수 있는 IP주소의 수는 인스턴스 유형 별로 다르다.
이에 따라 Secondary IP mode에서 node별로 배치 가능한 pod의 최대 갯수 수식은 아래와 같다.
aws-node, kube-proxy pod는 host의 IP를 그대로 사용하므로 최대 갯수에서 제외되어 2를 더해준다.
배치된 worker node의 유형에 해당하는 배치가능한 최대 pod의 수를 유념해두어야 한다.
(해당 인스턴스 유형의 최대 ENI 갯수 * (ENI 당 지원하는 IP 갯수 - 1) + 2
ex) t3.medium = (3 * (4 - 1)) + 2
Secondary IP mode로 worker node에 pod를 배치하면 아래와 같이 보조 IP들이 할당되어있는 것을 확인할 수 있다.
Prefix mode (Prefix Delegation)
ENI에 단일 IP가 아닌, (할당된 IP)/28 사이즈의 접두사를 ENI에 할당해주는 방법, IPv6의 경우 /80 사이즈의 접두사가 할당된다.
aws-node(VPC CNI) daemonset의 ENABLE_PREFIX_DELEGATION을 활성화 시켜서 사용가능하다.
이러한 Prefix mode는 Nitro 기반 인스턴스에서만 지원하며, VPC CNI의 버전이 1.9.0 이상이여야 한다.
kubectl set env daemonset -n kube-system aws-node ENABLE_PREFIX_DELEGATION=true
### kops cluster
kops edit cluster
# amazonvpc 하위에 환경변수 추가
networking:
amazonvpc:
env:
- name: ENABLE_PREFIX_DELEGATION
value: "true"
Prefix mode를 통해 EC2 API 작업에서 인스턴스에 새로운 ENI를 할당하는 것보다 새로운 Prefix 대역을 추가로 할당하는 것이 더 빠르다는 것을 알 수 있다.
또한 결정적으로 Prefix mode를 사용함에 따라 기존 Secondary IP mode보다 pod에 할당가능한 IP수가 증가하게 된다.
Prefix mode에서의 노드당 배치 가능한 파드의 최대 갯수 공식은 아래와 같다.
(해당 인스턴스 유형의 최대 ENI 갯수 * (ENI당 지원하는 IP 갯수-1)) * 16
ex) t3.medium : (3 * (6 - 1)) * 16 = 240
같은 인스턴스 유형으로 계산하고 비교했을때, 최대 갯수가 늘어난 것을 확인할 수 있다.
단, 이러한 계산식은 추출가능한 최대 IP주소 갯수이며, 실제 배치되는 파드의 갯수는 이보다 적다.
vCPU가 30 미만인 인스턴스에 대해서는 최대 110개 pod만 배치가능하며, 이외 유형은 250개가 최대치라고 전해진다.
Prefix mode로 worker node에 pod를 배치하면 아래와 같이 IP 접두사 목록에 내용을 확인할 수 있다.
kOps 클러스터에서 Prefix mode로 전환 후, pod를 100개 배포하였을때에도 Pending되는 것 없이 모두 잘 배포됨을 볼 수 있다.
Secondary IP mode와 Prefix mode를 비교한 내용은 아래와 같다.
특징 | Secondary IP mode | Prefix mode |
IP주소 할당 방식 | 개별 IP주소를 할당 | Prefix block(/28)을 할당 |
node당 최대 IP수 | (ENI 갯수 * ( ENI 당 지원하는 IP 갯수 )) + 2 | (ENI 갯수 * (ENI 당 지원하는 IP 갯수)) * 16 (/28은 16개의 ip) |
ENI 관리 | 빈번한 ENI 생성/삭제 | ENI 생성/삭제 빈도 감소 |
IP주소 할당 속도 | 느림 | 빠름 |
ENI 사용량 | 더 많은 ENI 필요 | 더 적은 ENI로 더 많은 IP주소 할당 가능 |
네트워크 오버헤드 | 높음 | 낮음 |
비용 | ENI 사용량 증가로 비용 증가 | ENI 사용량 감소로 비용 감소 |
참고 URL
https://aws.github.io/aws-eks-best-practices/ko/networking/vpc-cni/
https://gasidaseo.notion.site/AWS-EKS-VPC-CNI-1-POD-f89e3e5967b24f8c9aa5bfaab1a82ceb