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

Amazon EC2 노드에 사용 가능한 IP 주소의 양 늘리기

기본적으로 pods에 할당할 수 있는 IP 주소 수는 탄력적 네트워크 인터페이스에 할당된 IP 주소 수와 Amazon EC2 노드에 연결된 네트워크 인터페이스 수를 기준으로 합니다. /28 IPv4 주소 접두사를 할당하도록 Amazon VPC CNI 추가 기능의 버전 1.9.0 이상을 구성할 수 있습니다. 1.10.1 이상의 추가 기능을 사용하면 여전히 /28 IPv4 주소 접두사를 할당할 수 있지만 클러스터가 버전 1.21 이상이고 IPv6용으로 구성한 경우 대신 /80 IPv6 주소 접두사를 할당할 수 있습니다.

접두사 할당을 위해 구성된 경우 CNI 추가 기능은 개별 IP 주소를 할당할 때보다 훨씬 더 많은 IP 주소를 네트워크 인터페이스에 할당할 수 있습니다. 그러면 노드는 pods에 훨씬 더 많은 사용 가능한 IP 주소를 할당할 수 있습니다. 추가 기능을 통해 이 작업을 수행할 수 있도록 하는 Amazon EC2 기능에 대한 자세한 내용은 Linux 인스턴스용 Amazon EC2 사용 설명서에서 Amazon EC2 네트워크 인터페이스에 접두사 할당 섹션을 참조하세요.

이 기능을 활성화하지 않으면 추가 기능은 pod 연결에 필요한 네트워크 인터페이스 및 IP 주소를 구성하기 위해 Amazon EC2 애플리케이션 프로그래밍 인터페이스(API) 호출을 더 많이 수행해야 합니다. 이러한 API 호출의 빈도와 각 VPC 많은 네트워크 인터페이스가 결합되어 클러스터가 더 커짐에 따라 pod 및 인스턴스 시작 시간이 길어질 수 있습니다. 이로 인해 규모가 크고 까다로운 워크로드의 수요를 충족하기 위해 확장이 지연되고 확장 요구 사항을 충족하기 위해 추가 클러스터와 VPC를 프로비저닝해야 하므로 비용 및 관리 오버헤드가 추가됩니다. 자세한 내용은 Kubernetes 확장성 임계값을 참조하세요.

고려 사항

  • AWS NITO 기반 노드는 이 기능을 사용합니다. NITO 기반이 아닌 인스턴스는 계속해서 개별 보조 IP 주소를 할당하지만 Nitro-based 인스턴스보다 pods에 할당할 IP 주소 수가 상당히 적습니다.

  • 네트워크 인터페이스에 접두사를 할당하도록 추가 기능을 구성한 후에는 클러스터의 모든 노드 그룹에 있는 모든 노드를 제거하지 않으면 1.9.0(또는 1.10.1) 이전 버전에 Amazon VPC CNI 추가 기능을 다운로드할 수 없습니다.

  • 이 기능을 지원하려면 VPC에 사용 가능한 인접한 /28 IPv4 주소 블록이 충분히 있어야 합니다.

  • 각 인스턴스 유형은 최대 pods 수를 지원합니다. 관리형 노드 그룹이 여러 인스턴스 유형으로 구성된 경우, 클러스터의 인스턴스에 대한 최대 pods 수 가운데 최소 수가 클러스터의 모든 노드에 적용됩니다.

  • 기존 관리형 노드 그룹이 있는 경우, 노드 그룹의 다음 AMI 또는 시작 템플릿 업데이트로 인해 새 작업자 노드에 새 IP 주소 접두사 할당이 활성화된 max-pod 값이 나타납니다.

사전 조건

  • 기존 클러스터가 있어야 합니다. 배포하려면 Amazon EKS 클러스터 생성 섹션을 참조하세요.

  • 클러스터에 배포된 Amazon VPC CNI plugin for Kubernetes 추가 기능의 버전 1.9.0 이상(버전 1.20 이하 클러스터 또는 IPv4용으로 구성된 1.21 이상 클러스터의 경우) 또는 1.10.1 이상(IPv6용으로 구성된 버전 1.21 이상의 클러스터용).

Amazon EC2 노드에 사용 가능한 IP 주소의 양을 늘리려면

  1. 현재 설치된 Amazon VPC CNI plugin for Kubernetes 버전이 1.9.0 또는 1.10.1 이상인지 확인하세요.

    kubectl describe daemonset aws-node --namespace kube-system | grep Image | cut -d "/" -f 2

    출력 예는 다음과 같습니다.

    amazon-k8s-cni:v1.10.1-eksbuild.1

    사용 중인 버전이 1.9.0 이전 버전인 경우 업데이트해야 합니다. 자세한 내용은 Amazon VPC CNI plugin for Kubernetes 추가 기능 관리의 업데이트 섹션을 참조하세요.

  2. 파라미터를 활성화하여 Amazon VPC CNI DaemonSet의 네트워크 인터페이스에 접두사를 할당합니다. 1.21 이상의 클러스터를 배포하는 경우 Amazon VPC CNI plugin 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 plugin for Kubernetes 로그에 다음 오류가 표시됩니다.

    "failed to allocate a private IP/Prefix address: InsufficientCidrBlocks: The specified subnet does not have enough free cidr blocks to satisfy the request"

    이는 서브넷에 분산된 기존 보조 IP 주소의 조각화로 인해 발생할 수 있습니다. 이 오류를 해결하려면 새 서브넷을 생성하고 거기서 pods를 시작하거나 Amazon EC2 서브넷 CIDR 예약을 사용하여 접두사 할당과 함께 사용할 서브넷 내에 공간을 예약합니다. 자세한 내용은 Amazon VPC 사용 설명서의 서브넷 CIDR 예약을 참조하세요.

  3. 시작 템플릿을 사용하지 않고 관리형 노드 그룹을 배포하거나 AMI ID를 지정하지 않은 시작 템플릿을 사용하여 배포하고, 사전 조건에 나열된 버전 이상의 Amazon VPC CNI plugin for Kubernetes 버전을 사용하고 있는 경우 다음 단계로 건너뜁니다. 관리형 노드 그룹은 자동으로 최대 pods 수를 계산합니다.

    AMI ID를 지정한 시작 템플릿을 사용하여 자체 관리형 노드 그룹 또는 관리형 노드 그룹을 배포하는 경우 Amazon EKS 권장 노드의 최대 pods 수를 결정해야 합니다. 각 Amazon EC2 인스턴스 유형의 Amazon EKS 권장 최대 pods 수의 지침을 따라 3단계에 --cni-prefix-delegation-enabled를 추가하세요. 이후 단계에서 사용하기 위해 출력을 적어 둡니다.

    중요

    관리형 노드 그룹은 maxPods의 값에 최대 수를 적용합니다. vCPU가 30개 미만인 인스턴스의 경우 최대 수는 110이고 다른 모든 인스턴스의 경우 최대 수는 250입니다. 이 최대 수는 접두사 위임의 활성화 여부에 관계없이 적용됩니다.

  4. IPv6용으로 구성된 1.21 이상 클러스터를 사용하는 경우 다음 단계로 건너뜁니다.

    다음 옵션 중 하나에서 파라미터를 지정합니다. 사용자에게 적합한 옵션과 이 옵션을 제공할 값을 결정하려면 GitHub에서 WARM_PREFIX_TARGET, WARM_IP_TARGET, MINIMUM_IP_TARGET 섹션을 참조하세요.

    example values을 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
  5. 하나 이상의 Amazon EC2 Nitro Amazon Linux 2 인스턴스 유형으로 다음 유형의 노드 그룹 중 하나를 생성합니다. Nitro 인스턴스 유형의 목록은 Linux 인스턴스용 Amazon EC2 사용 설명서에서 Nitro 시스템에 구축된 인스턴스 섹션을 참조하세요. 이 기능은 Windows에서 지원되지 않습니다. 110을 포함하는 옵션의 경우 3단계의 값(권장) 또는 고유한 값으로 바꿉니다.

    • 자체 관리형 - 자체 관리형 Amazon Linux 노드 시작하기의 지침에 따라 노드 그룹을 배포합니다. BootstrapArguments 파라미터에 다음 텍스트를 지정합니다.

      --use-max-pods false --kubelet-extra-args '--max-pods=110'

      eksctl을 사용하여 노드 그룹을 생성하려면 다음 명령을 사용합니다.

      eksctl create nodegroup --cluster my-cluster --managed=false --max-pods-per-node 110
    • 관리형 - 다음 옵션 중 하나를 사용하여 노드 그룹을 배포합니다.

      • 시작 템플릿을 사용하지 않거나 AMI ID가 지정되지 않은 시작 템플릿을 사용하는 경우(Without a launch template or with a launch template without an AMI ID specified) - 관리형 노드 그룹 생성의 절차를 완료합니다. 관리형 노드 그룹은 자동으로 Amazon EKS 권장 최대 max-pods 값을 계산합니다.

      • AMI ID가 지정된 시작 템플릿을 사용하는 경우(With a launch template with a specified AMI ID) - 시작 템플릿에서 Amazon EKS 최적화 AMI ID 또는 Amazon EKS 최적화 AMI에서 빌드한 사용자 지정 AMI를 지정한 다음 시작 템플릿을 사용하여 노드 그룹 배포를 지정하고 시작 템플릿에 다음 사용자 데이터를 입력합니다. 이 사용자 데이터는 인수를 bootstrap.sh 파일에 전달합니다. 부트스트랩 파일에 대한 자세한 내용은 GitHub에서 bootstrap.sh 섹션을 참조하세요.

        /etc/eks/bootstrap.sh my-cluster \ --use-max-pods false \ --kubelet-extra-args '--max-pods=110'

        eksctl을 사용하여 노드 그룹을 생성하려면 다음 명령을 사용합니다.

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

        Amazon EKS 최적화 AMI에서 빌드되지 않은 사용자 지정 AMI를 생성한 경우 직접 구성을 사용자 지정하여 생성해야 합니다.

      참고

      또한 인스턴스의 서브넷과 다른 서브넷의 pods에 IP 주소를 할당하려면 이 단계에서 기능을 활성화해야 합니다. 자세한 정보는 자습서: 사용자 지정 네트워킹을 참조하십시오.

  6. 노드가 배포되면 클러스터의 노드를 확인합니다.

    kubectl get nodes

    출력 예는 다음과 같습니다.

    NAME STATUS ROLES AGE VERSION ip-192-168-22-103.region-code.compute.internal Ready <none> 19m v1.20.4-eks-6b7464 ip-192-168-97-94.region-code.compute.internal Ready <none> 19m v1.20.4-eks-6b7464
  7. 노드 중 하나를 설명하여 노드의 최대 max-pods를 결정합니다.

    kubectl describe node node-name ip-192-168-22-103.region-code.compute.internal

    출력 예는 다음과 같습니다.

    ... Allocatable: attachable-volumes-aws-ebs: 25 cpu: 1930m ephemeral-storage: 76224326324 hugepages-1Gi: 0 hugepages-2Mi: 0 memory: 7244720Ki pods: 110 ...

    이전 출력에서 110은 Kubernetes가 노드에 배포할 최대 pods 수입니다.