FailedSchedulingの原因と対処法
冒頭まとめ KubernetesでPodがPendingのままになり、kubectl describe podのEventsに次のような警告が出ることがあります。 Warning FailedScheduling default-scheduler 0/3 nodes are available: 1 Insufficient cpu, 2 node(s) had taints that the pod didn't tolerate. FailedSchedulingは、kube-schedulerがPodを配置できるノードを見つけられなかったことを示すイベントです。エラー名だけでは原因を判断できません。0/3 nodes are available:の後ろにある理由を、最後まで確認する必要があります。 最初に次のコマンドを実行してください。 kubectl describe pod <pod-name> -n <namespace> kubectl get events -n <namespace> \ --field-selector reason=FailedScheduling \ --sort-by=.metadata.creationTimestamp 理由がInsufficient cpuならCPUの要求量、didn't match Pod's node affinity/selectorならラベルと配置条件、had taints that the pod didn't tolerateならTaintとTolerationを調べます。複数の理由が並んでいる場合は、1つ直しただけでは配置できないことがあります。 FailedSchedulingとは FailedSchedulingはPodの状態ではなく、スケジューラーが記録するイベントのReasonです。Podの状態はPendingのままで、PodScheduled条件はFalseになります。 kube-schedulerは、まだ配置先が決まっていないPodを監視し、次のような条件で候補ノードを絞り込みます。 Podが要求するCPUやメモリを確保できるか nodeSelectorやNode Affinityに一致するか ノードのTaintをPodが許容しているか 使用するボリュームの配置条件を満たすか すべてのノードがいずれかの条件で候補から外れると、配置に失敗してFailedSchedulingが記録されます。この仕組みはKubernetes Schedulerの公式ドキュメントで確認できます。 同じPendingでも、すでに配置先ノードが決まり、イメージ取得やコンテナ作成を待っている場合はスケジューラーの問題ではありません。FailedSchedulingが出ている場合は、Podを起動する処理より前の「配置先を決める段階」で止まっています。 0/N nodes are availableの読み方 イベントは、次の形式で表示されます。 ...