Amazon EKS のトラブルシューティング - Amazon EKS

Amazon EKS のトラブルシューティング

この章では、Amazon EKS の使用中に表示される一般的なエラーとその回避方法について説明します。

容量不足

Amazon EKS を作成しようとするときに、次のエラーが表示された場合、指定したアベイラビリティーゾーンに、クラスターをサポートするために十分な容量がありません。

Cannot create cluster 'example-cluster' because region-1d, the targeted アベイラビリティーゾーン, does not currently have sufficient capacity to support the cluster. Retry and choose from these アベイラビリティーゾーンs: region-1a, region-1b, region-1c

このエラーメッセージによって返されるアベイラビリティーゾーンでホストされているクラスター VPC 内のサブネットを使用して、クラスターを再作成してください。

ワーカーノードをクラスターに結合できません

ワーカーノードがクラスターに結合されない一般的な理由はいくつかあります。

  • aws-auth-cm.yaml ファイルでは、ワーカーノードに対する IAM ロール ARN が正しくない。ワーカーノードの IAM ロール ARN (インスタンスプロファイルの ARN ではない) が aws-auth-cm.yaml ファイルで指定されていることを確かめてください。詳細については、「Amazon EKS Linux ワーカーノードの起動」を参照してください。

  • ワーカーノードの AWS CloudFormation テンプレートの ClusterName がワーカーノードを参加させたいクラスターの名前と正確に一致しない。このフィールドに正しくない値を渡すと、ワーカーノードの /var/lib/kubelet/kubeconfig ファイルの設定が正しくないために、ノードはクラスターに結合されません。

  • ワーカーノードは、クラスターによって 所有 されているためタグ付けされていません。ワーカーノードには、次のタグが適用されている必要があります。<cluster_name> はクラスターの名前に置き換えられます。

    キー

    kubernetes.io/cluster/<cluster-name>

    owned

  • ワーカーノードは、パブリック IP アドレスを使用してクラスターにアクセスできない場合があります。パブリックサブネットにデプロイされたワーカーノードにパブリック IP アドレスが割り当てられていることを確認します。割り当てられていない場合は、起動後にワーカーノードに Elastic IP アドレスを関連付けることができます。詳細については、「Elastic IP アドレスを実行中のインスタンスまたはネットワークインターフェイスに関連付ける」を参照してください。デプロイされたインスタンスにパブリック IP アドレスを自動的に割り当てるようにパブリックサブネットが設定されていない場合は、その設定を有効にすることをお勧めします。詳細については、「サブネットの IPv4 アドレス指定属性の変更」を参照してください。ワーカーノードがプライベートサブネットにデプロイされている場合、サブネットには、パブリック IP アドレスが割り当てられた NAT ゲートウェイへのルートが必要です。

  • ワーカーノードのデプロイ先リージョンの STS エンドポイントは、アカウントに対して有効になっていません。リージョンを有効にするには、「AWS リージョンでの AWS STS のアクティブ化と非アクティブ化」を参照してください。

許可されていないか、アクセスが拒否されました (kubectl)

kubectl コマンドの実行中に次のいずれかのエラーが発生した場合、kubectl が Amazon EKS に対して適切に設定されていないか、使用している IAM ユーザーまたはロール認証情報が Amazon EKS クラスターで十分なアクセス許可を持つ Kubernetes RBAC ユーザーにマッピングされていません。

  • could not get token: AccessDenied: Access denied

  • error: You must be logged in to the server (Unauthorized)

  • error: the server doesn't have a resource type "svc"

これは、クラスターが AWS 認証情報のあるセット (IAM ユーザーまたはロール) から作成されたが、kubectl は別の認証情報のセットを使用していることが原因である可能性があります。

Amazon EKS クラスターが作成されたら、クラスターを作成する IAM エンティティ (ユーザーまたはロール) は、管理者 (system:master アクセス許可が付与されている) として Kubernetes RBAC 認証テーブルに追加されます。最初は、その IAM ユーザーだけが kubectl を使用して Kubernetes API サーバーを呼び出すことができます。詳細については、「クラスターのユーザーまたは IAM ロールの管理」を参照してください。コンソールを使用してクラスターを作成する場合は、クラスター上で kubectl コマンドを実行する際、同じ IAM ユーザー認証情報が AWS SDK 認証情報チェーンにあることを確認する必要があります。

AWS CLI をインストールして設定する場合は、ユーザーの IAM 認証情報を設定できます。詳細については、AWS Command Line Interface ユーザーガイドの「AWS CLI の設定」を参照してください。

Amazon EKS クラスターを作成するロールを引き受ける場合は、kubectl が同じロールを引き受けるように設定されていることを確認する必要があります。次のコマンドを使用して、IAM ロールを使用するように kubeconfig ファイルを更新します。詳細については、「kubeconfig を Amazon EKS 用に作成します。」を参照してください。

aws --region region-code eks update-kubeconfig --name cluster_name --role-arn arn:aws:iam::aws_account_id:role/role_name

Kubernetes RBAC ユーザーに IAM ユーザーをマップするには、クラスターのユーザーまたは IAM ロールの管理 を参照するか、ユーザーをマップする方法についてのビデオを視聴してください。

aws-iam-authenticator Not Found

"aws-iam-authenticator": executable file not found in $PATH というエラーが発生する場合は、kubectl が Amazon EKS 用に設定されていません。詳細については、「aws-iam-authenticator のインストール」を参照してください。

注記

AWS CLI バージョン 1.16.156 以上がインストールされている場合、aws-iam-authenticator は必要ありません。

hostname doesn't match

システムの Python のバージョンは 2.7.9 以降であることが必要です。そうでない場合は、AWS CLI で Amazon EKS を呼び出すと hostname doesn't match エラーが発生します。詳細については、Python Requests FAQ の「What are "hostname doesn't match" errors?」 を参照してください。

getsockopt: no route to host

Docker は Amazon EKS クラスターの 172.17.0.0/16 CIDR 範囲で実行されます。クラスターの VPC サブネットがこの範囲と重ならないようにすることをお勧めします。重なっている場合は、以下のエラーが発生します。

Error: : error upgrading connection: error dialing backend: dial tcp 172.17.nn.nn:10250: getsockopt: no route to host

マネージド型ノードグループのエラー

AWS マネジメントコンソール で「インスタンスが kubernetes クラスターに参加できませんでした」というエラーが表示された場合は、クラスターのプライベートエンドポイントアクセスが有効になっているか、パブリックエンドポイントアクセス用に CIDR ブロックが正しく設定されていることを確認します。詳細については、「Amazon EKS クラスターエンドポイントのアクセスコントロール」を参照してください。

マネージド型ノードグループで正常性の問題が発生した場合は、Amazon EKS から問題の診断に役立つエラーメッセージが返されます。以下のエラーメッセージとそれに関連する説明を下に示します。

  • AutoScalingGroupNotFound: マネージド型ノードグループに関連付けられている Auto Scaling グループが見つかりませんでした。同じ設定で Auto Scaling グループを再作成して復旧できる場合があります。

  • Ec2SecurityGroupNotFound: クラスターのクラスターセキュリティグループが見つかりませんでした。クラスターを再作成する必要があります。

  • Ec2SecurityGroupDeletionFailure: マネージド型ノードグループのリモートアクセスセキュリティグループを削除できませんでした。セキュリティグループから依存関係を削除します。

  • Ec2LaunchTemplateNotFound: マネージド型ノードグループの Amazon EC2 起動テンプレートが見つかりませんでした。同じ設定で起動テンプレートを再作成して復旧できる場合があります。

  • Ec2LaunchTemplateVersionMismatch: マネージド型ノードグループの Amazon EC2 起動テンプレートのバージョンが、Amazon EKS が作成したバージョンと一致しません。Amazon EKS が作成したバージョンに戻して復旧できる場合があります。

  • IamInstanceProfileNotFound: マネージド型ノードグループの IAM インスタンスプロファイルが見つかりませんでした。同じ設定でインスタンスプロファイルを再作成して復旧できる場合があります。

  • IamNodeRoleNotFound: マネージド型ノードグループの IAM ロールが見つかりませんでした。同じ設定で IAM ロールを再作成して復旧できる場合があります。

  • AsgInstanceLaunchFailures: インスタンスの起動中に Auto Scaling グループに障害が発生しています。

  • NodeCreationFailure: 起動したインスタンスを Amazon EKS クラスターに登録できません。この障害の一般的な原因は、ワーカーノード IAM ロールのアクセス許可が不十分か、ノードのアウトバウンドのインターネットアクセスがないことです。ワーカーノードが適切に機能するためには、パブリック IP アドレスを使用してインターネットにアクセスできる必要があります。詳細については、「VPC IP アドレス指定」を参照してください。ワーカーノードには、インターネットに対して開いているポートも必要です。詳細については、「Amazon EKS セキュリティグループの考慮事項」を参照してください。

  • InstanceLimitExceeded: AWS アカウントが、指定されたインスタンスタイプのインスタンスをこれ以上起動できません。Amazon EC2 インスタンス制限の引き上げをリクエストして復旧できる場合があります。

  • InsufficientFreeAddresses: マネージド型ノードグループに関連付けられている 1 つ以上のサブネットに、新しいノードに使用できる十分な IP アドレスがありません。

  • AccessDenied: Amazon EKS または 1 つ以上のマネージド型ノードがクラスター API サーバーと通信できません。

  • InternalFailure: これらのエラーは、通常、Amazon EKS サーバー側の問題が原因で発生します。

CNI ログ収集ツール

Amazon VPC CNI plugin for Kubernetes には、独自のトラブルシューティングスクリプト (ワーカーノードの /opt/cni/bin/aws-cni-support.sh で閲覧化) があり、サポートケースや一般的なトラブルシューティング用の診断ログ収集のため利用できます。

ワーカーノードでスクリプトを実行するには、以下のコマンドを使用します。

sudo bash /opt/cni/bin/aws-cni-support.sh
注記

指定された場所にスクリプトが存在しない場合は、CNI コンテナの実行に失敗します。手動でスクリプトをダウンロードして実行するには、次のコマンドを使用します。

curl -O https://raw.githubusercontent.com/awslabs/amazon-eks-ami/master/log-collector-script/linux/eks-log-collector.sh sudo bash eks-log-collector.sh

このスクリプトは、次の診断情報を収集します。デプロイした CNI バージョンは、スクリプトバージョンより前のバージョンである可能性があります。

This is version 0.6.1. New versions can be found at https://github.com/awslabs/amazon-eks-ami Trying to collect common operating system logs... Trying to collect kernel logs... Trying to collect mount points and volume information... Trying to collect SELinux status... Trying to collect iptables information... Trying to collect installed packages... Trying to collect active system services... Trying to collect Docker daemon information... Trying to collect kubelet information... Trying to collect L-IPAMD information... Trying to collect sysctls information... Trying to collect networking information... Trying to collect CNI configuration information... Trying to collect running Docker containers and gather container data... Trying to collect Docker daemon logs... Trying to archive gathered information... Done... your bundled logs are located in /var/log/eks_i-0717c9d54b6cfaa19_2020-03-24_0103-UTC_0.6.1.tar.gz

診断情報が収集され、 に保存されます。

/var/log/eks_i-0717c9d54b6cfaa19_2020-03-24_0103-UTC_0.6.1.tar.gz

Container runtime network not ready (コンテナランタイムネットワークの準備ができていません)

以下のような Container runtime network not ready エラーと承認エラーが表示される場合があります。

4191 kubelet.go:2130] Container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized
4191 reflector.go:205] k8s.io/kubernetes/pkg/kubelet/kubelet.go:452: Failed to list *v1.Service: Unauthorized
4191 kubelet_node_status.go:106] Unable to register node "ip-10-40-175-122.ec2.internal" with API server: Unauthorized
4191 reflector.go:205] k8s.io/kubernetes/pkg/kubelet/kubelet.go:452: Failed to list *v1.Service: Unauthorized

これらのエラーは、AWS IAM 認証システム設定マップがワーカーノードに適用されていないことに関連している可能性があります。この設定マップは、クラスターに登録するための Kubernetes RBAC アクセス許可 system:bootstrappers および system:nodes をワーカーノードに付与します。詳細については、「Amazon EKS Linux ワーカーノードの起動」の [Self-managed nodes (セルフマネージド型ノード)] タブにある「ワーカーノードをクラスターと結合するには」を参照してください。インスタンスプロファイル ARN ではなく、設定マップのインスタンスロールのロール ARN を指定してください。

以下の例のように、/ 以外のパスが含まれる場合、認証システムは [ロール ARN] を認識しません。

arn:aws:iam::111122223333:role/development/apps/prod-iam-role-NodeInstanceRole-621LVEXAMPLE

/ 以外のパスを含む設定マップでロール ARN を指定するときは、パスをドロップする必要があります。上記の ARN は以下のように指定します。

arn:aws:iam::111122223333:role/prod-iam-role-NodeInstanceRole-621LVEXAMPLE

TLS ハンドシェイクタイムアウト

ワーカーノードがパブリック API サーバーエンドポイントへの接続を確立できない場合、以下のようなエラーが発生する可能性があります。

server.go:233] failed to run Kubelet: could not init cloud provider "aws": error finding instance i-1111f2222f333e44c: "error listing AWS instances: \"RequestError: send request failed\\ncaused by: Post  net/http: TLS handshake timeout\""

kubelet プロセスは、API サーバーエンドポイントを継続的に再生成およびテストします。このエラーは、コントロールプレーンでクラスターのローリング更新を行う手順 (設定の変更やバージョンの更新など) で一時的に発生することもあります。

この問題を解決するには、ルートテーブルとセキュリティグループをチェックして、ワーカーノードからのトラフィックがパブリックエンドポイントに到達できることを確認します。

Error: ErrImagePull

1.12 のワーカーノードを中国のリージョンにデプロイしている場合、kubelet ログのエラーメッセージに次のテキストが表示されることがあります。

Failed: Failed to pull image "xxxxxx.dkr.ecr.region-code.amazonaws.com.cn"

この問題を解決するには、ワーカーノードがデプロイされているのと同じリージョンにある Amazon Elastic Container Registry リポジトリからイメージをプルしてください。