今回から、k8sの高度なスケーリングについて、説明していきます。
k8sスケジューリングの方法
k8sでは、Podのスケーリングは以下の2つの方法で行います。
- Affinity:Podのスケジューリング時に特定のNodeを選択する方法
- 特徴:Podに選択権を持つ
- TaintsとTolerations:Nodeに属性(Taints)を付け、Podにも属性(Tolerations)を付け、属性の比較でスケジューリングする方法
- 特徴:Nodeにも選択権を持てる
NodeへのPodのスケジューリングは、公式ドキュメントでは以下の説明があります。
You can constrain a Pod to only be able to run on particular Node(s), or to prefer to run on particular nodes. There are several ways to do this, and the recommended approaches all use label selectors to make the selection.
上記の内容から、Nodeのラベルを使ってスケジューリングするのが推奨されています。
Affinityの手法
Affinityの手法としては、以下のものがあります。
- nodeSelector:シンプルなNode Affinity機能
- Node Affinity:特定条件/特定条件以外のNode上だけ実行する
- Inter-Pod Affinity:特定のPodがいるドメイン(Node、ゾーンなど)上で実行する
- Inter-Pod Anti-Affinity:特定のPodがいないドメイン(Node、ゾーンなど)上で実行する
Nodeのラベル
Nodeを特定するには、ラベルが最も使われる属性の一つです。
Nodeのラベルは以下の2種類があります。
- ビルトインラベル:デフォルトでNodeが持っているラベル
- 手動追加のラベル:手動でNodeに追加するラベル
ビルトインラベル
GCPのNodeがデフォルト持っているラベルは以下のものがあります。(GCPのNode情報)
- "beta.kubernetes.io/arch": "amd64"
- "beta.kubernetes.io/fluentd-ds-ready": "true"
- "beta.kubernetes.io/instance-type": "g1-small"
- "beta.kubernetes.io/os": "linux"
- "cloud.google.com/gke-nodepool": "default-pool"
- "cloud.google.com/gke-os-distribution": "cos"
- "cloud.google.com/gke-preemptible": "true"
- "failure-domain.beta.kubernetes.io/region": "asia-northeast1"
- "failure-domain.beta.kubernetes.io/zone": "asia-northeast1-a"
- "kubernetes.io/arch": "amd64"
- "kubernetes.io/hostname": "gke-test-cluster-default-pool-f0d7b301-0p7b"
- "kubernetes.io/os": "linux"
※よくAffinityで使うものを太字でマークしています。
# 確認用コマンド
kubectl get nodes -o json | jq ".items[] | .metadata.labels"
ラベルの手動作成
Nodeへラベル追加は以下のコマンドで実施します。
# Nodeラベル追加コマンド
kubectl label node <Node名> <label1=foo> <label2=bar> ...
※GCPでのラベルの追加は、GCPのNodePool操作画面で追加可能です。
最後に
今回はスケジューリングの概要及び必要な前提知識を説明しました。
次回から、それぞれの仕組みを細かく説明していきます。
ここまで読んでいただいて、お疲れ様でした。
コメント