Security groups for podsとKubernetes Job
前提
- Security groups for pods - Amazon EKSを導入した
- RDSと通信するPodに使っている
- Kubernetes Jobを使ったDBアクセスをするPodがいる
問題
Podはスケジューリングされたが、IPアドレスの割り当てに失敗して、起動しない
という状態のままスタックする場合がある。

原因
(Jobから生まれて)完了したPodはIPアドレスを持ち続ける
=Branch network interfacesも持ち続ける
一方、スケジューリング時には、完了したPodのresources.requestsは計算に入らない。
セキュリティグループ割り当て対象のPodには自動的にvpc.amazonaws.com/pod-eniのrequestとlimitが追加される。

このPodをスケジューリングするとき、vpc.amazonaws.com/pod-eniに関してもPod自身のrequestと、ノード上の他のPodのrequest合計から、受け入れが可能か考慮される。
-
Schedule -
findNodesThatFitPod -
findNodesThatPassFilters -
PodPassesFiltersOnNode -
RunFilterPlugins -
Filter※RunFilterPluginの中でrunFilterPluginから呼ばれるうちの一つ -
fitsRequest
「ノード上のPodのrequest合計」は、NodeInfo.Requestedに入っている。
findNodesThatPassFiltersの先頭で取得され、後続の関数に引数として渡されて参照される。
-
https://github.com/kubernetes/kubernetes/blob/02cf58102a61b6d1e021e256381ff750573ce55d/pkg/scheduler/core/generic_scheduler.go#L294
- ここで取得しているのは
Snapshot構造体のnodeInfoListフィールド
- ここで取得しているのは
nodeInfoListはupdateNodeInfoSnapshotListで更新される。
updateNodeInfoSnapshotListはUpdateSnapshotから呼ばれる。
schedulerCache構造体のnodesの中にあるframework.NodeInfoが情報源。
「他のPodのrequest合計」=NodeInfo.Requested
これを計算するときに、終了したPodの分は含まれない。
→終了したPodがvpc.amazonaws.com/pod-eniをリクエストしていたらそれも考慮されない。
→m5.largeのノードに終了したPodを含めてvpc.amazonaws.com/pod-eniをリクエストするPodが9個ある場合、
Branch network interfaceはもう持てないが、スケジューラーはまだいけると判断する。
→スケジュールされたものの、Branch network interfaceが持てないのでIPアドレスの割り当てができない。
cf
- Kubernetes: kube-scheduler をソースコードレベルで理解する - チェシャ猫の消滅定理
-
https://github.com/aws/amazon-vpc-cni-k8s/issues/1245#issuecomment-806016472
-
Kube-scheduler that is running in EKS is vanilla.
-
-
QoS, "Node allocatable" and the Kubernetes Scheduler
- 少し古いが知りたいこと大体書いてた
- 調査時点の利用バージョン(
v1.19.6)との差分的な情報は↓- Move informer event handlers to scheduler by krmayankk · Pull Request #69504 · kubernetes/kubernetes
-
Remove pod status.phase check from pod event handlers by bsalamat · Pull Request #69592 · kubernetes/kubernetes
-
The scheduler pod informer already filters out pods which are terminated (succeeded or failed).
-
Discussion