[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

上記設定は

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: xxxxxx
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: xxxxx
    spec:
      containers:
      – name : xxxxxx
        image: xxxxxx
        volumeMounts:
        – mountPath: /ext
          name: xxxxxx
          subPath: xxxxx
        ports:
        – containerPort: 80
          name: http
          protocol: TCP
        – containerPort: 443
          name: https
          protocol: TCP
      volumes:
      – name: xxxxx
        persistentVolumeClaim:
          claimName: xxxxx
      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時に影響があるNoSchedulePreferNoScheduleと違って、
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

 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です