首页 > 技术文章 > k8s基础概念之九 Affinity

RRecal 2021-12-16 18:10 原文

官方建议:如果节点超过1000不建议用Affinity,因为调度计算会消耗大量时间,当然官方也有优化方案

 

节点亲和力

NodeAffinity:节点亲和力
requiredDuringSchedulingIgnoredDuringExecution: 硬亲和力,即支持必须部署在指定的节点上,也支持必须不部署在指定节点上
preferredDuringSchedulingIgnoredDuringExecution: 软亲和力,尽量部署在满足条件的节点上,或者是尽量不用部署在被匹配的节点上

 

pod亲和力

A应用  B应用   C应用,将a应用根据某种策略部署在一块
    requiredDuringSchedulingIgnoredDuringExecution: 将a应用和b应用部署在一块
    preferredDuringSchedulingIgnoredDuringExecution:  尽量将a应用和b应用部署在一块

 

podAntiAffinity:pod反亲和力

requiredDuringSchedulingIgnoredDuringExecution: 不要将a应用与之匹配的应用部署在一块
preferredDuringSchedulingIgnoredDuringExecution: 尽量不要将a应用与之匹配的应用部署在一块

 

NodeAffinity简单使用

#匹配表达式:In:等于    Gt:大于        Lt:小于    number:不能为字符串

kubectl label nodes node01 disktype=ssd
kubectl label nodes node02 disktype=ssd
kubectl label nodes node01 processor=gpu

apiVersion: v1 kind: Pod metadata: name: nginx
-gpu spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: #必须满足 nodeSelectorTerms: - matchExpressions: #下面这些条件是可以单独拿出来匹配出目标 - key: disktype #标签disktype operator: In #等于 values: - ssd # ssd preferredDuringSchedulingIgnoredDuringExecution: #尽量满足 - weight: 1 preference: matchExpressions: - key: processor #labels key operator: In #等于 values: - gpu # gpu containers: - name: nginx image: nginx imagePullPolicy: IfNotPresent

 

pod亲和力和反亲和力

#pod亲和力
kubectl label pod bosybox meme=bus #给需要绑定的pod加个唯一标签

---
apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
#把改实例和kube-systemnamespaces下符合的albel为k8s-calico-kube-controllers的pod部署在同一个节点(拓扑域)上
  affinity:
    podAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: meme
            operator: In
            values:
            - bus  
#如果写了namespaces但是留空,他是匹配所有namespace下的指定label的pod,如果写了那么namespaces指定了值,就是匹配指定namespaces下单指定labels的pod
        namespaces:
          - kube-system
        topologyKey: kubernetes.io/hostname
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
    
---
……
spec:
  affinity:
    podAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: k8s-con
            operator: In
            values:
            - calico
        
  containers:
  
---

#反亲和力
apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  affinity:
    podAntiAffinity:        #就这里加了个Anti
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: meme
            operator: In
            values:
            - bus  
        namespaces:
          - kube-system
        topologyKey: kubernetes.io/hostname
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent

#就是尽量不部署在同一个服务器上

 

推荐阅读