Security groups for podsとKubernetes Job

4 min read

前提

  • Security groups for pods - Amazon EKSを導入した
  • RDSと通信するPodに使っている
  • Kubernetes Jobを使ったデータ操作をするPodがいる
    • (データ操作をするので「RDSと通信するPod」に該当=Security groups for podsを利用する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合計から、受け入れが可能か考慮される。

「ノード上のPodのrequest合計」は、NodeInfo.Requestedに入っている。

findNodesThatPassFiltersの先頭で取得され、後続の関数に引数として渡されて参照される。

nodeInfoListupdateNodeInfoSnapshotListで更新される。

updateNodeInfoSnapshotListUpdateSnapshotから呼ばれる。

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.