k8s亲和性调度

警告
本文最后更新于 2020-12-29 11:57,文中内容可能已过时。

亲和性调度可以基于:

node亲和性(nodeAffinity):选择调度到相同或不同的node节点

pod亲和性(podAffinity):和某些pod调度到同一节点

pod反亲和性(podAntiAffinity):和某些pod调度在不同节点

亲和性调度可以分成两种策略:

硬策略(requiredDuringSchedulingIgnoredDuringExecution):

指定了将 pod 调度到一个节点上必须满足的规则,不满足则会处于pending状态,一直进行重试,直到满足为止。

软策略(preferredDuringSchedulingIgnoredDuringExecution):

优先满足指定的规则,如果不满足则会调度到其他节点上。如果有多个软策略还可以设置优先级(weight)

1.节点亲和性

使用节点亲和性硬策略将pod调度到 kubernetes.io/hostname 标签不是test-k8s-node2的节点上,软策略将pod尽量调度到test-k8s-node3节点上

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
kind: Deployment
apiVersion: apps/v1
metadata:
  name: affinity
  labels:
    app: nginx
spec:
  replicas: 4
  selector:
    matchLabels:
      app: nginx-affinity
  template:
    metadata:
      labels:
        app: nginx-affinity
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - name: web
          containerPort: 80
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: kubernetes.io/hostname
                operator: NotIn
                values:
                - test-k8s-node2
          preferredDuringSchedulingIgnoredDuringExecution:
            - weight: 1 
              preference: 
                matchExpressions:
                - key: kubernetes.io/hostname
                  operator: In
                  values:
                  - test-k8s-node3
> operator可选操作:`In`,`NotIn`,`Exists`,`DoesNotExist`,`Gt`,`Lt`

2.pod亲和性

我这里的区域标记是:

1
2
3
4
kubectl label nodes test-k8s-node1 zone=1
kubectl label nodes test-k8s-node3 zone=1
kubectl label nodes test-k8s-node2 zone=2
kubectl label nodes test-k8s-node4 zone=2

首先找到pod中包含app=nginx节点,查看zone标签的值(topologyKey的作用),假如zone=2,那么该pod会部署在zone=2的区域中。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
kind: Deployment
apiVersion: apps/v1
metadata:
  name: affinity
  labels:
    app: nginx
spec:
  replicas: 4
  selector:
    matchLabels:
      app: nginx-affinity
  template:
    metadata:
      labels:
        app: nginx-affinity
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - name: web
          containerPort: 80
      affinity:
        podAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - nginx
            topologyKey: zone

直接部署此文件:

均处于pending状态,

创建一个标签为app=nginx的pod

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
apiVersion: v1
kind: Pod
metadata:
  name: test-nginx-pod
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.14.2
    ports:
    - name: http
      containerPort: 80

可以看到这个pod调度到了test-k8s-node1节点上,node1节点的zone值为1,所以刚才的pod会调度到zone=1的节点上

3.pod反亲和性

当前app=nginx的pod被调度在node4节点上

创建反亲和性的pod

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
kind: Deployment
apiVersion: apps/v1
metadata:
  name: affinity
  labels:
    app: nginx
spec:
  replicas: 4
  selector:
    matchLabels:
      app: nginx-affinity
  template:
    metadata:
      labels:
        app: nginx-affinity
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - name: web
          containerPort: 80
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - topologyKey: kubernetes.io/hostname
            labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - nginx

可以看到所有pod都不会被调度到node4节点上了

请我喝杯水
SoulChild 微信号 微信号
SoulChild 微信打赏 微信打赏
0%