본문 바로가기

EKS/EKS Cluster

EKS - Secondary IP 제어 하기

EKS를 구성하다보면, Node 당 IP에 대한 개수 제한이 있습니다.

더욱이 파드당 IP를 한개씩 가져가기 때문에 Node를 구축할 때, 많은 IP를 먼저 선점하여 가져가게 합니다.

 

하지만 Hybrid구조로 구축하여 진행할 경우 IP가 넉넉하지 않을 때가 많습니다.

하지만 타입이 높은 노드가 생성될 때는, IP를 필요 이상으로 과하게 가져가는 경우가 있습니다.

WAS를 띄우기 위해 메모리를 2기가로 놓고 파드를 띄운다면 c5.2xlarge에서 띄울 수 있는 파드는 그리 많지 않습니다.

하지만 30여개의 IP를 기본적으로 할당하기 때문에, IP가 낭비되는 것을 볼 수 있습니다. 즉, IP를 노드마다 제한해 줄 필요가 있습니다.

이러한 세팅을 위해서 Pod 수를 제한하거나 Secondary IP에 대해서 조절하는 방법을 소개합니다.

 

먼저, 참고해야할 Docs 링크들을 첨부합니다.

 

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

 

포드 네트워킹(CNI) - Amazon EKS

이 페이지에 작업이 필요하다는 점을 알려 주셔서 감사합니다. 실망시켜 드려 죄송합니다. 잠깐 시간을 내어 설명서를 향상시킬 수 있는 방법에 대해 말씀해 주십시오.

docs.aws.amazon.com

https://github.com/aws/amazon-vpc-cni-k8s/blob/master/docs/eni-and-ip-target.md

 

aws/amazon-vpc-cni-k8s

Networking plugin repository for pod networking in Kubernetes using Elastic Network Interfaces on AWS - aws/amazon-vpc-cni-k8s

github.com

 

먼저, Pod limit의 경우 Launch Template에서 User Data에 아래와 같이 설정하여서 구성하면됩니다.

(저는 현재 Custom Launch Template으로 EKS를 구축하여 사용중이라 가능합니다.)

 

MIME-Version: 1.0

Content-Type: multipart/mixed; boundary="==MYBOUNDARY=="

--==MYBOUNDARY==

Content-Type: text/x-shellscript; charset="us-ascii"
#!/bin/bash
/etc/eks/bootstrap.sh YourEKSName --use-max-pods false --kubelet-extra-args '--max-pods=10'

--==MYBOUNDARY==--

 

하지만, 위의 설정을 한다고 하더라도 Managed Nodegroup에서 생성하는 스크립트에 의해 망가지기 때문에

Custom AMI까지 생성한 후 Launch Template에 적용해야 하며, Pod의 수는 제한이 되더라도

Secondary IP를 먼저 가져오고 제한해서 Node를 생성하지는 않습니다.

 

그 이유는 아래와 같은 특성 때문인데,

Network와 관련하여 aws-node 데몬셋이 L-IPAM 데몬을 실행하고

ENI에 Secondary IP 할당과 Pod에 IP할당에 대하여 관리를 하기 때문입니다.

 

출처 AWS Docs

 

따라서 Secondary IP의 개수 제한을 하려면 Pod 수에 대한 Limit이 아닌 aws-node ds를 아래와 같이 세팅해야합니다.

 

kubectl set env ds aws-node -n kube-system WARM_IP_TARGET=2 
kubectl set env ds aws-node -n kube-system MINIMUM_IP_TARGET=10

 

'WARM_IP_TARGET'은 ENI 전체를 Warm Pool로 가져가지 않고 특정 IP 개수만큼만 Warm Pool을 확보하겠다라는 설정입니다. 'WARM_IP_TARGET=1'로 설정되면 Pod이 생성될 때마다 Secondary IP를 1개씩 추가로 할당한다고 보시면 됩니다.

 

이때, Pod의 생성과 종료가 빈번한 경우,

인스턴스에 IP를 Attach/Detach 하는 API call의 수가 늘어나 ENI를 추가하거나 IP를 추가하는데 throttling 이 발생할 수 있습니다.

 

따라서 이를 방지하기 위해 'MINIMUM_IP_TARGET'을 함께 설정합니다.

노드에 일반적으로 유지되는 Pod의 수를 'MINIMUM_IP_TARGET'으로 지정해 놓으면 해당 수만큼 ENI에 미리 IP가 할당되어 있습니다.

 

파드에 리소스를 할당을 제대로 적용했다면, 오토스케일링이 될때까지 파드수를 예측 할 수 있습니다.

따라서 위와 같이 MINIMUN_IP_TARGET을 파드의 리밋과 유사하게 구성하고 WARM IP TARGET을 2로하여 설정한다면,

큰 어려움이 없이 IP 낭비를 하지 않고 인프라를 구성하여 사용할 수 있을 것이라 생각합니다.

 

EKS에서 Node당 IP에 대해 조절하여 사용하는 방법에 대해 알아봤습니다.