マニュフェストにPodを、Nodeにlabelを付与して
対象のlabelのNodeに手動でスケジューリングを行うことができる。
メモ:
手動でスケジュールを行わ無い場合(デフォルトの状態)は、コントロールプレイン側で
ラウンドロビン形式でPodを割り振る形になっている。
以下のスケジュリングするパターンがある。
■nodeSelector (簡易版:特定のNodeだけにPodを割り当てる)
■Node Affinity (条件に一致したラベルが付与されたNodeにPodを割り当てる)
■Inter-Pod Affinity (特定のPodがいる[ドメイン:ノード、ゾーン、etc]上で、実行)
1)以下のコマンドで、各種Nodeに標準で割り振られているタグを確認してみる。
kubectl get node -o json | jq ".items[] | .metadata.labels"
2)Nodeにラベルを手動で付与します。
例:
kubectl label node Node名 label=値 label=値 label名=値
(ちなみに、label名も適当に決めることができる)
3)以下のコマンドで、各種Nodeのdisk type, disk size, cpu typeの付与したタグを確認できる。
kubectl -L=disktype,cputype,disksize get node
(以下、付与したラベルが表示されていることが確認できる)
1)マニュフェストを作成して実行する
(DISTYPE:sd-cardのラベルが付与しているnode2にスケジュールを行ってみる)
2)デプロイ後、確認してみると対象のNode(node2)にスケジュールされてることが把握できる。
■Node Affinity
以下のポリシーを指定する必要がある。
①requiredDuringSchedulingIgnoredDuringExecution (必須のスケジューリング)
②preferredDuringSchedulingIgnoredDuringExecution (優先的に考慮されるスケジューリング)
以下の条件にしてみる。
必須条件:sd-card
優先条件:rasp-node2.local
マニュフェストを作成して実行する
<メモ>
weight:
複数の優先順位を記載するときに”重み”と”適応順位”を決められる。
operator:
以下のkeyラベルの値の条件を指定してます。
①In : ラベルの値のいずれか一つ以上と一致する
基本的に、Inを多様するパターンが多いような気がする。
②NotIn : ラベルの値のいずれにも一致しない
Inの逆パターンで利用することもアリかも。
③Exists : ラベルが存在する
④DoesNotExists : ラベルが存在しない
⑤Gt : ラベルAの値がBよりも大きい
例:Nodeのdisk 残量を考慮してPodをスケジュールするのみ良いかも。
⑥Lt : ラベルAの値がBよりも小さい
例:NodeのCPUリソースを考慮してPodをスケジュールするのみ良いかも。
以下、確認してみると、必須条件と、優先条件で割り当てていることが把握できる。
メモ:
上記、仮にnode2がダウンした場合、必須条件(sd-card)で割り当てているNode(rasp-node1)にスケジュールされる。
その他検証(1):
ちなみに、マッチしない、必須条件、優先条件を入れてデプロイするとpendingのままになる。
(以下のようにaffinity関連のエラーが出る)
その他検証(2):
必須条件が一致していて、優先条件が合わない場合でデプロイした場合でも
Podのスケージュリングを行ってくれる。
■Inter-Pod Affinity
特定のPodが実行されているドメイン(ノード、ゾーン、etc)上へPodをスケジューリングする仕組み
0 件のコメント:
コメントを投稿