New user sign up using AWS Builder ID
New user sign up using AWS Builder ID is currently unavailable on re:Post. To sign up, please use the AWS Management Console instead.
Amazon EKS로 여러 CIDR 범위를 사용하려면 어떻게 해야 하나요?
Amazon Elastic Kubernetes Service(Amazon EKS)로 여러 CIDR 범위를 사용하여 포드 관련 문제를 해결하고 싶습니다.
간략한 설명
해결 방법 섹션의 단계를 완료하기 전에 다음 사항이 있는지 확인하세요.
- 실행 중인 Amazon EKS 클러스터
- 최신 버전의 AWS Command Line Interface(AWS CLI)
- Amazon Virtual Private Cloud(VPC)를 관리하기 위한 AWS Identity and Access Management(IAM) 권한
- 사용자 지정 리소스를 생성하고 DaemonSet을 편집할 수 있는 권한을 가진 kubectl
- 시스템에 설치된 버전의 jq
참고: jq를 다운로드 및 설치하려면 jq 웹 사이트에서 jq 다운로드를 참조하세요. - Bash 쉘을 사용하는 Unix 기반 시스템
- 이미 구성된 VPC
참고:
- 클러스터를 생성하기 이전 또는 이후에 프라이빗(RFC 1918) 및 퍼블릭(비 RFC 1918) CIDR 블록을 VPC에 연결할 수 있습니다.
- 캐리어급 Network Address Translation(NAT)을 사용하는 시나리오에서는 100.64.0.0/10이 프라이빗 네트워크 범위입니다. 프라이빗 네트워크 범위는 서비스 공급자와 구독자 간의 통신을 위한 공유 주소 스페이스에서 사용됩니다. 포드가 인터넷과 통신하려면 라우팅 테이블에 NAT 게이트웨이가 구성되어 있어야 합니다. AWS Fargate 클러스터는 DaemonSet을 지원하지 않습니다. Fargate 프로필에 보조 CIDR 범위를 추가하려면 VPC의 보조 CIDR 블록의 서브넷을 사용하세요. 그런 다음 Fargate 프로필에 서브넷을 추가하기 전에 새 서브넷에 태그를 지정하세요.
중요: Amazon EKS가 클러스터를 생성한 후 VPC에 추가하는 CIDR 블록의 서브넷에서 시작하는 노드와 통신할 수 없는 경우도 일부 있습니다. 기존 클러스터에 CIDR 블록을 추가하는 경우 업데이트된 범위가 나타나기까지 최대 5시간이 걸릴 수 있습니다.
해결 방법
참고: AWS Command Line Interface(AWS CLI) 명령 실행 시 오류가 발생하는 경우, AWS CLI 오류 문제 해결을 참고하세요. 또한 최신 AWS CLI 버전을 사용하고 있는지 확인하세요.
다음 해결 방법에서 먼저 VPC를 설정합니다. 그런 다음 새 CIDR 범위를 사용하도록 CNI 플러그인을 구성합니다.
더 많은 CIDR 범위를 추가하여 VPC 네트워크 확장
다음 단계를 완료하세요.
-
VPC를 찾아보세요.
VPC에 태그가 있는 경우 다음 명령을 실행하여 VPC를 찾으세요.VPC_ID=$(aws ec2 describe-vpcs --filters Name=tag:Name,Values=yourVPCName | jq -r '.Vpcs[].VpcId')
VPC에 태그가 없는 경우 다음 명령을 실행하여 해당 AWS 리전의 모든 VPC를 나열합니다.
aws ec2 describe-vpcs --filters | jq -r '.Vpcs[].VpcId'
-
VPC를 VPC_ID 변수에 연결하려면 다음 명령을 실행합니다.
export VPC_ID=vpc-xxxxxxxxxxxx
범위가 100.64.0.0/16인 다른 CIDR 블록을 해당 VPC에 연결하려면 다음 명령을 실행합니다.
aws ec2 associate-vpc-cidr-block --vpc-id $VPC_ID --cidr-block 100.64.0.0/16
새 CIDR 범위로 서브넷 생성
다음 단계를 완료하세요.
-
해당 리전의 모든 가용 영역을 나열하려면 다음 명령을 실행합니다.
aws ec2 describe-availability-zones --region us-east-1 --query 'AvailabilityZones[*].ZoneName'
참고: us-east-1을 원하는 리전으로 바꾸세요.
-
서브넷을 추가할 가용 영역을 선택한 다음 변수에 해당 가용 영역을 할당합니다. 예를 들면 다음과 같습니다.
export AZ1=us-east-1a export AZ2=us-east-1b export AZ3=us-east-1c
참고: 더 많은 가용 영역을 추가하려면 추가 변수를 생성하세요.
-
새 CIDR 범위를 사용하여 VPC에서 새 서브넷을 생성하려면 다음 명령을 실행합니다.
CUST_SNET1=$(aws ec2 create-subnet --cidr-block 100.64.0.0/19 --vpc-id $VPC_ID --availability-zone $AZ1 | jq -r .Subnet.SubnetId) CUST_SNET2=$(aws ec2 create-subnet --cidr-block 100.64.32.0/19 --vpc-id $VPC_ID --availability-zone $AZ2 | jq -r .Subnet.SubnetId) CUST_SNET3=$(aws ec2 create-subnet --cidr-block 100.64.64.0/19 --vpc-id $VPC_ID --availability-zone $AZ3 | jq -r .Subnet.SubnetId)
-
(선택 사항) 키-값 쌍을 설정하여 서브넷에 이름 태그를 추가합니다. 예를 들면 다음과 같습니다.
aws ec2 create-tags --resources $CUST_SNET1 --tags Key=Name,Value=SubnetA aws ec2 create-tags --resources $CUST_SNET2 --tags Key=Name,Value=SubnetB aws ec2 create-tags --resources $CUST_SNET3 --tags Key=Name,Value=SubnetC
새 서브넷을 라우팅 테이블에 연결
다음 단계를 완료하세요.
-
VPC 아래에 전체 라우팅 테이블을 나열하려면 다음 명령을 실행합니다.
aws ec2 describe-route-tables --filters Name=vpc-id,Values=$VPC_ID |jq -r '.RouteTables[].RouteTableId'
-
라우팅 테이블을 변수로 내보내려면 다음 명령을 실행합니다.
export RTASSOC_ID=rtb-abcabcabc
참고: rtb-abcabcabc를 이전 단계의 값으로 바꿉니다.
-
라우팅 테이블을 모든 새 서브넷에 연결합니다. 예를 들면 다음과 같습니다.
aws ec2 associate-route-table --route-table-id $RTASSOC_ID --subnet-id $CUST_SNET1 aws ec2 associate-route-table --route-table-id $RTASSOC_ID --subnet-id $CUST_SNET2 aws ec2 associate-route-table --route-table-id $RTASSOC_ID --subnet-id $CUST_SNET3
자세한 내용은 다음에서 라우팅 섹션을 참조하세요. 예제: 프라이빗 서브넷 및 NAT에 서버가 있는 VPC.
새 CIDR 범위를 사용하도록 CNI 플러그인 구성
다음 단계를 완료하세요.
-
클러스터에 최신 버전의 vpc-cni 플러그인을 추가합니다. 클러스터의 버전을 확인하려면 다음 명령을 실행합니다.
kubectl describe daemonset aws-node --namespace kube-system | grep Image | cut -d "/" -f 2
CNI 플러그인용 사용자 지정 네트워크 구성을 켜려면 다음 명령을 실행합니다.
kubectl set env daemonset aws-node -n kube-system AWS_VPC_K8S_CNI_CUSTOM_NETWORK_CFG=true
-
워커 노드를 식별하기 위해 ENIConfig 레이블을 추가하려면 다음 명령을 실행합니다.
kubectl set env daemonset aws-node -n kube-system ENI_CONFIG_LABEL_DEF=failure-domain.beta.kubernetes.io/zone
-
모든 서브넷과 가용 영역에 대한 ENIConfig 사용자 지정 리소스를 생성하려면 다음 명령을 실행합니다.
cat <<EOF | kubectl apply -f - apiVersion: crd.k8s.amazonaws.com/v1alpha1 kind: ENIConfig metadata: name: $AZ1 spec: subnet: $CUST_SNET1 EOF cat <<EOF | kubectl apply -f - apiVersion: crd.k8s.amazonaws.com/v1alpha1 kind: ENIConfig metadata: name: $AZ2 spec: subnet: $CUST_SNET2 EOF cat <<EOF | kubectl apply -f - apiVersion: crd.k8s.amazonaws.com/v1alpha1 kind: ENIConfig metadata: name: $AZ3 spec: subnet: $CUST_SNET3 EOF
참고: ENIConfig는 워커 노드의 가용 영역과 일치해야 합니다.
-
워커 노드를 시작하여 CNI 플러그인(ipamd)이 새 CIDR 범위의 IP 주소를 새 워커 노드에 할당할 수 있도록 합니다.
사용자 지정 네트워킹을 사용하는 경우 기본 네트워크 인터페이스가 포드 배치에 사용되지 않습니다. 이 경우 먼저 다음 공식을 사용하여 max-pods를 업데이트해야 합니다.maxPods = (number of interfaces - 1) \* (max IPv4 addresses per interface - 1) + 2
자체 관리형 노드 그룹을 사용하는 경우 자체 관리형 Amazon Linux 노드 시작에 나와 있는 단계를 따르세요. ENIConfig 리소스에서 사용한 서브넷을 지정하지 마세요. 대신 BootstrapArguments 파라미터에 다음을 지정하세요.
--use-max-pods false --kubelet-extra-args '--max-pods=<20>'
시작 템플릿이나 지정된 Amazon Machine Image(AMI) ID가 없는 관리자 노드 그룹을 사용하는 경우 관리형 노드 그룹이 자동으로 최대 포드 값을 계산합니다. 관리형 노드 그룹 생성의 단계를 따르세요. 또는 다음과 같이 Amazon EKS CLI를 사용하여 관리형 노드 그룹을 생성하세요.
aws eks create-nodegroup --cluster-name <sample-cluster-name> --nodegroup-name <sample-nodegroup-name> --subnets <subnet-123 subnet-456> --node-role <arn:aws:iam::123456789012:role/SampleNodeRole>
지정된 AMI ID가 있는 관리형 노드 그룹 시작 템플릿을 사용하는 경우 시작 템플릿에서 Amazon EKS에 최적화된 AMI ID를 지정하세요. 또는 Amazon EKS에 최적화된 AMI를 기반으로 하는 사용자 지정 AMI를 사용하세요. 그런 다음 시작 템플릿을 사용하여 노드 그룹을 배포하고 시작 템플릿에 다음 사용자 데이터를 제공하세요.
#!/bin/bash /etc/eks/bootstrap.sh <my-cluster-name> --kubelet-extra-args <'--max-pods=20'>
-
서브넷의 보안 그룹을 기록하고 보안 그룹을 연결된 ENIConfig에 다음과 같이 적용합니다.
cat <<EOF | kubectl apply -f -apiVersion: crd.k8s.amazonaws.com/v1alpha1 kind: ENIConfig metadata: name: $AZ1 spec: securityGroups: - sg-xxxxxxxxxxxx subnet: $CUST_SNET1 EOF cat <<EOF | kubectl apply -f - apiVersion: crd.k8s.amazonaws.com/v1alpha1 kind: ENIConfig metadata: name: $AZ2 spec: securityGroups: - sg-xxxxxxxxxxxx subnet: $CUST_SNET2 EOF cat <<EOF | kubectl apply -f - apiVersion: crd.k8s.amazonaws.com/v1alpha1 kind: ENIConfig metadata: name: $AZ3 spec: securityGroups: - sg-xxxxxxxxxxxx subnet: $CUST_SNET3 EOF
참고: sg-xxxxxxxxxxxx를 사용자의 보안 그룹으로 바꾸세요.
-
다음과 같이 새 배포를 시작하여 구성을 테스트합니다.
kubectl create deployment nginx-test --image=nginx --replicas=10 kubectl get pods -o wide --selector=app=nginx-test
참고: 이전 테스트 배포에 열 개의 새 포드가 추가되고 새 CIDR 범위가 새 워커 노드에 예약됩니다.

관련 콘텐츠
- 질문됨 2일 전lg...
- 질문됨 5달 전lg...
- 질문됨 2달 전lg...
- 질문됨 6달 전lg...
- AWS 공식업데이트됨 3년 전
- AWS 공식업데이트됨 2년 전
- AWS 공식업데이트됨 3달 전
- AWS 공식업데이트됨 2년 전