KubernetesのTopologyとは?
まとめ
- Nodeを論理的にグルーピングする概念。
Topology Domain
といいます。 - NodeにLabelを付与することで表現します。
- たとえば、Node単位、ゾーン単位、リージョン単位などで好きにグルーピングできます。
- 使えるLabelは以下
- 自分で付与したLabel
- Cloud Providerが自動で付与してくれるLabel
- kubernetesのWell-Known Lables
Topology Domainを図で理解する
以下のようなLabelが付与された8つのNodeがあるとします。
Topology Domain
を表現するにはTopology Key
を指定します。
Topology Key
には LabelのKeyを指定します。すると、指定したLabelのKeyに対するValueが同じものが1つのTopology Domain
となります。
たとえば、Topology Key
をtopology.kubernetes.io/zone
とした場合、以下の画像のようなTopology Domain
を表現できます。
紫色の範囲が1つ1つのTopology Domain
となり、今回の場合は、全部で4つのTopology Domain
を表現できました。
- TopologyKey=topology.kubernetes.io/zone
次にNodeをリージョンごとに分割したいので、Topology Key
にtopology.kubernetes.io/region
を指定します。
すると以下の画像のように、リージョンごとにTopology Domain
を表現することができます。
- TopologyKey=topology.kubernetes.io/region
各NodeごとにTopology Domain
を表現することもできます。
その場合は、各NodeでValueがユニークなLabelをTopology Key
に指定すれば良いです。
Topology Key
にkubernetes.io/hostname
を指定すると以下の図のようになり、各ノードごとにTopology Domain
を表現できます。
- TopologyKey=kubernetes.io/hostname
TopologyDomainの具体的な使い方
どんな機能でTopologyが使われているのか
- podAffinity/podAntiAffinity
- topologySpreadConstraints
- Service Topology
- などなど
ここでは、podAffinityを例にTopologyの使い方の具体例をみていきます。
podAffinityでTopologyDomainを使ってみる
たとえば、以下のようなシチュエーションで役に立ちます
-
app=frontend
というLabelが付与されたPodが複数台存在している - middlewareとして機能するPodを、ネットワークのレイテンシーをさげるために、
app=frontend
のpodと同じゾーンに配置したい
その場合は以下のようなyamlを書きます
apiVersion: v1
kind: Pod
metadata:
name: middleware
spec:
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- frontend
topologyKey: topology.kubernetes.io/zone
containers:
- name: middleware
image: redis
kubernetesのスケジューラーは、上のPodを配置するときにtopology.kubernetes.io/zone
ごとにlabelSelector
に該当するPodが存在するかを確認し、対象のPodが存在するtopology.kubernetes.io/zone
のいずれかに新しいPodを配置してくれます。
以下の図のようにapp=frontend
というLabelが付与されたpodが配置されていた場合、新しく配置されるPodは、矢印がひかれたNodeのいずれかに配置されることになります。
おまけ
Nodeに付与されてるLabelを調べるには以下のコマンドを実行すればOKです。
kubectl describe node xxx
Discussion