亲和性

NodeAffinity(node节点亲和)

  • yaml

    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
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: web-demo-node
    namespace: dev
    spec:
    selector:
    matchLabels:
    app: web-demo-node
    replicas: 1
    template:
    metadata:
    labels:
    app: web-demo-node
    spec:
    containers:
    - name: web-demo-node
    image: tomcat:8-slim
    ports:
    - containerPort: 8080
    affinity:
    nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution: #必须达到一下条件
    nodeSelectorTerms: # 节点选择
    - matchExpressions: # 搜索条件
    - key: beta.kubernetes.io/arch # 指点的键beta.kubernetes.io/arch
    operator: In #运算符In
    values: # 键的值
    - amd64
    preferredDuringSchedulingIgnoredDuringExecution: #最好达到的条件
    - weight: 1 # 权重
    preference:
    matchExpressions: # 搜索
    - key: kubernetes.io/hostname #指定键disktype
    operator: NotIn # 运算符Notin
    values: # 键的值
    - vmware-113
    - vmware-112
  • 如何获取node节点的标签

    1
    kubectl get nodes -n [namespace] --show-labels

PodAffinity(Pod亲和性)

  • yaml

    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
    40
    41
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: web-demo-pod
    namespace: dev
    spec:
    selector:
    matchLabels:
    app: web-demo-pod
    replicas: 1
    template:
    metadata:
    labels:
    app: web-demo-pod
    spec:
    containers:
    - name: web-demo-pod
    image: chcgolang/frps
    ports:
    - containerPort: 7500
    affinity:
    podAffinity:
    requiredDuringSchedulingIgnoredDuringExecution: #必须达到一下条件
    - labelSelector: # 便签选择
    matchExpressions: # 搜索条件
    - key: app # 键
    operator: In #匹配条件
    values:
    - web-demo #值
    topologyKey: kubernetes.io/hostname
    preferredDuringSchedulingIgnoredDuringExecution: #最好达到的条件
    - weight: 100 #权重
    podAffinityTerm:
    labelSelector:
    matchExpressions:
    - key: pod-template-hash # 键
    operator: In #条件
    values:
    - 5db95f77cf #值
    topologyKey: kubernetes.io/hostname

  • 如何查看pod节点标签

    1
    kubectl get pod -n [namespace] --show-labels

PodAnitAffinity(Pod反亲和性)

  • PodAffinity意思相反,PodAffinityPodAnitAffinity可以同时存在

  • yaml

    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
    40
    41
    42
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: web-demo-podanti
    namespace: dev
    spec:
    selector:
    matchLabels:
    app: web-demo-podanti
    replicas: 1
    template:
    metadata:
    labels:
    app: web-demo-podanti
    spec:
    containers:
    - name: web-demo-podanti
    image: chcgolang/frps
    ports:
    - containerPort: 7500
    affinity:
    podAntiAffinity:
    requiredDuringSchedulingIgnoredDuringExecution: #必须达到一下条件
    - labelSelector: # 便签选择
    matchExpressions: # 搜索条件
    - key: app # 键
    operator: In #匹配条件
    values:
    - web-demo #值
    topologyKey: kubernetes.io/hostname
    podAffinity:
    preferredDuringSchedulingIgnoredDuringExecution: #最好达到的条件
    - weight: 100 #权重
    podAffinityTerm:
    labelSelector:
    matchExpressions:
    - key: app # 键
    operator: In #条件
    values:
    - web-demo-node #值
    topologyKey: kubernetes.io/hostname

  • 如何查看pod节点标签

    1
    kubectl get pod -n [namespace] --show-labels

参数说明

requiredDuringSchedulingIgnoredDuringExecution:一定要达到的条件

preferredDuringSchedulingIgnoredDuringExecution:达到上面条件的基础上,最好也达到这个要求

  • 键值运算关系

    运算符 作用
    In label的值在某个列表中
    Notin label的值不在某个列表中
    Gt label的值大于某个值
    Lt label的值小于某个值
    Exists 某个label存在
    DesNotExist 某个label不存在

污点(Taint)和容忍(Tolerations)

污点(Taint)

Taint 和 toleration 相互配合,可以用来避免 pod 被分配到不合适的节点上。每个节点上都可以应用一个或多个taint ,这表示对于那些不能容忍这些 taint 的 pod,是不会被该节点接受的。如果将 toleration 应用于 pod上,则表示这些 pod 可以(但不要求)被调度到具有匹配 taint 的节点上

污点设置,查看和去除

1
2
3
4
5
6
7
8
# 设置污点
kubectl taint nodes [nodeName] [key]=[value]:[effect]
# 节点说明中,查找 Taints 字段
kubectl describe pod pod-name
# 查看节点的污点信息
kubectl describe nodes [nodeName] |grep -E '(Taints)'
# 去除污点
kubectl taint nodes [nodeName] [key]:[effect]-
  • effect的选项

    参数 作用
    NoSchedule 表示 k8s 将不会将 Pod 调度到具有该污点的 Node 上
    PreferNoSchedule 表示 k8s 将尽量避免将 Pod 调度到具有该污点的 Node 上
    NoExecute 表示 k8s 将不会将 Pod 调度到具有该污点的 Node 上,同时会将 Node 上已经存在的 Pod 驱逐出去

容忍(Tolerations)

设置了容忍的 Pod 将可以容忍污点的存在,可以被调度到存在污点的 Node 上

  • 添加污点

    1
    kubectl taint nodes vmware-112 cpu=err:NoExecute
  • yaml(pod.spec.tolerations)

    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    #deploy
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: web-demo-label
    namespace: dev
    spec:
    selector:
    # 匹配的标签
    matchLabels:
    # 匹配的key-value
    app: web-demo
    replicas: 1
    template:
    metadata:
    # 创建标签的名字
    labels:
    # 定义的标签key-value
    app: web-demo
    spec:
    nodeSelector:
    disktype: ssd # 选择node标签为disktype: ssd的机器
    tolerations: # 容忍的污点设置
    - key: cpu # 污点的key
    operator: Equal
    value: err # 污点的value
    effect: NoExecute # 污点的effect
    tolerationSeconds: 3600 #当 Pod 需要被驱逐时可以在 Pod 上继续保留运行的时间
    containers:
    - name: web-demo
    image: tomcat:8-slim
    ports:
    - containerPort: 8080
    ---
    #service
    apiVersion: v1
    kind: Service
    metadata:
    name: web-demo
    namespace: dev
    spec:
    ports:
    - port: 8080
    protocol: TCP
    targetPort: 8080
    selector:
    # service选择带有app: web-demo标签的pod
    app: web-demo
    type: ClusterIP

    ---
    #ingress
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
    name: web-demo
    namespace: dev
    spec:
    rules:
    - host: web-dev.chclabel.com
    http:
    paths:
    - path: /
    backend:
    serviceName: web-demo
    servicePort: 8080
  • 注意点

    1. 其中key, vaule, effect要与 Node 上设置的 taint 保持一致
    2. operator 的值为 Exists 将会忽略 value 值
    3. tolerationSeconds 用于描述当 Pod 需要被驱逐时可以在 Pod 上继续保留运行的时间
  • 当不指定 key 值时,表示容忍所有的污点 key:

    1
    2
    tolerations:
    - operator: Exists
  • 当不指定 effect 值时,表示容忍所有的污点作用

    1
    2
    3
    tolerations:
    - key: key
    operator: Exists
  • 有多个 Master 存在时,防止资源浪费,可以如下设置

    1
    kubectl taint nodes Node-Name node-role.kubernetes.io/master=:PreferNoSchedule

    配置的意思:尽可能不要在master节点部署pod

    也就是当worker节点资源不足时,就可以在master节点部署pod

  • 污点的应用场景

    1. 当某个worker节点需要停止下来时,可以使用污点将所有的pod驱离
    2. 某个节点的机器性能弱时,可以使用污点尽量不让pod部署进来