Amazon EKS 노드의 사용 가능한 IP 주소 늘리기

Amazon EKS 노드의 사용 가능한 IP 주소 늘리기

노드에 개별 보조 IP 주소를 할당하는 대신 IP 프리픽스(prefix)를 할당하면 노드가 Pod에 할당할 수 있는 IP 주소 수를 늘릴 수 있습니다.

출처: 문서

본문

사전 요구 사항

  • 기존 클러스터가 필요합니다. 배포하려면 Amazon EKS 클러스터 생성을 참조하세요.
  • Amazon EKS 노드가 있는 서브넷에는 충분한 연속 /28(IPv4 클러스터용) 또는 /80(IPv6 클러스터용) CIDR(Classless Inter-Domain Routing) 블록이 있어야 합니다. IPv6 클러스터에는 Linux 노드만 있을 수 있습니다. 서브넷 CIDR 전역에 IP 주소가 흩어져 있으면 IP 프리픽스 사용이 실패할 수 있습니다. 다음을 권장합니다.
    • 서브넷 CIDR 예약(reservation)을 사용하여 예약된 범위 내의 IP 주소가 아직 사용 중이더라도 해제 시 IP 주소가 재할당되지 않도록 합니다. 이렇게 하면 조각화 없이 프리픽스를 할당할 수 있습니다.
    • IP 프리픽스가 할당되는 워크로드 실행 전용으로 새 서브넷을 사용합니다. IP 프리픽스를 할당할 때 Windows와 Linux 워크로드 모두 같은 서브넷에서 실행할 수 있습니다.
  • 노드에 IP 프리픽스를 할당하려면 노드가 AWS Nitro 기반이어야 합니다. Nitro 기반이 아닌 인스턴스는 계속 개별 보조 IP 주소를 할당하지만, Nitro 기반 인스턴스보다 Pod에 할당할 IP 주소 수가 훨씬 적습니다.
  • Linux 노드만 있는 클러스터의 경우 – 클러스터가 IPv4 패밀리로 구성된 경우 Amazon VPC CNI 플러그인 for Kubernetes 추가 기능 버전 1.9.0 이상이 설치되어 있어야 합니다. 현재 버전은 다음 명령으로 확인할 수 있습니다.
    kubectl describe daemonset aws-node --namespace kube-system | grep Image | cut -d "/" -f 2
    
    클러스터가 IPv6 패밀리로 구성된 경우 추가 기능 버전 1.10.1이 설치되어 있어야 합니다. 플러그인 버전이 필요한 버전보다 낮다면 업데이트해야 합니다. 자세한 내용은 Amazon VPC CNI로 Pod에 IP 할당의 업데이트 섹션을 참조하세요.
  • Windows 노드만 있는 클러스터의 경우 – 클러스터에 대해 Windows 지원이 활성화되어 있어야 합니다. 자세한 내용은 EKS 클러스터에 Windows 노드 배포를 참조하세요.

노드에 IP 주소 프리픽스 할당

노드에 IP 주소 프리픽스를 할당하도록 클러스터를 구성합니다. 노드 운영 체제에 맞는 절차를 완료합니다.

Linux

Amazon VPC CNI DaemonSet에 대해 네트워크 인터페이스에 프리픽스를 할당하는 매개변수를 활성화합니다. 클러스터를 배포하면 Amazon VPC CNI 플러그인 for Kubernetes 추가 기능 버전 1.10.1 이상이 함께 배포됩니다. 클러스터를 IPv6 패밀리로 만들었다면 이 설정은 기본적으로 true였습니다. 클러스터를 IPv4 패밀리로 만들었다면 이 설정은 기본적으로 false였습니다.

kubectl set env daemonset aws-node -n kube-system ENABLE_PREFIX_DELEGATION=true

중요

서브넷에 사용 가능한 IP 주소가 있더라도 서브넷에 연속 /28 블록이 없으면 Amazon VPC CNI 플러그인 for Kubernetes 로그에 다음 오류가 표시됩니다.

InsufficientCidrBlocks: The specified subnet does not have enough free cidr blocks to satisfy the request

이는 서브넷 전체에 흩어져 있는 기존 보조 IP 주소의 조각화 때문에 발생할 수 있습니다. 이 오류를 해결하려면 새 서브넷을 만들어 그곳에 Pod를 시작하거나, Amazon EC2 서브넷 CIDR 예약을 사용해 서브넷 안에 프리픽스 할당용 공간을 예약하세요. 자세한 내용은 Amazon VPC User Guide의 서브넷 CIDR 예약을 참조하세요.

시작 템플릿 없이 또는 AMI ID를 지정하지 않은 시작 템플릿으로 관리형 노드 그룹을 배포할 계획이고, 사전 요구 사항에 나열된 버전 이상의 Amazon VPC CNI 플러그인 for Kubernetes를 사용한다면 다음 단계로 건너뜁니다. 관리형 노드 그룹이 최대 Pod 수를 자동으로 계산합니다.

self-managed 노드 그룹이나 AMI ID를 지정한 시작 템플릿이 있는 관리형 노드 그룹을 배포한다면 노드의 최대 Pod 수를 설정해야 합니다. 적절한 값을 결정하는 방법은 maxPods가 결정되는 방식을 참조하세요.

중요

관리형 노드 그룹은 maxPods 값에 최대값을 적용합니다. vCPU가 30개 미만인 인스턴스의 최대값은 110이고, 다른 모든 인스턴스의 최대값은 250입니다. 이 최대값은 프리픽스 위임이 활성화되었는지와 관계없이 적용됩니다.

IPv6로 구성된 클러스터를 사용한다면 다음 단계로 건너뜁니다.

다음 옵션 중 하나로 매개변수를 지정합니다. 어떤 옵션이 적합한지와 어떤 값을 제공할지 결정하려면 GitHub의 WARM_PREFIX_TARGET, WARM_IP_TARGET, MINIMUM_IP_TARGET을 참조하세요. 예시 값을 0보다 큰 값으로 바꿀 수 있습니다.

WARM_PREFIX_TARGET

kubectl set env ds aws-node -n kube-system WARM_PREFIX_TARGET=1

WARM_IP_TARGET 또는 MINIMUM_IP_TARGET – 둘 중 하나라도 설정되면 WARM_PREFIX_TARGET에 설정된 값을 덮어씁니다.

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

Amazon EC2 Nitro Amazon Linux 2023 인스턴스 유형을 하나 이상 사용해 다음 유형 중 하나의 노드 그룹을 만듭니다. Nitro 인스턴스 유형 목록은 Amazon EC2 User Guide의 Nitro System 기반 인스턴스를 참조하세요. 이 기능은 Windows에서는 지원되지 않습니다. 110이 포함된 옵션에서는 110을 3단계의 값(권장)이나 사용자 값으로 바꿉니다.

Self-managed – self-managed Amazon Linux 노드 생성의 지침에 따라 노드 그룹을 배포합니다. CloudFormation 스택을 만들기 전에 템플릿 파일을 열고 NodeLaunchTemplate의 UserData를 다음과 같이 조정합니다.

...
            apiVersion: node.eks.aws/v1alpha1
            kind: NodeConfig
            spec:
              cluster:
                name: ${ClusterName}
                apiServerEndpoint: ${ApiServerEndpoint}
                certificateAuthority: ${CertificateAuthorityData}
                cidr: ${ServiceCidr}
              kubelet:
                config:
                  maxPods: 110
...

eksctl로 노드 그룹을 만들려면 다음 명령을 사용할 수 있습니다.

eksctl create nodegroup --cluster my-cluster --managed=false --max-pods-per-node 110

Managed – 다음 옵션 중 하나로 노드 그룹을 배포합니다.

  • 시작 템플릿 없이 또는 AMI ID를 지정하지 않은 시작 템플릿 사용 – 클러스터용 관리형 노드 그룹 생성의 절차를 완료합니다. 관리형 노드 그룹이 Amazon EKS 권장 max-pods 값을 자동으로 계산합니다.
  • AMI ID를 지정한 시작 템플릿 사용 – 시작 템플릿에서 Amazon EKS 최적화 AMI ID 또는 Amazon EKS 최적화 AMI를 기반으로 만든 사용자 지정 AMI를 지정한 다음, 시작 템플릿으로 노드 그룹을 배포하고 시작 템플릿에 다음 사용자 데이터를 제공합니다. 이 사용자 데이터는 nodeadm 도구가 노드에서 읽도록 NodeConfig 객체를 전달합니다. nodeadm에 대한 자세한 내용은 nodeadm 문서를 참조하세요.
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="//"

--//
Content-Type: application/node.eks.aws

---
apiVersion: node.eks.aws/v1alpha1
kind: NodeConfig
spec:
 cluster:
   apiServerEndpoint: my-cluster
   certificateAuthority: LS0t...
   cidr: 10.100.0.0/16
   name: my-cluster
 kubelet:
   config:
     maxPods: 110
--//--

eksctl로 노드 그룹을 만들려면 다음 명령을 사용할 수 있습니다.

eksctl create nodegroup --cluster my-cluster --max-pods-per-node 110

Amazon EKS 최적화 AMI를 기반으로 만들지 않은 사용자 지정 AMI를 만들었다면 구성을 직접 만들어야 합니다.

참고

인스턴스의 서브넷과 다른 서브넷에서 Pod에 IP 주소를 할당하려면 이 단계에서 기능을 활성화해야 합니다. 자세한 내용은 사용자 지정 네트워킹으로 대체 서브넷에 Pod 배포를 참조하세요.

Windows

IP 프리픽스 할당을 활성화합니다. amazon-vpc-cni ConfigMap을 편집하기 위해 엽니다.

kubectl edit configmap -n kube-system amazon-vpc-cni -o yaml

data 섹션에 다음 줄을 추가합니다.

  enable-windows-prefix-delegation: "true"

파일을 저장하고 편집기를 닫습니다. 줄이 ConfigMap에 추가되었는지 확인합니다.

kubectl get configmap -n kube-system amazon-vpc-cni -o "jsonpath={.data.enable-windows-prefix-delegation}"

반환된 출력이 true가 아니면 오류가 있을 수 있습니다. 단계를 다시 완료해 보세요.

중요

서브넷에 사용 가능한 IP 주소가 있더라도 서브넷에 연속 /28 블록이 없으면 Amazon VPC CNI 플러그인 for Kubernetes 로그에 다음 오류가 표시됩니다.

InsufficientCidrBlocks: The specified subnet does not have enough free cidr blocks to satisfy the request

이는 서브넷 전체에 흩어져 있는 기존 보조 IP 주소의 조각화 때문에 발생할 수 있습니다. 이 오류를 해결하려면 새 서브넷을 만들어 그곳에 Pod를 시작하거나, Amazon EC2 서브넷 CIDR 예약을 사용해 서브넷 안에 프리픽스 할당용 공간을 예약하세요. 자세한 내용은 Amazon VPC User Guide의 서브넷 CIDR 예약을 참조하세요.

(선택 사항) 클러스터의 사전 스케일링 및 동적 스케일링 동작을 제어하는 추가 구성을 지정합니다. 자세한 내용은 GitHub의 Windows에서 Prefix Delegation 모드 구성 옵션을 참조하세요.

amazon-vpc-cni ConfigMap을 편집하기 위해 엽니다.

kubectl edit configmap -n kube-system amazon-vpc-cni -o yaml

예시 값을 0보다 큰 값으로 바꾸고 필요한 항목을 ConfigMap의 data 섹션에 추가합니다. warm-ip-target 또는 minimum-ip-target 중 하나에 값을 설정하면 그 값이 warm-prefix-target에 설정된 값을 덮어씁니다.

  warm-prefix-target: "1"
  warm-ip-target: "5"
  minimum-ip-target: "2"

파일을 저장하고 편집기를 닫습니다.

Amazon EC2 Nitro 인스턴스 유형을 하나 이상 사용해 Windows 노드 그룹을 만듭니다. Nitro 인스턴스 유형 목록은 Amazon EC2 User Guide의 Nitro System 기반 인스턴스를 참조하세요. 기본적으로 노드에 배포할 수 있는 최대 Pod 수는 110입니다. 이 숫자를 늘리거나 줄이려면 부트스트랩 구성의 사용자 데이터에 다음을 지정합니다. max-pods-quantity를 max Pods 값으로 바꿉니다.

-KubeletExtraArgs '--max-pods=max-pods-quantity'

관리형 노드 그룹을 배포한다면 이 구성은 시작 템플릿에 추가해야 합니다. 자세한 내용은 시작 템플릿으로 관리형 노드 사용자 지정을 참조하세요. Windows 부트스트랩 스크립트의 구성 매개변수에 대한 자세한 내용은 부트스트랩 스크립트 구성 매개변수를 참조하세요.

max Pods 및 사용 가능한 IP 주소 확인

노드가 배포된 뒤 클러스터의 노드를 봅니다.

kubectl get nodes

예시 출력은 다음과 같습니다.

NAME                                             STATUS     ROLES    AGE   VERSION
ip-192-168-22-103.region-code.compute.internal   Ready         19m   v1.XX.X-eks-6b7464
ip-192-168-97-94.region-code.compute.internal    Ready         19m   v1.XX.X-eks-6b7464

노드 중 하나를 describe하여 노드의 max-pods 값과 사용 가능한 IP 주소 수를 확인합니다. 192.168.30.193을 이전 출력에서 반환된 노드 이름의 IPv4 주소로 바꿉니다.

kubectl describe node ip-192-168-30-193.region-code.compute.internal | grep 'pods\|PrivateIPv4Address'

예시 출력은 다음과 같습니다.

pods:                                  110
vpc.amazonaws.com/PrivateIPv4Address:  144

이전 출력에서 110은 144개의 IP 주소가 사용 가능함에도 Kubernetes가 노드에 배포할 최대 Pod 수입니다.

더 알아보기 (Learn more)