자습서: pods 및 services에 IPv6 주소 할당 - Amazon EKS

자습서: pods 및 services에 IPv6 주소 할당

기본적으로 Kubernetes는 pods 및 services에 IPv4 주소를 할당합니다. pods 및 services에 IPv4 주소를 할당하는 대신 IPv6 주소를 할당하도록 클러스터를 구성할 수 있습니다. Kubernetes가 1.23 버전 이상인 경우에도 Amazon EKS는 이중 스택 pods 또는 services를 지원하지 않습니다. 결과적으로 pods 및 services에 IPv4IPv6 주소를 모두 할당할 수 없습니다.

클러스터를 생성할 때 클러스터에 사용할 IP 패밀리를 선택합니다. 클러스터를 생성한 후에는 패밀리를 변경할 수 없습니다.

클러스터에 IPv6 패밀리 사용 시 고려 사항:

  • 버전 1.21 이상의 새 클러스터를 생성하고 해당 클러스터에 IPv6 패밀리를 사용하도록 지정해야 합니다. 이전 버전에서 업데이트한 클러스터에 IPv6 패밀리를 사용 설정할 수 없습니다. 새 클러스터를 생성하는 방법에 대한 지침은 Amazon EKS 클러스터 생성 섹션을 참조하세요.

  • 클러스터에 배포하는 Amazon VPC CNI 추가 기능의 버전은 1.10.1 이상이어야 합니다. 이 버전 이상은 기본적으로 새 1.21 이상 클러스터와 함께 배포됩니다. 추가 기능을 배포하면 클러스터의 모든 노드 그룹에 있는 모든 노드를 제거하지 않으면 1.10.1 이전 버전에 Amazon VPC CNI 추가 기능을 다운로드할 수 없습니다.

  • Windows pods 및 services는 지원되지 않습니다.

  • Amazon EC2 노드를 사용하는 경우 IP 접두사 위임 및 IPv6를 사용하여 Amazon VPC CNI 추가 기능을 구성해야 합니다. 클러스터를 생성할 때 IPv6 패밀리를 선택하면 1.10.1 버전의 추가 기능이 이 구성으로 기본 설정됩니다. 이는 자체 관리형 또는 Amazon EKS 추가 기능 모두에 해당됩니다. IP 접두사 위임에 대한 자세한 내용은 Amazon EC2 노드에 사용 가능한 IP 주소의 양 늘리기 섹션을 참조하세요.

  • 클러스터를 생성할 때 지정한 VPC 및 서브넷에는 지정한 VPC 및 서브넷에 할당된 IPv6 CIDR 블록이 있어야 합니다. 또한 할당된 IPv4 CIDR 블록도 있어야 합니다. IPv6만 사용하려는 경우에도 VPC가 작동하려면 IPv4 CIDR 블록이 필요하기 때문입니다. 자세한 내용을 알아보려면 Amazon VPC 사용 설명서의 IPv6 CIDR 블록을 VPC와 연결을 참조하세요.

  • 클러스터 및 노드를 생성할 때 IPv6 주소를 자동 할당하도록 구성된 서브넷을 지정해야 합니다. 그렇지 않으면 클러스터와 노드를 배포할 수 없습니다. 기본적으로 이 구성은 사용 중지되어 있습니다. 자세한 내용을 알아보려면 Amazon VPC 사용 설명서의 서브넷의 IPv6 주소 지정 속성 수정을 참조하세요.

  • 서브넷에 할당된 라우팅 테이블에는 IPv6 주소에 대한 경로가 있어야 합니다. 자세한 내용을 알아보려면 Amazon VPC 사용 설명서의 IPv6로 마이그레이션을 참조하세요.

  • 보안 그룹은 IPv6 주소를 허용해야 합니다. 자세한 내용을 알아보려면 Amazon VPC 사용 설명서의 IPv6로 마이그레이션을 참조하세요.

  • AWS Nitro 기반 Amazon EC2 또는 Fargate 노드에서만 IPv6를 사용할 수 있습니다.

  • Amazon EC2 노드에서는 pods의 보안 그룹과 함께 IPv6를 사용할 수 없습니다. 그러나 Fargate 노드에서는 사용할 수 있습니다. 개별 pods에 대해 별도의 보안 그룹이 필요한 경우 Amazon EC2 노드와 함께 IPv4 패밀리를 계속 사용하거나 대신 Fargate 노드를 사용합니다.

  • 이전에 IP 주소 소모를 완화하는 데 도움이 되도록 사용자 지정 네트워킹을 사용한 경우 대신 IPv6를 사용할 수 있습니다. IPv6에서는 사용자 지정 네트워킹을 사용할 수 없습니다. 네트워크 격리를 위해 사용자 정의 네트워킹을 사용하는 경우 클러스터에 사용자 정의 네트워킹 및 IPv4 패밀리를 계속 사용해야 할 수 있습니다.

  • AWS Outposts에 배포된 노드에서는 IPv6를 사용할 수 없습니다.

  • Pods 및 services만 IPv6 주소에 할당됩니다. IPv4 주소는 할당되지 않습니다. pods는 인스턴스 자체의 NAT를 통해 IPv4 엔드포인트와 통신할 수 있으므로 DNS64 및 NAT64가 필요하지 않습니다. 트래픽에 퍼블릭 IP 주소가 필요한 경우 트래픽은 퍼블릭 IP로 변환된 소스 네트워크 주소입니다.

  • pod의 소스 IPv6 주소는 VPC 외부에서 통신할 때 노드의 IPv6 주소로 변환된 소스 네트워크 주소가 아닙니다. 인터넷 게이트웨이 또는 외부 전용 인터넷 게이트웨이를 사용하여 라우팅됩니다.

  • 모든 노드에 IPv4IPv6 주소가 할당됩니다.

  • Amazon FSx for Lustre CSI 드라이버은(는) 지원되지 않습니다.

  • 인스턴스 모드가 아닌 IP 모드에서 AWS 로드 밸런서 컨트롤러 버전 2.3.1 이상을 사용하여 애플리케이션 또는 네트워크 트래픽을 IPv6 pods로 로드 밸런싱할 수 있습니다. 자세한 정보는 AWS Load Balancer Controller 추가 기능 설치을 참조하십시오.

  • IPv6 IAM 정책을 노드 IAM 또는 CNI IAM 역할에 연결해야 합니다. 둘 사이에서 CNI IAM 역할에 연결하는 것이 좋습니다. 자세한 내용은 IPv6 패밀리를 사용하는 클러스터에 대한 IAM 정책 생성1단계 - Amazon VPC CNI plugin for Kubernetes IAM 역할 생성 섹션을 참조하세요.

  • 각 Fargate pod는 배포된 서브넷에 대해 지정된 CIDR에서 IPv6 주소를 수신합니다. Fargate pods를 실행하는 기본 하드웨어 장치는 하드웨어 장치가 배포된 서브넷에 할당된 CIDR에서 고유한 IPv4IPv6 주소를 가져옵니다.

  • IPv6 클러스터를 배포하기 전에 통합하는 애플리케이션, Amazon EKS 추가 기능 및 AWS 서비스를 철저히 평가하는 것이 좋습니다. 이는 IPv6에서 모든 것이 예상대로 작동하는지 확인하기 위한 것입니다.

  • AWS App Mesh에서는 IPv6를 사용할 수 없습니다.

  • Amazon EC2 인스턴스 메타데이터 서비스 IPv6 엔드포인트 사용은 Amazon EKS에서 지원되지 않습니다.

  • IPv6 패밀리를 사용하는 클러스터에서 자체 관리형 노드 그룹을 생성하는 경우 사용자 데이터에는 노드 시작 시 실행되는 bootstrap.sh 파일에 대한 다음 BootstrapArguments가 포함되어야 합니다. your-cidr를 클러스터 VPC의 IPv6 CIDR 범위로 교체합니다.

    --ip-family ipv6 --service-ipv6-cidr your-cidr

    클러스터의 IPv6 CIDR 범위를 모르는 경우 다음 명령을 사용하여 확인할 수 있습니다(AWS CLI 버전 2.4.9 이상 필요).

    aws eks describe-cluster --name my-cluster --query cluster.kubernetesNetworkConfig.serviceIpv6Cidr --output text

IPv6 클러스터 및 관리형 Amazon Linux 노드 배포

이 튜토리얼에서는 IPv6 Amazon VPC, IPv6 패밀리가 있는 Amazon EKS 클러스터 및 Amazon EC2 Amazon Linux 노드가 있는 관리형 노드 그룹을 배포합니다. IPv6 클러스터에는 Amazon EC2 Windows 노드를 배포할 수 없습니다. Fargate 노드를 클러스터에 배포할 수도 있지만 이 항목에서는 단순화를 위해 해당 지침을 제공하지 않습니다.

프로덕션 용도로 클러스터를 생성하기 전에 모든 설정을 숙지하고 요구 사항을 충족하는 설정으로 클러스터를 배포하는 것이 좋습니다. 자세한 내용은 Amazon EKS 클러스터 생성, 관리형 노드 그룹 및 이 주제에 대한 고려 사항을 참조하세요. 클러스터를 생성할 때 일부 설정만 사용 설정할 수 있습니다.

사전 조건

이 자습서에서는 Amazon EKS 클러스터를 생성하고 관리할 때 필요한 다음 도구 및 리소스를 설치하고 구성해야 합니다.

  • 디바이스 또는 AWS CloudShell에 설치된 kubectl 명령줄 도구. 버전은 클러스터의 Kubernetes 버전과 동일하거나 최대 하나 이전 또는 이후의 마이너 버전일 수 있습니다. 예를 들어 클러스터 버전이 1.22인 경우 kubectl 버전 1.21, 1.22 또는 1.23를 함께 사용할 수 있습니다. kubectl을 설치하거나 업그레이드하려면 kubectl 설치 또는 업데이트 섹션을 참조하세요. 이 자습서의 경우 버전은 1.21 이상이어야 합니다.

  • 사용하는 IAM 보안 주체에는 Amazon EKS IAM 역할 및 서비스 연결 역할, AWS CloudFormation, VPC 및 관련 리소스를 사용할 수 있는 권한이 있어야 합니다. 자세한 내용은 IAM 사용 설명서의 Amazon Elastic Kubernetes Service에 사용되는 작업, 리소스 및 조건 키서비스 연결 역할 사용을 참조하세요.

eksctl 또는 AWS CLI를 사용하여 리소스를 생성하는 절차가 제공됩니다. AWS Management Console을 사용하여 리소스를 배포할 수도 있지만 단순화를 위해 이 주제에서는 해당 지침을 제공하지 않습니다.

eksctl

사전 조건

eksctl 버전 0.110.0 이상이 컴퓨터에 설치되어 있습니다. 설치하거나 업데이트하려면 eksctl 설치 또는 업데이트 섹션을 참조하세요.

eksctl을 사용하여 IPv6 클러스터 배포

  1. 다음 콘텐츠를 디바이스에 복사합니다. example values을 사용자의 값으로 교체합니다. region-code를 Amazon EKS에서 지원하는 AWS 리전으로 바꿉니다. AWS 리전 목록은 AWS 일반 참조 가이드의 Amazon EKS 엔드포인트 및 할당량을 참조하세요. t3.mediumAWS Nitro 시스템 인스턴스 유형으로 바꿀 수 있습니다. version 값은 1.21 이상의 지원되는 Amazon EKS Kubernetes 버전이어야 합니다. 이름에는 영숫자(대소문자 구분)와 하이픈만 사용할 수 있습니다. 영문자로 시작해야 하며 100자 이하여야 합니다. 값을 바꾼 후 수정된 명령을 실행하여 ipv6-cluster.yaml 파일을 생성합니다.

    cat >ipv6-cluster.yaml <<EOF --- apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: name: my-cluster region: region-code version: "1.21" kubernetesNetworkConfig: ipFamily: IPv6 addons: - name: vpc-cni version: latest - name: coredns version: latest - name: kube-proxy version: latest iam: withOIDC: true managedNodeGroups: - name: my-nodegroup instanceType: t3.medium EOF
  2. 클러스터를 생성합니다.

    eksctl create cluster -f ipv6-cluster.yaml

    클러스터 생성에 몇 분 정도 걸립니다. 다음 출력과 유사한 출력의 마지막 줄이 나타날 때까지 진행하지 마세요.

    ... [✓] EKS cluster "my-cluster" in "region-code" region is ready
  3. 기본 pods에 IPv6 주소가 할당되었는지 확인합니다.

    kubectl get pods -n kube-system -o wide

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

    NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES aws-node-rslts 1/1 Running 1 5m36s 2600:1f13:b66:8200:11a5:ade0:c590:6ac8 ip-192-168-34-75.region-code.compute.internal <none> <none> aws-node-t74jh 1/1 Running 0 5m32s 2600:1f13:b66:8203:4516:2080:8ced:1ca9 ip-192-168-253-70.region-code.compute.internal <none> <none> coredns-85d5b4454c-cw7w2 1/1 Running 0 56m 2600:1f13:b66:8203:34e5:: ip-192-168-253-70.region-code.compute.internal <none> <none> coredns-85d5b4454c-tx6n8 1/1 Running 0 56m 2600:1f13:b66:8203:34e5::1 ip-192-168-253-70.region-code.compute.internal <none> <none> kube-proxy-btpbk 1/1 Running 0 5m36s 2600:1f13:b66:8200:11a5:ade0:c590:6ac8 ip-192-168-34-75.region-code.compute.internal <none> <none> kube-proxy-jjk2g 1/1 Running 0 5m33s 2600:1f13:b66:8203:4516:2080:8ced:1ca9 ip-192-168-253-70.region-code.compute.internal <none> <none>
  4. 기본 서비스에 IPv6 주소가 할당되었는지 확인합니다.

    kubectl get services -n kube-system -o wide

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

    NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR kube-dns ClusterIP fd30:3087:b6c2::a <none> 53/UDP,53/TCP 57m k8s-app=kube-dns
  5. (선택 사항) 샘플 애플리케이션을 배포하거나 AWS Load Balancer Controller 및 샘플 애플리케이션을 로드 밸런서 애플리케이션에 배포하거나 네트워크 트래픽을 IPv6 pods에 배포합니다.

  6. 이 자습서용으로 생성한 클러스터 및 노드 사용을 마친 후 다음 명령을 사용하여 생성한 리소스를 정리해야 합니다.

    eksctl delete cluster my-cluster
AWS CLI

사전 조건

AWS CLI 버전 2.7.21 이상 또는 1.25.46 이상이 디바이스나 AWS CloudShell에 설치되고 구성되어 있습니다. 자세한 내용은 AWS Command Line Interface 사용 설명서에서 AWS CLI 설치, 업데이트, 제거aws configure를 사용한 빠른 구성 단원을 참조하세요. AWS CloudShell을 사용하는 경우 AWS CloudShell에 설치된 기본 AWS CLI 버전이 이전 버전일 수 있으므로 AWS CLI의 버전 2.7.21 이상 또는 1.25.46 이상을 설치해야 할 수 있습니다.

중요
  • 이 절차의 모든 단계를 동일한 사용자로 완료해야 합니다.

  • 이 절차의 모든 단계를 동일한 셸로 완료해야 합니다. 여러 단계에서는 이전 단계에서 설정한 변수를 사용합니다. 변수 값이 다른 셸에서 설정되면 변수를 사용하는 단계가 제대로 작동하지 않습니다. AWS CloudShell을 사용하여 다음 절차를 완료하는 경우 약 20~30분 동안 키보드나 포인터를 사용하여 상호 작용하지 않으면 셸 세션이 종료된다는 점을 기억하세요. 실행 중인 프로세스는 상호 작용으로 계산되지 않습니다.

  • 지침은 Bash 셸용으로 작성되었으며 다른 셸에서 조정해야 할 수도 있습니다.

AWS CLI를 사용하여 클러스터를 생성하려면

이 절차 단계의 모든 예제 값을 고유한 값으로 바꿉니다.

  1. 다음 명령을 실행하여 이후 단계에서 사용되는 일부 변수를 설정합니다. region-code를 리소스를 배포할 AWS 리전으로 바꿉니다. 값은 Amazon EKS에서 지원하는 모든 AWS 리전일 수 있습니다. AWS 리전 목록은 AWS 일반 참조 가이드의 Amazon EKS 엔드포인트 및 할당량을 참조하세요. my-cluster를 클러스터 이름으로 바꿉니다. 이름에는 영숫자(대소문자 구분)와 하이픈만 사용할 수 있습니다. 영문자로 시작해야 하며 100자 이하여야 합니다. my-nodegroup을 노드 그룹의 이름으로 바꿉니다. 이름에는 영숫자(대소문자 구분)와 하이픈만 사용할 수 있습니다. 영문자로 시작해야 하며 100자 이하여야 합니다. 111122223333을 계정 ID로 바꿉니다.

    export region_code=region-code export cluster_name=my-cluster export nodegroup_name=my-nodegroup export account_id=111122223333
  2. Amazon EKS 및 IPv6 요구 사항을 충족하는 퍼블릭 및 프라이빗 서브넷이 있는 Amazon VPC를 생성합니다.

    1. 다음 명령을 실행하여 AWS CloudFormation 스택 이름에 대한 변수를 설정합니다. my-eks-ipv6-vpc을 선택한 모든 이름으로 바꿀 수 있습니다.

      export vpc_stack_name=my-eks-ipv6-vpc
    2. AWS CloudFormation 템플릿을 사용하여 IPv6 VPC를 생성합니다.

      aws cloudformation create-stack --region $region_code --stack-name $vpc_stack_name \ --template-url https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2020-10-29/amazon-eks-ipv6-vpc-public-private-subnets.yaml

      스택을 만드는 데 몇 분 정도 걸립니다. 다음 명령을 실행합니다. 명령의 출력이 CREATE_COMPLETE가 될 때까지 다음 단계를 계속하지 마세요.

      aws cloudformation describe-stacks --region $region_code --stack-name $vpc_stack_name --query Stacks[].StackStatus --output text
    3. 생성된 퍼블릭 서브넷의 ID를 검색합니다.

      aws cloudformation describe-stacks --region $region_code --stack-name $vpc_stack_name \ --query='Stacks[].Outputs[?OutputKey==`SubnetsPublic`].OutputValue' --output text

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

      subnet-0a1a56c486EXAMPLE,subnet-099e6ca77aEXAMPLE
    4. 생성된 퍼블릭 서브넷에 대해 IPv6 주소 자동 할당 옵션을 사용 설정합니다.

      aws ec2 modify-subnet-attribute --region $region_code --subnet-id subnet-0a1a56c486EXAMPLE --assign-ipv6-address-on-creation aws ec2 modify-subnet-attribute --region $region_code --subnet-id subnet-099e6ca77aEXAMPLE --assign-ipv6-address-on-creation
    5. 배포된 AWS CloudFormation 스택에서 템플릿으로 생성된 서브넷 및 보안 그룹의 이름을 검색하고 이후 단계에서 사용할 수 있도록 변수에 저장합니다.

      security_groups=$(aws cloudformation describe-stacks --region $region_code --stack-name $vpc_stack_name \ --query='Stacks[].Outputs[?OutputKey==`SecurityGroups`].OutputValue' --output text) public_subnets=$(aws cloudformation describe-stacks --region $region_code --stack-name $vpc_stack_name \ --query='Stacks[].Outputs[?OutputKey==`SubnetsPublic`].OutputValue' --output text) private_subnets=$(aws cloudformation describe-stacks --region $region_code --stack-name $vpc_stack_name \ --query='Stacks[].Outputs[?OutputKey==`SubnetsPrivate`].OutputValue' --output text) subnets=${public_subnets},${private_subnets}
  3. 클러스터 IAM 역할을 생성하고 필요한 Amazon EKS IAM 관리형 정책을 여기에 연결합니다. Amazon EKS에서 관리하는 Kubernetes 클러스터는 사용자를 대신하여 다른 AWS 서비스를 호출하여 서비스와 함께 사용하는 리소스를 관리합니다.

    1. 다음 명령을 실행해 eks-cluster-role-trust-policy.json 파일을 생성합니다.

      cat >eks-cluster-role-trust-policy.json <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "eks.amazonaws.com" }, "Action": "sts:AssumeRole" } ] } EOF
    2. 다음 명령을 실행하여 역할 이름에 대한 변수를 설정합니다. myAmazonEKSClusterRole을 선택한 모든 이름으로 바꿀 수 있습니다.

      export cluster_role_name=myAmazonEKSClusterRole
    3. 역할을 생성합니다.

      aws iam create-role --role-name $cluster_role_name --assume-role-policy-document file://"eks-cluster-role-trust-policy.json"
    4. IAM 역할의 ARN을 검색하고 이후 단계를 위해 변수에 저장합니다.

      cluster_iam_role=$(aws iam get-role --role-name $cluster_role_name --query="Role.Arn" --output text)
    5. 필요한 Amazon EKS 관리형 IAM 정책을 역할에 연결합니다.

      aws iam attach-role-policy --policy-arn arn:aws:iam::aws:policy/AmazonEKSClusterPolicy --role-name $cluster_role_name
  4. 클러스터를 생성합니다.

    1. 버전은 1.21 이상에서 지원되는 Amazon EKS Kubernetes 버전이어야 합니다.

      aws eks create-cluster --region $region_code --name $cluster_name --kubernetes-version 1.21 \ --role-arn $cluster_iam_role --resources-vpc-config subnetIds=$subnets,securityGroupIds=$security_groups \ --kubernetes-network-config ipFamily=ipv6
      참고

      요청의 가용 영역 중 하나에 Amazon EKS 클러스터를 생성하는 데 충분한 용량이 없다는 오류가 표시될 수 있습니다. 이 경우 오류 출력에는 새 클러스터를 지원할 수 있는 가용 영역이 포함됩니다. 사용자 계정의 지원 가용 영역에 있는 2개 이상의 서브넷을 사용하여 클러스터를 다시 생성합니다. 자세한 정보를 알아보려면 용량 부족을 참조하세요.

    2. 클러스터를 생성하는 데 몇 분 정도 걸립니다. 다음 명령을 실행합니다. 명령의 출력이 ACTIVE가 될 때까지 다음 단계를 계속하지 마세요.

      aws eks describe-cluster --region $region_code --name $cluster_name --query cluster.status
  5. 클러스터와 통신할 수 있도록 클러스터에 대한 kubeconfig 파일을 생성하거나 업데이트합니다.

    aws eks update-kubeconfig --region $region_code --name $cluster_name

    기본적으로 config 파일이 ~/.kube에 생성되거나 새 클러스터의 구성이 ~/.kube의 기존 config 파일에 추가됩니다.

  6. 노드 IAM 역할을 생성합니다.

    1. 다음 명령을 실행해 vpc-cni-ipv6-policy.json 파일을 생성합니다.

      cat >vpc-cni-ipv6-policy <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:AssignIpv6Addresses", "ec2:DescribeInstances", "ec2:DescribeTags", "ec2:DescribeNetworkInterfaces", "ec2:DescribeInstanceTypes" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "ec2:CreateTags" ], "Resource": [ "arn:aws:ec2:*:*:network-interface/*" ] } ] } EOF
    2. IAM 정책을 생성합니다.

      aws iam create-policy --policy-name AmazonEKS_CNI_IPv6_Policy --policy-document file://vpc-cni-ipv6-policy.json
    3. 다음 명령을 실행해 node-role-trust-relationship.json 파일을 생성합니다.

      cat >node-role-trust-relationship.json <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "ec2.amazonaws.com" }, "Action": "sts:AssumeRole" } ] } EOF
    4. 다음 명령을 실행하여 역할 이름에 대한 변수를 설정합니다. AmazonEKSNodeRole을 선택한 모든 이름으로 바꿀 수 있습니다.

      export node_role_name=AmazonEKSNodeRole
    5. IAM 역할을 생성합니다.

      aws iam create-role --role-name $node_role_name --assume-role-policy-document file://"node-role-trust-relationship.json"
    6. IAM 정책을 IAM 역할에 연결합니다.

      aws iam attach-role-policy --policy-arn arn:aws:iam::$account_id:policy/AmazonEKS_CNI_IPv6_Policy \ --role-name $node_role_name
      중요

      이 자습서에서는 단순화를 위해 이 IAM 역할에 정책이 연결되어 있습니다. 그러나 프로덕션 클러스터에서는 정책을 별도의 IAM 역할에 연결하는 것이 좋습니다. 자세한 내용은 서비스 계정에 IAM 역할을 사용하도록 Amazon VPC CNI plugin for Kubernetes 구성을 참조하세요.

    7. 필요한 2개의 관리형 IAM 정책을 IAM 역할에 연결합니다.

      aws iam attach-role-policy --policy-arn arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy \ --role-name $node_role_name aws iam attach-role-policy --policy-arn arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly \ --role-name $node_role_name
    8. IAM 역할의 ARN을 검색하고 이후 단계를 위해 변수에 저장합니다.

      node_iam_role=$(aws iam get-role --role-name $node_role_name --query="Role.Arn" --output text)
  7. 관리형 노드 그룹을 생성합니다.

    1. 이전 단계에서 생성한 서브넷의 ID를 봅니다.

      echo $subnets

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

      subnet-0a1a56c486EXAMPLE,subnet-099e6ca77aEXAMPLE,subnet-0377963d69EXAMPLE,subnet-0c05f819d5EXAMPLE
    2. 노드 그룹을 생성합니다. 0a1a56c486EXAMPLE, 099e6ca77aEXAMPLE, 0377963d69EXAMPLE, 0c05f819d5EXAMPLE를 이전 단계의 결과에서 반환된 값으로 바꿉니다. 다음 명령의 이전 출력에서 서브넷 ID 사이의 쉼표를 제거해야 합니다. t3.mediumAWS Nitro 시스템 인스턴스 유형으로 바꿀 수 있습니다.

      aws eks create-nodegroup --region $region_code --cluster-name $cluster_name --nodegroup-name $nodegroup_name \ --subnets subnet-0a1a56c486EXAMPLE subnet-099e6ca77aEXAMPLE subnet-0377963d69EXAMPLE subnet-0c05f819d5EXAMPLE \ --instance-types t3.medium --node-role $node_iam_role

      노드 그룹을 만드는 데 몇 분 정도 걸립니다. 다음 명령을 실행합니다. 반환되는 출력이 ACTIVE가 되면 다음 단계로 진행하세요.

      aws eks describe-nodegroup --region $region_code --cluster-name $cluster_name --nodegroup-name $nodegroup_name \ --query nodegroup.status --output text
  8. IP 열에서 기본 pods에 IPv6 주소가 할당되었는지 확인합니다.

    kubectl get pods -n kube-system -o wide

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

    NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES aws-node-rslts 1/1 Running 1 5m36s 2600:1f13:b66:8200:11a5:ade0:c590:6ac8 ip-192-168-34-75.region-code.compute.internal <none> <none> aws-node-t74jh 1/1 Running 0 5m32s 2600:1f13:b66:8203:4516:2080:8ced:1ca9 ip-192-168-253-70.region-code.compute.internal <none> <none> coredns-85d5b4454c-cw7w2 1/1 Running 0 56m 2600:1f13:b66:8203:34e5:: ip-192-168-253-70.region-code.compute.internal <none> <none> coredns-85d5b4454c-tx6n8 1/1 Running 0 56m 2600:1f13:b66:8203:34e5::1 ip-192-168-253-70.region-code.compute.internal <none> <none> kube-proxy-btpbk 1/1 Running 0 5m36s 2600:1f13:b66:8200:11a5:ade0:c590:6ac8 ip-192-168-34-75.region-code.compute.internal <none> <none> kube-proxy-jjk2g 1/1 Running 0 5m33s 2600:1f13:b66:8203:4516:2080:8ced:1ca9 ip-192-168-253-70.region-code.compute.internal <none> <none>
  9. IP 열에서 기본 서비스에 IPv6 주소가 할당되었는지 확인합니다.

    kubectl get services -n kube-system -o wide

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

    NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR kube-dns ClusterIP fd30:3087:b6c2::a <none> 53/UDP,53/TCP 57m k8s-app=kube-dns
  10. (선택 사항) 샘플 애플리케이션을 배포하거나 AWS Load Balancer Controller 및 샘플 애플리케이션을 로드 밸런서 애플리케이션에 배포하거나 네트워크 트래픽을 IPv6 pods에 배포합니다.

  11. 이 자습서용으로 생성한 클러스터 및 노드 사용을 마친 후 다음 명령을 사용하여 생성한 리소스를 정리해야 합니다. 리소스를 삭제하기 전에 이 자습서 외부의 리소스를 사용하고 있지 않은지 확인합니다.

    1. 이전 단계를 완료한 것과 다른 셸에서 이 단계를 완료하는 경우 이전 단계에서 사용한 모든 변수의 값을 설정하고 example values을 이전 단계를 완료했을 때 지정한 값으로 바꿉니다. 이전 단계를 완료한 동일한 셸에서 이 단계를 완료하는 경우 다음 단계로 건너뜁니다.

      export region_code=region-code export vpc_stack_name=my-eks-ipv6-vpc export cluster_name=my-cluster export nodegroup_name=my-nodegroup export account_id=111122223333 export node_role_name=AmazonEKSNodeRole export cluster_role_name=myAmazonEKSClusterRole
    2. 노드 그룹을 삭제합니다.

      aws eks delete-nodegroup --region $region_code --cluster-name $cluster_name --nodegroup-name $nodegroup_name

      삭제하는 데 몇 분 정도 걸립니다. 다음 명령을 실행합니다. 출력이 반환되는 경우 다음 단계로 진행하지 마세요.

      aws eks list-nodegroups --region $region_code --cluster-name $cluster_name --query nodegroups --output text
    3. 클러스터를 삭제합니다.

      aws eks delete-cluster --region $region_code --name $cluster_name

      클러스터를 삭제하는 데 몇 분 정도 걸립니다. 계속하기 전에 다음 명령으로 클러스터가 삭제되었는지 확인합니다.

      aws eks describe-cluster --region $region_code --name $cluster_name

      출력이 다음 출력과 유사할 때까지 다음 단계로 진행하지 마세요.

      An error occurred (ResourceNotFoundException) when calling the DescribeCluster operation: No cluster found for name: my-cluster.
    4. 생성한 IAM 리소스를 삭제합니다. 이전 단계에서 사용한 이름과 다른 이름을 선택한 경우 AmazonEKS_CNI_IPv6_Policy를 선택한 이름으로 바꿉니다.

      aws iam detach-role-policy --role-name $cluster_role_name --policy-arn arn:aws:iam::aws:policy/AmazonEKSClusterPolicy aws iam detach-role-policy --role-name $node_role_name --policy-arn arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy aws iam detach-role-policy --role-name $node_role_name --policy-arn arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly aws iam detach-role-policy --role-name $node_role_name --policy-arn arn:aws:iam::$account_id:policy/AmazonEKS_CNI_IPv6_Policy aws iam delete-policy --policy-arn arn:aws:iam::$account_id:policy/AmazonEKS_CNI_IPv6_Policy aws iam delete-role --role-name $cluster_role_name aws iam delete-role --role-name $node_role_name
    5. VPC를 생성한 AWS CloudFormation 스택을 삭제합니다.

      aws cloudformation delete-stack --region $region_code --stack-name $vpc_stack_name