Amazon EKS で複数の CIDR 範囲を使用するにはどうすればよいですか?
ポッドの問題を解決するために、Amazon Elastic Kubernetes Service (Amazon EKS)で複数の CIDR 範囲を使用したいと考えています。
簡単な説明
「解決策」セクションの手順を完了する前に、以下が揃っていることを確認してください:
- 実行中の Amazon EKS クラスター
- AWS コマンドラインインターフェイス (AWS CLI) の最新バージョン
- Amazon Virtual Private Cloud (Amazon VPC) を管理するための AWS アイデンティティおよびアクセス管理 (IAM) 権限
- カスタムリソースを作成し、デーモンセットを編集する権限を備えた kubectl
- システムにインストールされている jq のバージョン
**注:**jq をダウンロードしてインストールするには、jq Web サイトの「jq のダウンロード」を参照してください。 - Bash シェルを搭載した UNIX ベースのシステム
- すでに設定されている VPC
注:
- クラスターを作成する前または作成後に、プライベート (RFC 1918) とパブリック (RFC 1918 以外) の CIDR ブロックを VPC に関連付けることができます。
- キャリアグレードのネットワークアドレス変換 (NAT) を使用するシナリオでは、100.64.0.0/10 はプライベートネットワークの範囲です。プライベートネットワーク範囲は、サービスプロバイダーとその加入者間の通信用の共有アドレス空間で使用されます。ポッドがインターネットと通信するには、ルートテーブルに NAT ゲートウェイを設定する必要があります。AWS Fargate クラスターはデーモンセットをサポートしていません。Fargate プロファイルにセカンダリ CIDR 範囲を追加するには、VPC のセカンダリ CIDR ブロックのサブネットを使用します。次に、Fargate プロファイルにサブネットを追加する前に、新しいサブネットにタグを付けます。
**重要:**状況によっては、Amazon EKS は、クラスターを作成した後に VPC に追加した CIDR ブロックからサブネットで起動したノードと通信できません。既存のクラスターに CIDR ブロックを追加すると、更新された範囲が表示されるまでに最大 5 時間かかることがあります。
解決策
**注:**AWS コマンドラインインターフェイス (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 マシンイメージ (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
**注:**前のテストデプロイでは、10 個の新しいポッドが追加され、新しい CIDR 範囲が新しいワーカーノードでスケジュールされています。
関連するコンテンツ
- 質問済み 9ヶ月前lg...
- 質問済み 1ヶ月前lg...
- 承認された回答質問済み 1ヶ月前lg...
- AWS公式更新しました 2年前
- AWS公式更新しました 2年前
- AWS公式更新しました 2ヶ月前