[GKE] プリエンプティブノードで稼働してほしくないpodを通常ノードで必ず稼働する設定
GKEを使用する上でプリエンプティブノードの利用はコストが通常価格の1/3になるのでかなり有効だが、1日に1回ノードのリフレッシュが発生し、プリエンプティブノードで動いているpodのup/downが発生する。
nginx-ingress-controllerがダウンすると、外部からの通信が全断するので、nginx-ingress-controllerなどの重要Podはプリエンプティブノードではなく、通常のノードで稼働してDownを避けるようにしたい。
ノード taintという機能を使用すればtaint(汚れ)をつけたpodはtaintを許容できるノードでしか稼働できなくなる。
目次
podの設定
Pod の仕様に tolerations フィールドを追加する
tolerations: - key: dedicated operator: Equal value: experimental effect: NoSchedule
上記設定は
という感じでDeployment→spec→template→spec配下に記述する
注:コード内のxxxxは適宜環境に合わせて変更すること
effectの種類
effectにはNoScheduleの他に2つ存在するので目的に沿って変更すること
Effectの種類 | 概要 |
---|---|
NoSchedule | taintが許容できなければnodeへscheduleさせない (すでにscheduleされているPodはそのまま) |
PreferNoSchedule | taintが許容できるnodeを探し、なければ許容できないnodeであってもscheduleする |
NoExecute | scheduling時に影響があるNoSchedule やPreferNoSchedule と違って、NoExecute はnode上で実行中のpodへも影響がある。もし NoExecute エフェクトをもったtaintをnodeへ追加した場合でかつpodがそのtaintを許容できない場合、 そのpodは停止される(つまりnode上から追い出される )。 |
ノード taints を含むノードプールを作成する
上記のようにPodに設定したtaintsを許容するノードプールを作成する。ちなみに既存ノードにtaintsの設定を行うことも可能
参考:https://cloud.google.com/kubernetes-engine/docs/how-to/node-taints?hl=ja
ノードプールを作成する際に「メタデータ」項目のノードtaintに先程podに設定した鍵と値と効果を設定する
鍵(キー):dedicated
値:experimental
podをapply
準備が整ったので先程taintを設定したpodのyamlをapplyする
kubectl apply -f xxxxx.yaml
podがtaintを設定したノードで稼働していることを確認
kubectl get pod -o wide