## Pod调度 - 亲和podAffinity ### 硬亲和requiredDuringSchedulingIgnoredDuringExecution ```sh [15:25:06 root@master1 scheduler]#cat 07-scheduler-pod-affinity-base.yaml --- apiVersion: v1 kind: Pod metadata: name: pod-dev labels: env: dev spec: containers: - name: pod-test image: 10.0.0.55:80/mykubernetes/pod_test:v0.1 imagePullPolicy: IfNotPresent nodeSelector: env: dev --- apiVersion: v1 kind: Pod metadata: name: pod-test labels: env: test spec: containers: - name: pod-test image: 10.0.0.55:80/mykubernetes/pod_test:v0.1 imagePullPolicy: IfNotPresent nodeSelector: env: test [15:25:18 root@master1 scheduler]#kubectl apply -f 07-scheduler-pod-affinity-base.yaml pod/pod-dev created pod/pod-test created [15:25:27 root@master1 scheduler]#kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES pod-dev 1/1 Running 0 5s 10.244.3.10 node1.noisedu.cn <none> <none> pod-test 1/1 Running 0 5s 10.244.4.9 node2.noisedu.cn <none> <none> # 此时建立了两个pod分别有各自的标签,下面根据pod的标签创建基于硬亲和的pod [15:26:06 root@master1 scheduler]#cat 08-scheduler-pod-affinity-required.yaml apiVersion: v1 kind: Pod metadata: name: pod-affinity spec: containers: - name: pod-test image: 10.0.0.55:80/mykubernetes/pod_test:v0.1 imagePullPolicy: IfNotPresent affinity: podAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: env operator: In values: - test namespaces: ["default"] topologyKey: kubernetes.io/hostname [15:25:32 root@master1 scheduler]#kubectl apply -f 08-scheduler-pod-affinity-required.yaml pod/pod-affinity created [15:25:40 root@master1 scheduler]#kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES pod-affinity 1/1 Running 0 4s 10.244.4.10 node2.noisedu.cn <none> <none> pod-dev 1/1 Running 0 17s 10.244.3.10 node1.noisedu.cn <none> <none> pod-test 1/1 Running 0 17s 10.244.4.9 node2.noisedu.cn <none> <none> [15:25:44 root@master1 scheduler]#kubectl get pod -o wide --show-labels NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES LABELS pod-affinity 1/1 Running 0 26s 10.244.4.10 node2.noisedu.cn <none> <none> <none> pod-dev 1/1 Running 0 39s 10.244.3.10 node1.noisedu.cn <none> <none> env=dev pod-test 1/1 Running 0 39s 10.244.4.9 node2.noisedu.cn <none> <none> env=test ``` ### 软亲和preferredDuringSchedulingIgnoredDuringExecution ```sh # 多满足条件,选择权重高的node [15:30:53 root@master1 scheduler]#cat 09-scheduler-pod-affinity-preferred.yaml apiVersion: v1 kind: Pod metadata: name: pod-affinity spec: containers: - name: pod-test image: 10.0.0.55:80/mykubernetes/pod_test:v0.1 imagePullPolicy: IfNotPresent affinity: podAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 60 podAffinityTerm: labelSelector: matchExpressions: - {key: env, operator: In, values: ["dev"]} topologyKey: kubernetes.io/hostname - weight: 30 podAffinityTerm: labelSelector: matchExpressions: - {key: env, operator: In, values: ["test"]} topologyKey: kubernetes.io/hostname [15:31:26 root@master1 scheduler]#kubectl apply -f 09-scheduler-pod-affinity-preferred.yaml pod/pod-affinity created [15:32:32 root@master1 scheduler]#kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES pod-affinity 1/1 Running 0 9s 10.244.3.11 node1.noisedu.cn <none> <none> pod-dev 1/1 Running 0 7m14s 10.244.3.10 node1.noisedu.cn <none> <none> pod-test 1/1 Running 0 7m14s 10.244.4.9 node2.noisedu.cn <none> <none> # 这种方式,一般会适用于一些服务和后台存储必须放在一起 ``` ## Pod调度 - 反亲和podAntiAffinity ```sh [15:45:56 root@master1 scheduler]#cat 12-scheduler-pod-anaffinity-required.yaml apiVersion: v1 kind: Pod metadata: name: pod-antiaffinity spec: containers: - name: pod-test image: 10.0.0.55:80/mykubernetes/pod_test:v0.1 imagePullPolicy: IfNotPresent affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - {key: env, operator: In, values: ["dev"]} topologyKey: kubernetes.io/hostname [15:46:08 root@master1 scheduler]#kubectl apply -f 12-scheduler-pod-anaffinity-required.yaml pod/pod-antiaffinity created [15:46:31 root@master1 scheduler]#kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES pod-antiaffinity 1/1 Running 0 5s 10.244.4.11 node2.noisedu.cn <none> <none> pod-dev 1/1 Running 0 21m 10.244.3.10 node1.noisedu.cn <none> <none> pod-test 1/1 Running 0 21m 10.244.4.9 node2.noisedu.cn <none> <none> [15:46:36 root@master1 scheduler]#kubectl get pod -o wide --show-labels NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES LABELS pod-antiaffinity 1/1 Running 0 24s 10.244.4.11 node2.noisedu.cn <none> <none> <none> pod-dev 1/1 Running 0 21m 10.244.3.10 node1.noisedu.cn <none> <none> env=dev pod-test 1/1 Running 0 21m 10.244.4.9 node2.noisedu.cn <none> <none> env=test # 因为是反亲和性,所以会调度到pod-test的相应节点 ```