Amazon EKS 클러스터의 포드에 사용할 특정 IP 서브넷을 선택하려면 어떻게 해야 하나요?

5분 분량
0

Amazon Elastic Kubernetes Service(Amazon EKS)에서 포드에 사용자 지정 서브넷 또는 IP 범위를 사용하고 싶습니다.

간략한 설명

포드가 Amazon EKS 클러스터에 사용 가능한 모든 서브넷을 사용하지 않는 경우가 있습니다. 이는 일부 노드 서브넷에 사용 가능한 IP 주소가 없지만 Amazon Virtual Private Cloud(VPC) 의 다른 서브넷은 활용도가 낮은 상태로 남아 있을 때 발생합니다.

Amazon EKS의 노드와 포드는 동일한 주소 공간, 즉 클러스터 VPC와 연결된 IP CIDR 범위의 IP 주소를 사용합니다. 구체적으로, Amazon EKS는 포드가 예약된 워커 노드와 동일한 서브넷에서 포드에 IP를 할당합니다.

예를 들어, node-1이 subnet-1에서 시작되었다고 가정해 보겠습니다. 즉, 노드의 기본 탄력적 네트워크 인터페이스가 subnet-1에 있습니다. 나중에 pod-A가 배포되고 node-1에 예약될 수 있습니다. 기본적으로 Amazon VPC CNI 플러그인은 subnet-1에 보조 탄력적 네트워크 인터페이스와 IP를 할당하여 pod-A에 IP 주소를 할당합니다.

따라서 사용자는 포드와 노드가 동일한 서브넷을 사용하기 때문에 IP 서브넷에 대한 사용자 지정 할당을 직접 제어할 수 없습니다. 노드에 많은 포드를 실행할 수 있는 충분한 컴퓨팅 파워가 있는 경우 포드는 노드 서브넷에서 사용 가능한 모든 IP 주소를 사용할 수 있습니다. 노드 서브넷의 IP 주소가 고갈되어 새 포드가 실행되지 않습니다. 이는 Amazon VPC의 다른 서브넷에 사용 가능한 IP 주소가 있는 경우에도 발생합니다.

해결 방법

Amazon VPC CNI의 사용자 지정 네트워킹 구성 요소를 사용하여 이 문제를 해결할 수 있습니다. 이 기능을 사용하면 포드에서 사용할 Amazon VPC 클러스터의 특정 서브넷을 정의할 수 있습니다. 이는 서브넷을 워커 노드에서 사용하는 서브넷과 구분합니다. 추가적으로, 포드에 보안 그룹을 정의할 수도 있습니다. 사용 사례에 대한 자세한 내용을 보려면 자습서: 사용자 지정 네트워킹을 참조하세요.

선행 조건

시작하기 전에 다음을 수행하세요.

클러스터에서 실행 중인 Amazon VPC CNI 플러그인의 최신 버전을 사용하는 것이 가장 좋습니다. 다음 명령을 실행하여 Amazon VPC 클러스터의 버전을 확인합니다.

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

참고: 사용하기에 가장 적합한 버전에 대한 자세한 내용은 자체 관리 애드온을 위한 Amazon VPC CNI 플러그인 업데이트를 참조하세요.

사용자 지정 서브넷 및 IP 범위 구성

Amazon VPC CNI 사용자 지정 네트워킹 기능을 사용하려면 다음 단계를 따르세요.

1.    Amazon VPC CNI 사용자 지정 네트워킹 기능을 켭니다.

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

2.    ENIConfig 객체를 생성하여 사용할 포드의 서브넷 및 보안 그룹을 정의합니다.

ENIConfig 객체는 하나의 서브넷과 보안 그룹 목록을 정의합니다. 노드에 단 하나의 ENIConfig 객체만 사용하여 주석을 달거나 레이블을 지정하면 해당 노드에 예약된 모든 포드는 해당 ENIConfig 객체에 정의된 서브넷과 보안 그룹을 사용합니다.

ENIConfig 객체를 노드에 자동 또는 수동으로 연결할 수 있습니다.

ENIConfig 객체를 노드에 자동으로 연결

이 옵션은 가용 영역당 ENIConfig 객체 하나(서브넷 1개)만 허용합니다. ENIConfig 이름은 AZ의 이름이어야 합니다.

1.    AZ 이름을 사용하여 ENIConfig 객체를 생성합니다.

cat <<EOF  | kubectl apply -f -
apiVersion: crd.k8s.amazonaws.com/v1alpha1
kind: ENIConfig
metadata:
 name: us-east-2a
spec:
  securityGroups: 
    - sg-xxxxxxxxxxxx
  subnet: subnet-XXXXXXXX
EOF


cat <<EOF | kubectl apply -f -
apiVersion: crd.k8s.amazonaws.com/v1alpha1
kind: ENIConfig
metadata:
 name: us-east-2b
spec:
  securityGroups: 
    - sg-xxxxxxxxxxxx
  subnet: subnet-YYYYYYYYY
EOF

2.    Amazon VPC-CNI를 활성화하면 노드 AZ와 일치하는 ENIConfig 객체로 노드에 자동으로 레이블을 지정할 수 있습니다.

kubectl set env daemonset aws-node -n kube-system ENI_CONFIG_LABEL_DEF=topology.kubernetes.io/zone

ENIConfig 객체를 노드에 수동으로 연결

이 옵션을 사용하면 가용 영역당 여러 ENIConfig 객체를 사용할 수 있습니다. 각 ENIConfig 객체에 사용자 지정 이름을 사용할 수 있다는 점에 유의하세요. 노드와 연결된 ENIConfig 객체가 동일한 가용 영역에 있는지 확인하세요.

참고: 하나의 ENIConfig 객체로는 하나의 노드에만 주석을 달 수 있지만 동일한 ENIConfig 객체로 여러 노드에 주석을 달 수 있습니다.

1.    다음과 같이 사용자 지정 이름을 가진 ENIConfig 객체를 생성합니다.

cat <<EOF  | kubectl apply -f -
apiVersion: crd.k8s.amazonaws.com/v1alpha1
kind: ENIConfig
metadata:
 name: my-conf-1-us-east-2a
spec:
  securityGroups: 
    - sg-xxxxxxxxxxxx
  subnet: subnet-XXXXXXXX
EOF


cat <<EOF | kubectl apply -f -
apiVersion: crd.k8s.amazonaws.com/v1alpha1
kind: ENIConfig
metadata:
 name: my-conf-2-us-east-2a
spec:
  securityGroups: 
    - sg-xxxxxxxxxxxx
  subnet: subnet-ZZZZZZZZZZ
EOF

2.    ENIConfig 객체로 노드에 수동으로 주석을 답니다. 연결된 ENIConfig 객체의 노드와 서브넷이 동일한 가용 영역에 있는지 확인하세요.

kubectl annotate node ip-192-168-0-126.us-east-2.compute.internal k8s.amazonaws.com/eniConfig=my-conf-1-us-east-2a

이 수동 주석은 Amazon VPC CNI에서 자동으로 추가한 레이블보다 우선합니다.

새 노드를 시작하여 현재 워커 노드를 대체

Amazon VPC CNI에서 사용자 지정 네트워킹 기능을 활성화하기 전에는 기존 워커 노드에 노드 서브넷의 보조 탄력적 네트워크 인터페이스 및 IP가 있을 수 있습니다. 따라서 새 노드를 시작해야 해당 노드와 연결된 ENIConfig 객체에 정의된 서브넷에서 보조 탄력적 네트워크 인터페이스 및 IP를 할당할 수 있습니다.

1.    다음 노드 그룹 옵션 중 하나를 사용하고 있는지 확인하세요.

  • 자체 관리형 노드 그룹
  • 사용자 지정 AMI ID가 있는 관리형 노드 그룹

참고: 이러한 노드 그룹 유형으로 노드를 생성하는 경우 2단계로 진행하여 노드의 최대 포드 수를 수동으로 정의하세요. 사용자 지정 AMI를 지정하지 않고 관리형 노드 그룹에서 노드를 시작하는 경우 Amazon EKS가 노드의 최대 포드 수를 자동으로 업데이트합니다. 자세한 내용은 관리형 노드 그룹을 참조하세요.

2.    노드당 최대 포드 수를 결정합니다. 사용자 지정 네트워킹을 사용하는 경우 노드의 기본 네트워크 인터페이스는 포드 IP에 사용되지 않습니다. 최대 포드 계산기 스크립트를 사용하여 최대 포드 값을 결정하려면 각 EC2 인스턴스 유형에 대한 Amazon EKS 권장 최대 포드 수를 참조하세요.

참고: 위의 스크립트와 함께 cni-custom-networking-enabled 플래그를 사용하여 자신의 인스턴스가 아닌 다른 서브넷에서 포드를 시작하세요.

3.    새 노드의 User Data 스크립트를 업데이트하여 필수 플래그를 포함시킵니다. 예:

#!/bin/bash
/etc/eks/bootstrap.sh my_cluster_name --use-max-pods false --kubelet-extra-args '--max-pods=20'

참고: my_cluster_name을 EKS 클러스터 이름으로 바꾸세요. 부트스트랩 기능에 대한 자세한 내용은 GitHub 웹 사이트의 awslabs/amazon-eks-ami를 참조하세요.

4.    새 포드 사용자 지정 네트워킹 구성을 사용하려면 포드를 다시 생성합니다.

추가 고려 사항

  • 기본적으로 포드에서 클러스터 VPC CIDR 외부의 IP 주소로의 트래픽은 노드의 기본 인터페이스와 IP 주소를 사용합니다. 따라서 이 트래픽은 ENIConfig에 정의된 서브넷과 보안 그룹을 사용하지 않습니다. 대신 트래픽은 노드의 기본 네트워크 인터페이스의 보안 그룹과 서브넷을 사용합니다. 자세한 내용은 포드용 SNAT를 참조하세요.
  • 포드에도 보안 그룹을 사용하는 경우 ENIConfig 객체에 지정된 보안 그룹 대신 SecurityGroupPolicy에 지정된 보안 그룹이 사용됩니다**.**
  • GitHub 웹 사이트의 최신 업데이트는 CNI 사용자 지정 네트워킹 단순화를 참조하세요.
  • VPC에 더 많은 IP CIDR 범위를 추가하려면 Amazon EKS에서 여러 CIDR 범위를 사용하려면 어떻게 해야 하나요?의 단계를 따르세요.

AWS 공식
AWS 공식업데이트됨 일 년 전
댓글 없음

관련 콘텐츠