スキップしてコンテンツを表示

Amazon EKS で Amazon VPC CNI プラグインに関する問題を解決する方法を教えてください。

所要時間3分
0

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 ポッドが実行されます。

  1. aws-node ポッドが各ワーカーノードで実行されていることを確認するには、次のコマンドを実行します。

    kubectl get pods -n kube-system -l k8s-app=aws-node -o wide

    注: k8s-app=aws-node を実際のラベルセレクターに置き換えてください。

  2. コマンド出力で RESTARTS カウントが 0 より大きいことが示された場合は、コンテナの状態とエラーメッセージを確認してください。次の describe コマンドを実行します。

    kubectl describe pod aws-node-pod-name -n kube-system

    注: aws-node-pod-name を AWS ノードポッドの名前に置き換えてください。

  3. aws-node ポッドが ContainerCreating 状態のままになり、describe の出力でイベントに次のエラーメッセージが表示されることがあります。

    "Error while dialing dial tcp 127.0.0.1:50051: connect: connection refused"

    この場合、「Amazon EKS ポッドが ContainerCreating 状態でスタックし、「ポッドサンドボックスの作成に失敗しました」というエラーが発生する理由を知りたいです」の手順を実行します。

  4. 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 ポッド名に置き換えてください。

  5. ワーカーノードの VPC CNI プラグインのログを確認します。ワーカーノードにサインインし、/var/log/aws-routed-eni/ ディレクトリに移動します。plugin.logipamd.log というファイル名を探し、これらのファイルのログを確認します。

  6. ワーカーノードが 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_TARGET1 以上の値に設定する必要があります。プレフィックス委任がオンになっていて、WARM_PREFIX_TARGET0 に設定されている場合は、値を 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 をマネージドアドオンと組み合わせて使用する場合は、ロールバックを防ぐために競合の解決方法を定義します。

正しい方法は、NONEOVERWRITE、または PRESERVE です。

  • メソッドが定義されていない場合、デフォルトは NONE です。システムが競合を検出すると、CloudFormation スタックの更新はロールバックされ、変更は行われません。
  • アドオンのデフォルトを設定するには、OVERWRITE を使用します。セルフマネージドアドオンから Amazon EKS マネージドアドオンに移行するときは、OVERWRITE を使用する必要があります。
  • WARM_IP_TARGET またはカスタムネットワーキングなどのカスタム定義の設定を使用する場合は、PRESERVE を使用します。

競合解決方法の設定の詳細については、「Amazon EKS アドオンを更新する」を参照してください。

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