Amazon EKS로 여러 CIDR 범위를 사용하려면 어떻게 해야 하나요?

6분 분량
0

Amazon Elastic Kubernetes Service(Amazon EKS)로 여러 CIDR 범위를 사용하여 포드 관련 문제를 해결하고 싶습니다.

간략한 설명

해결 방법 섹션의 단계를 완료하기 전에 다음 사항이 있는지 확인하세요.

참고:

중요: Amazon EKS가 클러스터를 생성한 후 VPC에 추가하는 CIDR 블록의 서브넷에서 시작하는 노드와 통신할 수 없는 경우도 일부 있습니다. 기존 클러스터에 CIDR 블록을 추가하는 경우 업데이트된 범위가 나타나기까지 최대 5시간이 걸릴 수 있습니다.

해결 방법

참고: AWS Command Line Interface(AWS CLI) 명령 실행 시 오류가 발생하는 경우, AWS CLI 오류 문제 해결을 참고하세요. 또한 최신 AWS CLI 버전을 사용하고 있는지 확인하세요.

다음 해결 방법에서 먼저 VPC를 설정합니다. 그런 다음 새 CIDR 범위를 사용하도록 CNI 플러그인을 구성합니다.

더 많은 CIDR 범위를 추가하여 VPC 네트워크 확장

다음 단계를 완료하세요.

  1. 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'
  2. 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 범위로 서브넷 생성

다음 단계를 완료하세요.

  1.  해당 리전의 모든 가용 영역을 나열하려면 다음 명령을 실행합니다.

    aws ec2 describe-availability-zones --region us-east-1 --query 'AvailabilityZones[*].ZoneName'

    참고: us-east-1을 원하는 리전으로 바꾸세요.

  2. 서브넷을 추가할 가용 영역을 선택한 다음 변수에 해당 가용 영역을 할당합니다. 예를 들면 다음과 같습니다.

    export AZ1=us-east-1a
    export AZ2=us-east-1b
    export AZ3=us-east-1c

    참고: 더 많은 가용 영역을 추가하려면 추가 변수를 생성하세요.

  3. 새 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)
  4. (선택 사항) 키-값 쌍을 설정하여 서브넷에 이름 태그를 추가합니다. 예를 들면 다음과 같습니다.

    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

새 서브넷을 라우팅 테이블에 연결

다음 단계를 완료하세요.

  1. VPC 아래에 전체 라우팅 테이블을 나열하려면 다음 명령을 실행합니다.

    aws ec2 describe-route-tables --filters Name=vpc-id,Values=$VPC_ID |jq -r '.RouteTables[].RouteTableId'
  2. 라우팅 테이블을 변수로 내보내려면 다음 명령을 실행합니다.

    export RTASSOC_ID=rtb-abcabcabc

    참고: rtb-abcabcabc를 이전 단계의 값으로 바꿉니다.

  3. 라우팅 테이블을 모든 새 서브넷에 연결합니다. 예를 들면 다음과 같습니다.

    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 플러그인 구성

다음 단계를 완료하세요.

  1. 클러스터에 최신 버전의 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
  2. 워커 노드를 식별하기 위해 ENIConfig 레이블을 추가하려면 다음 명령을 실행합니다.

    kubectl set env daemonset aws-node -n kube-system ENI_CONFIG_LABEL_DEF=failure-domain.beta.kubernetes.io/zone
  3. 모든 서브넷과 가용 영역에 대한 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는 워커 노드의 가용 영역과 일치해야 합니다.

  4. 워커 노드를 시작하여 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'>
  5. 서브넷의 보안 그룹을 기록하고 보안 그룹을 연결된 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를 사용자의 보안 그룹으로 바꾸세요.

  6. 기존 워커 노드를 종료하세요.

  7. 다음과 같이 새 배포를 시작하여 구성을 테스트합니다.

    kubectl create deployment nginx-test --image=nginx --replicas=10   
    kubectl get pods -o wide --selector=app=nginx-test

    참고: 이전 테스트 배포에 열 개의 새 포드가 추가되고 새 CIDR 범위가 새 워커 노드에 예약됩니다.

AWS 공식
AWS 공식업데이트됨 한 달 전
댓글 없음

관련 콘텐츠