Affinityとは
Affinityとは、Podをスケジューリングの条件を設定する機能である。
以下の3種類があるが、このページではPod Affinity、Pod Anti-Affinityの2つを説明する。
- Node Affinity
- Pod Affinity
- Pod Anti-Affinity
Node Affinityについては以下を参照。
【KubernetesのAffinity】その1 - Node Affinityの使い方
目次
Pod Affinity
これは、特定のPodが存在するNodeへ、該当のPodをスケジューリングする方法である。
以下で、pod-aが存在するNodeへ、pod-bをスケジューリングする例をやってみる。
pod-aを作成
apiVersion: v1
kind: Pod
metadata:
name: memcached
labels:
app: memcached
spec:
containers:
- name: memcached
image: memcached:alpine
作成
$ sudo kubectl apply -f pod-a.yml
pod/memcached created
確認
$ sudo kubectl get pod
NAME READY STATUS RESTARTS AGE
memcached 1/1 Running 0 21s
pod-bを作成
topologyKey
というフィールドがあるが、これはNodeのLabelを使った範囲指定をするためのもの。
以下のkubernetes.io/hostname
というのは、同じホスト(=ノード)内という意味になる。
podAffinityを利用する場合、このフィールドは必須である。
参考:topology-key
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod-affinity
spec:
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
# metadata.labels.appがmemcachedという名前のPodが存在しているNodeにスケジューリングする
- memcached
# 同じホスト(=ノード)内のNodeにスケジューリングする
topologyKey: kubernetes.io/hostname
containers:
- name: nginx
image: nginx:alpine
作成
$ sudo kubectl apply -f pod-b.yml
pod/memcached created
確認
$ sudo kubectl get pod
NAME READY STATUS RESTARTS AGE
memcached 1/1 Running 0 21s
$ sudo kubectl describe pod nginx-pod-affinity
# **snip**
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 2s default-scheduler Successfully assigned default/nginx-pod-affinity to minikube
Normal Pulled 1s kubelet, minikube Container image "nginx:alpine" already present on machine
Normal Created 1s kubelet, minikube Created container nginx
Normal Started 1s kubelet, minikube Started container nginx
Pod Anti-Affinity
Pod Affinityの逆で、特定のPodが存在していないNodeへスケジューリングをする。
以下の例では、先述のPod Affinityの例で作成した、memcachedのPodが存在しないNodeへのスケジューリング指定をしてみる。
今回は、memcachedが存在しているNodeしか用意していないため、このスケジューリングは失敗する。
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod-anti-affinity
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- memcached
topologyKey: kubernetes.io/hostname
containers:
- name: nginx
image: nginx:alpine
apply
$ sudo kubectl apply -f pod-c.yml
PodがPendingになっている。
$ sudo kubectl get pod
NAME READY STATUS RESTARTS AGE
memcached 1/1 Running 0 38m
nginx-pod-affinity 1/1 Running 0 109s
nginx-pod-anti-affinity 0/1 Pending 0 2s
Podがスケジューリング先のNodeを見つけられないため、Warningが出力された。
$ sudo kubectl describe pod nginx-pod-anti-affinity
# **snip**
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedScheduling 24s (x2 over 24s) default-scheduler 0/1 nodes are available: 1 node(s) didn't match pod affinity/anti-affinity, 1 node(s) didn't match pod anti-affinity rules.