Amazon EKS ポッドが ContainerCreating 状態でスタックし、"Failed to create pod sandbox" というエラーが発生する理由を教えてください。
Amazon Elastic Kubernetes Service (Amazon EKS) ポッドがContainerCreating 状態でスタックし、"failed to create pod sandbox" というエラーが発生します。
解決策
前提条件
問題が発生しているポッドを特定します。次の手順を実行します。
-
次のコマンドを実行して、クラスター内のポッドを一覧表示し、ContainerCreating 状態のポッドを特定します。
kubectl get pods --all-namespaces -o wide -
次のコマンドを実行して、ContainerCreating 状態にある各ポッドの詳細を取得します。
kubectl describe pod pod-name -n pod-namespace注: pod-name をポッドの名前に、pod-namespace をポッドが属する名前空間に置き換えます。
-
Events セクションの出力を確認してポッドを特定し、その他のセクションを確認して問題をトラブルシューティングします。
"Resource temporarily unavailable" というエラー
PID やファイルに関して定義したカーネル設定がオペレーティングシステム (OS) の上限を超える場合、次のようなエラーメッセージが表示されます。
"kubelet, ip-192-168-0-1.us-east-1.compute.internal Failed to create Pod sandbox: rpc error: code = Unknown desc = failed to start sandbox container for Pod "example_pod": Error response from daemon: failed to start shim: fork/exec /usr/bin/containerd-shim: resource temporarily unavailable: unknown"
問題を一時的に解決するには、ノードを再起動します。
この問題をトラブルシューティングするには、次の手順を実行します。
-
Containerd と Kubelet のノードログを収集します。
Windows の場合は、インスタンスに接続します。PowerShell コマンドプロンプトを開き、Windows EKS ログコレクタースクリプトを使用してワーカーノードログを収集します。詳細については、GitHub ウェブサイトの「EKS Logs Collector (Windows)」を参照してください。次のコマンドを実行します。Invoke-WebRequest -OutFile eks-log-collector.ps1 https://raw.githubusercontent.com/awslabs/amazon-eks-ami/main/log-collector-script/windows/eks-log-collector.ps1 .\eks-log-collector.ps1Linux の場合は、インスタンスに接続します。次に、Linux EKS ログコレクタースクリプトを使用してワーカーノードログを収集します。詳細については、GitHub ウェブサイトの「EKS Logs Collector (Linux)」を参照してください。次のコマンドを実行して、ログコレクタースクリプトをダウンロードします。
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 -
Kubelet ログで次のエラーレスポンスを確認します。
"kubelet[5267]: runtime: failed to create new OS thread (have 2 already; errno=11)""kubelet[5267]: runtime: may need to increase max user processes (ulimit -u)" -
ゾンビプロセスを特定し、不要なプロセスを停止します。
Windows の場合は、タスクマネージャーを開き、[詳細] タブを選択します。ステータスが応答なしになっているプロセスを確認して、ゾンビプロセスを特定します。
Linux の場合は、次の ps コマンドを実行して、一覧表示でステータスが Z となっているゾンビプロセスを確認します。ps aux | egrep "Z|defunct"詳細については、Linux Journal ウェブサイトの「How to kill Zombie processes on Linux」(Linux でゾンビプロセスを強制終了する方法) を参照してください。
"Network plugin cni failed to set up pod network" というエラー
コンテナネットワークインターフェイス (CNI) が、新しく作成されたポッドに IP アドレスを割り当てることができない場合、次のエラーメッセージが表示されることがあります。
"Network plugin cni failed to set up pod network: add cmd: failed to assign an IP address to container"
このエラーは複数の原因で発生する可能性があり、主に次の 3 つのカテゴリーに分類されます。
リソースの制限
- サブネット IP を使い果たした
- ENI アタッチメントの上限に達した
設定に関する問題
- ワーカーノードに IAM CNI ポリシーが存在しない
- VPC CNI (aws-node) ポッドのステータスが Running になっていない
- VPC CNI、kube-proxy、CoreDNS のいずれかのバージョンが古い
- セキュリティグループまたはアクセスコントロールリストの設定が正しくない
アーキテクチャ特有の課題
- VPC CNI の構成がユースケースと一致していない
- OpenID Connect (OIDC) の設定が存在しない
- EKS マネージドアドオンではなくセルフマネージドアドオンを使用している
トラブルシューティングの詳しい手順については、「Amazon EKS の kubelet と CNI プラグインの問題を解決するにはどうすればよいですか?」を参照してください。
ベストプラクティスを以下に示します。
- 代替サブネットにポッドをデプロイできる VPC CNI 用のカスタムネットワーキングを使用します。
- プレフィックス委任モードを有効にします。詳細については、「Prefix mode for Windows」(Windows のプレフィックスモード) を参照してください。
- ポッドのセキュリティグループを使用して、ワーカーノード上のブランチ ENI を介して複数のポッドにカスタムセキュリティグループを割り当てます。
注: CNI 設定に変更を加えた場合、変更を有効にするには、影響を受けるノードを再起動する必要があります。
"Error while dialing" というエラー
aws-node ポッドがノード上で実行できなかったために aws-node ポッドが IPAM と通信できなかった場合は、次のようなエラーが表示されます。
"Error while dialing dial tcp 127.0.0.1:50051: connect: connection refused"
このエラーは次のシナリオで発生します。
VPC CNI のステータスが Pending になっている
Liveness や Readiness プローブは、セキュリティルールの設定またはアプリケーションエラーが原因で失敗する可能性があります。リソースを使い果たすと遅延が生じることもあります。通常、このエラーは強制モードで POD_SECURITY_GROUP_ENFORCING_MODE を使用し、DISABLE_TCP_EARLY_DEMUX が false に設定されている場合に発生する可能性があります。
ポッドごとにセキュリティグループを使用し、Liveness や Readiness プローブを使用する場合は、強制モードで DISABLE_TCP_EARLY_DEMUX を true に設定してください。これにより、kubelet は TCP を使用してブランチネットワークインターフェイス上のポッドに接続できます。
CNI マネージドプラグインの問題
aws-node を、AWS マネジメントコンソールでマネージドプラグインとして追加するとプローブに失敗します。これは、マネージドプラグインがサービスアカウントを上書きするためです。
これを解決するには、以下のいずれかの操作を行います。
- AWS マネジメントコンソールからマネージドアドオンを削除します。次に、必要な AmazonEKS_CNI_Policy IAM ポリシーを提供する正しい IAM ロールで再作成します。
- 既存の aws-node サービスアカウントを編集して、必要な CNI アクセス許可を持つ正しい IAM ロールに関連付けます。
- クラスターで Pod Identity を使用する場合は、aws-node サービスアカウントと、VPC CNI が使用する IAM ロールを関連付けるために必要な Pod Identity の関連付けを作成します。
その他の推奨事項
- 最新バージョンの VPC CNI (aws-node)、kube-proxy、coredns を使用してください。
"Failed to setup network for sandbox" というエラー
VPC-CNI (aws-node) ポッドでプレフィックス委任の有効化を適用すると、次のエラーメッセージが表示される場合があります。
"Failed to create pod sandbox: rpc error: code = Unknown desc = failed to setup network for sandbox"
この問題の詳細については、ワーカーノードの /var/log/aws-routed-eni/ipamd.log にある IP Address Management Daemon (IPAMD) ログを確認してください。
サブネットに使用可能な IP アドレスがあっても、連続した /28 ブロックの IP が使用できない場合はエラーが発生します。このエラーは、既存のセカンダリ IP アドレスがサブネット全体に断片的に広がっている場合に発生します。このエラーは、Kubernetes ログの Amazon VPC CNI プラグイン、または影響を受けるワーカーノードの CloudTrail イベントに表示されます。次のエラーメッセージが表示される場合があります。
"InsufficientCidrBlocks: The specified subnet does not have enough free cidr blocks to satisfy the request"
このエラーを解決するには、次のいずれかのオプションを実行します。
新しいサブネットを作成し、そこでポッドを起動します。
または、
Amazon EC2 サブネット CIDR 予約を使用して、プレフィックスが割り当てられたサブネット内のスペースを予約します。
IP アドレス割り当てから IP プレフィックス割り当てに移行する場合は、新しいノードグループを作成します。これにより、既存のノードをローリング置換する代わりに、使用可能な IP アドレス数を増やすことができます。
IP アドレスとプレフィックスの両方が割り当てられているノードでポッドを実行すると、アドバタイズされた IP アドレスの容量に不一致が生じる可能性があります。このシナリオは、ノード上の将来のワークロードに影響を与える可能性があります。この問題を解決するには、「プレフィックスを使用して Amazon EKS ノードに割り当てる IP アドレスを増やす」の手順を実行します。
"Container image authentication" エラー
コンテナランタイムにイメージをプルするのに必要なアクセス許可がない場合、次のようなエラーメッセージが表示されることがあります。
"pull access denied, repository does not exist or may require authorization: authorization failed: no basic auth credentials"
このエラーを解決するには、以下をチェックしてください。
- EKS ワーカーノードにアタッチされている IAM ロールを確認します。IAM ポリシー (AmazonEC2ContainerRegistryReadOnly) が見つからない場合は、ポリシーをアタッチしてください。
- クロスアカウントから ECR リポジトリのイメージをプルする場合は、「Amazon ECR イメージリポジトリ内のイメージをセカンダリアカウントにプッシュまたはプルできるようにする方法を教えてください」を参照してください。リポジトリレベルのポリシーに適切なアクセス許可が設定されていることを確認してください。
- ECR VPC エンドポイントを使用してイメージをプルする場合は、VPC エンドポイントセキュリティグループで、EKS ノードセキュリティグループからのポート 443 のインバウンド HTTPS が許可されていることを確認します。詳細については、「Amazon ECR interface VPC endpoints (AWS PrivateLink)」(Amazon ECR インターフェイス VPC エンドポイント (AWS PrivateLink)) を参照してください。
- containerd の場合、ポーズイメージのプルはブートストラップ中にのみ実行されます。その後、イメージはインスタンスに保持する必要があります。カスタムクリーンアップスクリプトや crictl rmi —prune などの手動削除コマンドを使用してポーズイメージを削除しないでください。ガベージコレクション (gc) は kubelet に任せてください。1〜2 分ごとに自動的に実行されます。containerd ポーズコンテナイメージを削除すると、新しいポッドが起動しなくなります。現在のポッドはノード上で問題なく実行され、kubelet ログには "Failed to create pod sandbox" というエラーが表示されます。
EKS ワーカーノードからポーズコンテナイメージを削除した場合は、次の手順を実行します。
-
EKS ワーカーノードにポーズイメージがあるかどうかを確認するには、次のコマンドを実行します。
ctr -n k8s.io images ls | grep -o "602401143452.dkr.ecr.YOUR-REGION.amazonaws.com/eks/pause:3.10"注: YOUR-REGION を実際の AWS リージョンに置き換えてください。
EKS ワーカーノードにポーズイメージがある場合、出力は次のようになります。
602401143452.dkr.ecr.aws.example.region.amazonaws.com/eks/pause:3.10 602401143452.dkr.ecr.aws.example.region.amazonaws.com/eks/pause:3.10EKS ワーカーノードが削除されているかどうかを確認するには、次のコマンドを実行します。
ctr -n k8s.io images ls | grep -o "localhost/kubernetes/pause:latest"イメージが削除されていると、出力は次のようになります。
ctr -n k8s.io images list |grep -i pause -
イメージをプルして ECR 認証トークンを取得するには、次のコマンドを実行します。
ECR_REGION=YOUR-REGION ECR_PASSWORD=$(aws ecr get-login-password --region $ECR_REGION)注: YOUR-REGION を実際の AWS リージョンに置き換えてください。
-
ECR からポーズイメージをプルします。正しいポーズイメージのバージョンを使用していることを確認してください。イメージのバージョンがわからない場合は、いずれかのワーカーノードにログインし、イメージバージョンを選択します。
例:
sudo ctr -n k8s.io image pull --user "AWS:$ECR_PASSWORD" 602401143452.dkr.ecr.aws.example.region.amazonaws.com/eks/pause:<ImageVersion>注: GitHub ウェブサイトの「Releases」(リリース) から最新のイメージバージョンを選択できます。
-
EKS 用にイメージを localhost としてタグ付けします。
例:
sudo ctr -n k8s.io image tag 602401143452.dkr.ecr.aws.example.region.amazonaws.com/eks/pause:<ImageVersion> localhost/kubernetes/pause:latest -
ポーズイメージがバックアップされると、新しいポッドは問題なく起動して実行されます。
"Container image authentication" エラー
コンテナランタイムにイメージをプルするのに必要なアクセス許可がない場合、次のようなエラーメッセージが表示されることがあります。
"pull access denied, repository does not exist or may require authorization: authorization failed: no basic auth credentials"
このエラーを解決するには、以下をチェックしてください。
- EKS ワーカーノードにアタッチされている IAM ロールを確認します。IAM ポリシー (AmazonEC2ContainerRegistryReadOnly) が見つからない場合は、ポリシーをアタッチしてください。
- クロスアカウントから ECR リポジトリのイメージをプルする場合は、「Amazon ECR イメージリポジトリ内のイメージをセカンダリアカウントにプッシュまたはプルできるようにする方法を教えてください」を参照してください。リポジトリレベルのポリシーに適切なアクセス許可が設定されていることを確認してください。
- ECR VPC エンドポイントを使用してイメージをプルする場合は、VPC エンドポイントセキュリティグループで、EKS ノードセキュリティグループからのポート 443 のインバウンド HTTPS が許可されていることを確認します。詳細については、「Amazon ECR interface VPC endpoints (AWS PrivateLink)」(Amazon ECR インターフェイス VPC エンドポイント (AWS PrivateLink)) を参照してください。
- containerd の場合、ポーズイメージのプルはブートストラップ中にのみ実行されます。その後、イメージはインスタンスに保持する必要があります。カスタムクリーンアップスクリプトや crictl rmi —prune などの手動削除コマンドを使用してポーズイメージを削除しないでください。ガベージコレクション (gc) は kubelet に任せてください。1〜2 分ごとに自動的に実行されます。containerd ポーズコンテナイメージを削除すると、新しいポッドが起動しなくなります。現在のポッドはノード上で問題なく実行され、kubelet ログには "Failed to create pod sandbox" というエラーが表示されます。
Windows ノードでの "Pod does not have label" というエラー
ポッドが Windows ノード上でスケジュールされた nodeSelector を持たない場合、次のようなエラーメッセージが表示される場合があります。
"Failed to parse Kubernetes args: pod does not have label vpc.amazonaws.com/PrivateIPv4Address" or "Pod does not have label vpc.amazonaws.com/PrivateIPv4Address"
この問題を解決するには、nodeSelector パラメータの PodSpec に次のラベルを必ず含めてください。
nodeSelector: kubernetes.io/os: windows kubernetes.io/arch: amd64
amazon-vpc-cni の Configmap で enable-windows-ipam パラメータが true に設定されていることを確認します。
amazon-vpc-cni の Configmap がない場合は、次のテンプレートを使用してクラスターにアップロードします。
apiVersion: v1 kind: ConfigMap metadata: name: amazon-vpc-cni namespace: kube-system data: enable-windows-ipam: "true"
aws-node ポッドと node-windows ポッドを再起動します。
Amazon EKS クラスターに Windows ノードをデプロイする方法の詳細については、「EKS クラスターに Windows ノードをデプロイする」を参照してください。
セキュリティグループエラー
セキュリティグループに問題があると、次のようなエラーが表示されます。
"Plugin type="aws-cni" name="aws-cni" failed (add): add cmd: failed to assign an IP address to container
Vpc-resource-controller failed to allocate branch ENI to pod: creating network interface, NoCredentialProviders: no valid providers in chain.Deprecated."
このエラーレスポンスは、health.kubernetes コントロールプレーンに問題があることを示している可能性があります。この問題を解決するには、AWS サポートにお問い合わせください。
関連情報
Amazon EKS の kubelet と CNI プラグインの問題を解決するにはどうすればよいですか?
Amazon EKS における、OIDC プロバイダーと IRSA に関する問題のトラブルシューティング方法を教えてください
Amazon EKS で IRSA のエラーをトラブルシューティングする方法を教えてください
- トピック
- Containers
- 言語
- 日本語

