Associate Cloud Engineer(Google Cloud) 無料問題 8 / 10 ・ 分野3: クラウド ソリューションの正常な運用
Standard クラスタで、古いマシンタイプのノードプール pool-a を削除する。pool-a の Pod には PodDisruptionBudget(PDB)があり、一部の Pod は nodeSelector で pool-a を指定している。GKE のノードプールの説明ページに照らして、削除のときに起きることはどれか。
- nodeSelector で pool-a を指定した Pod は、削除のときに指定が外され、別のノードプールへ移されて動き続ける
- GKE が各ノードをドレインする。既定では PDB を守らず、pool-a を指す Pod は置き場が無いまま残りうる
- GKE は既定で PDB を守るので、PDB を満たせない間はノードのドレインが止まり、削除も進まない
- GKE はドレインせずに VM を止めるので、Pod を穏やかに終わらせたいなら先に kubectl drain を実行する
正解と解説を見る
正解: B
正解の理由
ページの「ノードプールの削除」の節によると、ノードプールを削除すると GKE はそのノードプールのすべてのノードをドレインし、Pod を削除して再スケジュールする。Pod の削除には、ノード上の Pod に設定された terminationGracePeriodSeconds の最大値(上限は1時間)の猶予を与える。GKE は既定では削除のときに PDB を守らない。さらに、特定の nodeSelector を持つ Pod は、条件を満たすノードがほかに無ければスケジュールできないまま残ることがある。削除の前に、移す先のノードプールと Pod の指定を用意しておく必要がある。
違う選択肢
「GKE は既定で PDB を守るので、PDB を満たせない間はノードのドレインが止まり、削除も進まない」… ページは、GKE は既定ではノードプールの削除のときに PDB の設定を守らないと書いている。守らせたい場合は、ノードプールの設定を更新して PDB を尊重させる(その場合も上限は1時間)。
「GKE はドレインせずに VM を止めるので、Pod を穏やかに終わらせたいなら先に kubectl drain を実行する」… ドレインをせずに止めるのは、ページではクラスタを削除するときの説明である。ノードプールの削除では、GKE がノードプールのすべてのノードをドレインし、Pod を削除して再スケジュールする。kubectl drain を先に実行するよう勧めているのは、クラスタを削除する場合である。
「nodeSelector で pool-a を指定した Pod は、削除のときに指定が外され、別のノードプールへ移されて動き続ける」… ページは、Pod に特定の nodeSelector がある場合、条件を満たすノードがクラスタにほかに無ければ、Pod はスケジュールできない状態のまま残ることがあると書いている。指定が外されるという説明は無く、nodeSelector は Pod をそのノードプールのノードだけで動かすための指定である。
つまずき方
ページは、kube-dns や konnectivity-agent などの kube-system の Pod をスケジュールできる状態を保つため、デフォルトのノードプールを消す前や、すべてのノードプールに強い taint を付ける前に、少なくとも1つのノードプールを残すよう警告している。Standard クラスタにある Autopilot 管理のノードプールは削除できない。ノードプールは個別に作成・アップグレード・削除でき、クラスタ全体には影響しない。