Amazon EKS で Amazon VPC CNI プラグインに関する問題を解決する方法を教えてください。
Amazon Elastic Kubernetes Service (Amazon EKS) で Amazon VPC CNI プラグインに関する問題を解決したいです。
解決策
Amazon EKS では、Amazon Virtual Private Cloud (Amazon VPC) の Container Network Interface (CNI) プラグインが正しく動作するために、適切なポッド IP の割り当てが必要です。VPC CNI プラグインの問題を解決するには、以下の設定を確認してください。
- AWS Identity and Access Management (IAM) アクセス許可 (ワーカーノードの IAM ロールにアタッチする AmazonEKS_CNI_Policy を含む)。または、サービスアカウントの IAM ロールを通じて提供する IAM アクセス許可。
- ワーカーノードからアクセス可能な Amazon EKS API サーバーエンドポイント。
- Amazon Elastic Compute Cloud (Amazon EC2)、Amazon Elastic Container Registry (Amazon ECR)、Amazon Simple Storage Service (Amazon S3) の API エンドポイントへのネットワークアクセス。
- サブネットで十分に使用可能な IP アドレス。
- aws-node ポッドが Ready 状態に進むために正常に動作する kube-proxy。
- Amazon EKS クラスターバージョンと一致する Kube-proxy バージョンと VPC CNI バージョン。
VPC CNI プラグインの問題を解決するには、以下のトラブルシューティング手順を実行してください。
aws-node ポッドが Running 状態であることを確認する
VPC CNI プラグインは、kube-system 名前空間で aws-node という DaemonSet ポッドとして実行されます。クラスター内の各ワーカーノードで 1 つの aws-node ポッドが実行されます。
-
aws-node ポッドが各ワーカーノードで実行されていることを確認するには、次のコマンドを実行します。
kubectl get pods -n kube-system -l k8s-app=aws-node -o wide注: k8s-app=aws-node を実際のラベルセレクターに置き換えてください。
-
コマンド出力で RESTARTS カウントが 0 より大きいことが示された場合は、コンテナの状態とエラーメッセージを確認してください。次の describe コマンドを実行します。
kubectl describe pod aws-node-pod-name -n kube-system注: aws-node-pod-name を AWS ノードポッドの名前に置き換えてください。
-
aws-node ポッドが ContainerCreating 状態のままになり、describe の出力でイベントに次のエラーメッセージが表示されることがあります。
"Error while dialing dial tcp 127.0.0.1:50051: connect: connection refused"
この場合、「Amazon EKS ポッドが ContainerCreating 状態でスタックし、「ポッドサンドボックスの作成に失敗しました」というエラーが発生する理由を知りたいです」の手順を実行します。
-
aws-node ポッドのログを表示するには、以下の logs コマンドを実行します。
kubectl logs daemonset/aws-node -n kube-systemまたは、
kubectl logs aws-node-pod-name -n kube-system注: aws-node-pod-name を実際の aws-node ポッド名に置き換えてください。
-
ワーカーノードの VPC CNI プラグインのログを確認します。ワーカーノードにサインインし、/var/log/aws-routed-eni/ ディレクトリに移動します。plugin.log と ipamd.log というファイル名を探し、これらのファイルのログを確認します。
-
ワーカーノードが Amazon EKS クラスターの API サーバーエンドポイントに到達できることを確認します。ワーカーノードにログインするには、SSH または AWS Systems Manager Session Manager を使用して、次のコマンドを実行します。
curl -ivk https://eks-api-server-endpoint-url注: eks-api-server-endpoint-url を Amazon EKS API サーバーのエンドポイント URL に置き換えてください。
VPC CNI バージョンを確認する
VPC CNI プラグインのバージョンが最新で、Amazon EKS クラスターバージョンと互換性があることを確認してください。
現在の VPC CNI バージョンを確認するには、次のコマンドを実行します。
kubectl describe daemonset aws-node -n kube-system | grep Image | cut -d "/" -f 2
現在のバージョンを、GitHub ウェブサイトの Amazon VPC CNI プラグインリリースで入手可能な最新バージョンと比較してください。
バージョンが古い場合は、VPC CNI プラグインを最新バージョンに更新してください。詳細については、「Amazon VPC CNI を更新する (Amazon EKS アドオン)」を参照してください。
ネットワーク設定と要件を確認する
Amazon EKS クラスターのセキュリティグループとサブネット設定が正しく設定されていることを確認します。
セキュリティグループのルールを確認する
セキュリティグループは、コントロールプレーンとデータプレーン間の接続を許可する必要があります。
ワーカーノードにカスタムセキュリティグループを使用する場合は、ポートを確認してください。最小限のノードグループルールでは、コントロールプレーンセキュリティグループからのインバウンドポート 10250 とコントロールプレーンセキュリティグループへのアウトバウンドポート 443 を許可します。詳細については、「Network security」(ネットワークセキュリティ) を参照してください。
ポッドセキュリティグループ機能がアクティブな場合は、セキュリティグループの制限に達していないか確認します。Elastic Network Interface ごとのセキュリティグループの制限に達すると、ポッドのネットワーキング設定が失敗する場合があります。詳細については、「Amazon VPC クォータ」を参照してください。
必要なセキュリティグループルールの詳細については、「クラスターの Amazon EKS セキュリティグループ要件を表示する」を参照してください。
サブネット設定を確認する
Amazon VPC ID の各サブネットで使用可能な IP アドレスを一覧表示するには、次のコマンドを実行します。
aws ec2 describe-subnets —filters "Name=vpc-id,Values= VPCID" | jq '.Subnets[] | .SubnetId + "=" + "\(.AvailableIpAddressCount)"'
サブネットのワーカーノードのネットワークアクセスコントロールリストルールが Amazon EKS API サーバーとの通信を許可していることを確認します。ネットワーク ACL の設定に関する詳細については、「ネットワークアクセスコントロールリストを使用して、サブネットのトラフィックを制御する」を参照してください。
コントロールプレーンのサブネットに十分な空き IP アドレスがあることを確認します。各コントロールプレーンサブネットには、Amazon EKS が使用できる IP アドレスが少なくとも 6 個必要です。ただし、AWS では、各サブネットに少なくとも 16 個の IP アドレスを割り当てることを推奨しています。ポッドが起動されるサブネットの AvailableIPAddressCount は 0 より大きくなければなりません。詳細については、「サブネットの要件と考慮事項」を参照してください。
kube-proxy ポッドが Running 状態であることを確認する
ネットワークに正しく接続するには、kube-proxy ポッドが実行中である必要があります。
kube-proxy が実行中であることを確認するには、次のコマンドを実行します。
kubectl get pods -n kube-system -l k8s-app=kube-proxy
すべての kube-proxy ポッドが Running 状態であることを確認します。kube-proxy が実行中ではない場合は、ポッドログにエラーがないか確認してください。
kubectl logs -n kube-system POD-NAME
注: POD-NAME を、実際の kube-proxy ポッド名に置き換えてください。
WARM_PREFIX_TARGET の値を確認する
プレフィックス委任がオンになっている場合は、ログファイルで次のエラーメッセージを確認してください。
"Error: Setting WARM_PREFIX_TARGET = 0 is not supported while WARM_IP_TARGET/MINIMUM_IP_TARGET is not set.Please configure either one of the WARM_{PREFIX/IP}_TARGET or MINIMUM_IP_TARGET env variable"
このエラーを解決するには、WARM_PREFIX_TARGET を 1 以上の値に設定する必要があります。プレフィックス委任がオンになっていて、WARM_PREFIX_TARGET が 0 に設定されている場合は、値を 1 以上に更新します。
kubectl set env daemonset aws-node -n kube-system WARM_PREFIX_TARGET=1
サブネット内の予約スペースを確認する
プレフィックス委任がオンになったら、サブネットに十分な /28 IP CIDR ブロックがあることを確認します。16 個の IP アドレスはすべて連続している必要があります。プレフィックス委任がオンになっている場合は、ログファイルで次のエラーメッセージを確認してください。
"InsufficientCidrBlocks"
エラーを解決するには、新しいサブネットを作成し、新しいサブネットからポッドを起動します。Amazon EC2 サブネット CIDR 予約を使用して、プレフィックスが割り当てられたサブネット内のスペースを予約します。詳細については、「サブネット CIDR 予約」を参照してください。
カスタムネットワーク設定を確認する
Amazon EKS クラスターでカスタムネットワーキングが有効かどうかを確認するには、次のコマンドを実行します。
kubectl describe pod -n kube-system $(kubectl get pods -n kube-system -l k8s-app=aws-node -o jsonpath='{.items[0].metadata.name}')
この変数を True に設定すると、カスタムネットワークがアクティブになります。
カスタムネットワークがアクティブな場合は、ENIConfig CRD をクラスターのネットワーク要件に一致するように正しく設定する必要があります。次のコマンドを実行してリストを取得し、すべての ENIConfig CRD を検査します。
kubectl get ENIConfig -A -o yaml
特定の ENIConfig を表示するには、次のコマンドを実行します。
kubectl describe ENIConfig eni-config-name
注: Eni-config-name を実際の ENIConfig 名に置き換えてください。
各 ENIConfig に、各アベイラビリティーゾーンに対して正しいサブネットとセキュリティグループの設定があることを確認します。
ENIConfig で指定されたサブネットがワーカーノードのアベイラビリティーゾーンと一致することを確認します。
カスタムネットワークの詳細については、「カスタムネットワーキングを使用して代替サブネットに Pod をデプロイする」を参照してください。
ロールバックを防ぐための競合解決の設定
AWS Cloud Development Kit (AWS CDK)、AWS CloudFormation、または eksctl をマネージドアドオンと組み合わせて使用する場合は、ロールバックを防ぐために競合の解決方法を定義します。
正しい方法は、NONE、OVERWRITE、または PRESERVE です。
- メソッドが定義されていない場合、デフォルトは NONE です。システムが競合を検出すると、CloudFormation スタックの更新はロールバックされ、変更は行われません。
- アドオンのデフォルトを設定するには、OVERWRITE を使用します。セルフマネージドアドオンから Amazon EKS マネージドアドオンに移行するときは、OVERWRITE を使用する必要があります。
- WARM_IP_TARGET またはカスタムネットワーキングなどのカスタム定義の設定を使用する場合は、PRESERVE を使用します。
競合解決方法の設定の詳細については、「Amazon EKS アドオンを更新する」を参照してください。
- トピック
- Containers
- 言語
- 日本語

関連するコンテンツ
AWS公式更新しました 10ヶ月前