🗺️

KubernetesのTopologyとは?

2021/03/26に公開

まとめ

  • Nodeを論理的にグルーピングする概念。Topology Domainといいます。
  • NodeにLabelを付与することで表現します。
  • たとえば、Node単位、ゾーン単位、リージョン単位などで好きにグルーピングできます。
  • 使えるLabelは以下

Topology Domainを図で理解する

以下のようなLabelが付与された8つのNodeがあるとします。

Topology Domainを表現するにはTopology Keyを指定します。
Topology Keyには LabelのKeyを指定します。すると、指定したLabelのKeyに対するValueが同じものが1つのTopology Domainとなります。

たとえば、Topology Keytopology.kubernetes.io/zoneとした場合、以下の画像のようなTopology Domainを表現できます。
紫色の範囲が1つ1つのTopology Domainとなり、今回の場合は、全部で4つのTopology Domainを表現できました。

  • TopologyKey=topology.kubernetes.io/zone

次にNodeをリージョンごとに分割したいので、Topology Keytopology.kubernetes.io/regionを指定します。
すると以下の画像のように、リージョンごとにTopology Domainを表現することができます。

  • TopologyKey=topology.kubernetes.io/region

各NodeごとにTopology Domainを表現することもできます。
その場合は、各NodeでValueがユニークなLabelをTopology Keyに指定すれば良いです。
Topology Keykubernetes.io/hostnameを指定すると以下の図のようになり、各ノードごとにTopology Domainを表現できます。

  • TopologyKey=kubernetes.io/hostname

TopologyDomainの具体的な使い方

どんな機能で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