Amazon EKS で複数の CIDR 範囲を使用するにはどうすればよいですか?

所要時間4分
0

ポッドの問題を解決するために、Amazon Elastic Kubernetes Service (Amazon EKS)で複数の CIDR 範囲を使用したいと考えています。

簡単な説明

解決策」セクションの手順を完了する前に、以下が揃っていることを確認してください:

注:

**重要:**状況によっては、Amazon EKS は、クラスターを作成した後に VPC に追加した CIDR ブロックからサブネットで起動したノードと通信できません。既存のクラスターに CIDR ブロックを追加すると、更新された範囲が表示されるまでに最大 5 時間かかることがあります。

解決策

**注:**AWS コマンドラインインターフェイス (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 マシンイメージ (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

    **注:**前のテストデプロイでは、10 個の新しいポッドが追加され、新しい CIDR 範囲が新しいワーカーノードでスケジュールされています。

AWS公式
AWS公式更新しました 2ヶ月前
コメントはありません

関連するコンテンツ