19、k8s-pod调度-自动调度、定向调度、亲和性调度
概念:在默认请款下、一个pod在哪个节点上运行、是由Scheduler组件采用相应的算法计算出来的、这个过程是不受人为控制的。
kubernetes提供了四种调度方式:
·自动调度:由Scheduler来计算pod运行在哪个节点上(默认的)
·定向调度:由人为定义的NodeName、NodeSelector来决定 (如pod1上贴上NodeName1、node1节点上也贴上了相同的NodeName1、那么pod1就会定向的运行在node1节点上)
·亲和性调度:由人为定义的pod1与pod2(pod2运行在node2节点上)比较亲和所以pod1也会运行在node2节点上:NodeAffinity、PodAffinity、PodAffinity
·污点(容忍):污点是对于node节点来说(如node1有污点那么就拒绝pod在node1上运行)、而容忍对于pod来说(pod可以容忍node1的污点,那么pod也可以在node1上运行):Taints、Toleration
1、定向调度:
#nodeName:基于node节点的名字去调度
#指的是利用在pod上声明nodeName或者nodeSelector、以此将pod调度到期望的node节点上、注意这里的调度是强制的、即使要调度的node节点不存在也会强制调度、不过pod会运行失败
NodeName:
·用于强制约束将pod调度到指定名字的node节点上、这种方式直接跳过了scheduler的调度逻辑、直接将pod调度到指定的node节点上
实例:=================================
1、创建yaml文件:vim pod-nodename.yaml
-----------------------------------------------------------
apiVersion: v1
kind: Pod
metadata:
name: pod-nodename
namespace: dev
spec:
containers: #pod的属性
- name: nginx
image: nginx:1.17.1
ports:
- name: nginx-port
containerPort: 80
nodeName: node-1 #指定调度到node-1节点上(pod的属性) node-1是节点名
------------------------------------------------------------------------
2、kubectl create -f pod-nodename.yaml
3、查看pod:kubectl get pod -ndev -o wide
#nodeSelector:基于node的标签去调度
1、给node-1节点打上标签:kubectl label nodes node-1 nodeenv=pro
2、查看node标签:kubectl get nodes --show-labels
3、创建yaml文件:vim pod-nodeselector.yaml
----------------------------------------------------------
apiVersion: v1
kind: Pod
metadata:
name: pod-nodeselector
namespace: dev
spec:
containers:
- name: nginx
image: nginx:1.17.1
ports:
- name: nginx-port
containerPort: 80
protocol: TCP
nodeSelector:
nodeenv: pro #指定调度到具有nodeenv=pro标签的node节点上
-----------------------------------------------------------------------
4、执行:kubectl create -f pod-nodeselector.yaml
5、查看pod运行的节点:kubectl get pod pod-nodeselector -ndev -o wide
==================================================亲和性调度==================================================
#亲和性调度:
·NodeAffinity(主要基于与node和pod的亲和性来调度)
Affinity主要分为三类:
·nodeAffinity(node亲和性):以node为目标、解决pod可以调度到哪些node的问题
·podAffinity(pod亲和性):以pod为目标、解决pod可以和哪些已存在的pod部署在同一个拓扑域中的问题
·podAntiAffinity(pod反亲和性):以pod为目标、解决pod不能和哪些已存在pod部署在同一个拓扑域中的问题
场景应用:
·亲和性:如果两个应用频繁交互、那就有必要利用亲和性让两个应用尽可能的靠近、这要做可以减少因网络通信而带来的性能损耗
反亲和性:当应用的采用多副本部署时、有必要采用反亲和性让各各应用实例打散分布在各个node上、这样可以提高服务的高可用性
1、NodeAffinity(node亲和性)
·可配置项1-硬限制
spec:
containers:
....
affinity: #亲和性设置
nodeAffinity: #设置node亲和性
requiredDuringSchedulingIgnoredDuringExecution: #设置硬限制条件(x下面的所有条件必须满足才能调度到相应的node上)
nodeSelectorTerms: #节点选择列表
- matchExpressions: #(按节点标签列出的节点选择器要求列表)匹配env的值在["xxx","yyy"]中的标签
- key: nodeenv #nodeenv 为标签名
operator: In #关系符:Exists(存在)、DoesNotExist(不存在)、In(包含)、NotIn(不在...范围)、Gt(大于)、Lt(小于)
values: ["xxx","yyy"]
·可配置项1-软限制
spec:
containers:
....
affinity: #亲和性设置
nodeAffinity: #设置node亲和性
preferredDuringSchedulingIgnoredDuringExecution: #设置硬限制条件(x下面的所有条件必须满足才能调度到相应的node上)
preference: #一个节点选择器、与相应的的权重相关联
- matchExpressions: #(按节点标签列出的节点选择器要求列表)匹配env的值在["xxx","yyy"]中的标签
- key: nodeenv #nodeenv 为标签名
operator: In
values: ["xxx","yyy"]
weigh #倾向权重、范围在1-100
实例:
#1、硬限制
·创建yaml文件:vim pod-nodeaffinity-re.yaml
===========================================================================
apiVersion: v1
kind: Pod
matedata:
name: pod-nodeaffinity-re
namespace: dev
spec:
containers:
- name: nginx
image: nginx:1.17.1
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions: #意思就是:这个pod要调度到匹配 标签名为nodeenv的 、标签值在要么是xxx、要么是yyy的node节点上
- key: nodeenv
operator: In
values: ["xxx","yyy"] #key=xxx 或key=yyy
===================================================================
·创建pod:kubectl create -f pod-nodeaffinity-re.yaml
·查看pod创建过程中详细信息:kubectl describe pod pod-nodeaffinity-re -ndev
@Warning FailedScheduling 31s default-scheduler 0/2 nodes are available: 2 node(s) didn't match node selector.
@发现在node节点中没有符合要求的node节点
@将xxx改为存在的标签值 pro即可将pod创建出来
#2、软限制
·创建yaml文件:vim pod-nodeaffinity-pre.yaml
====================================================================================
apiVersion: v1
kind: Pod
metadata:
name: pod-nodeaffinity-pre
namespace: dev
spec:
containers:
- name: nginx
image: nginx:1.17.1
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: nodeenv
operator: In
values: ["pro","yyy"]
======================================================================
·创建pod:kubectl create -f pod-nodeaffinity-pre.yaml
#PodAffinity(Pod的亲和性调度)
Pod亲和性的配置:
#硬限制
spec:
containers:
....
affinity: #亲和性设置
podAffinity: #设置node亲和性
requiredDuringSchedulingIgnoredDuringExecution: #设置硬限制条件(x下面的所有条件必须满足才能调度到相应的node上)
namespaces: #指定参照pod的namespace
topologyKey: #指定调度作用域
labelSelector: #标签选择器
matchExpression: #按节点标签列出节点选择器要求列表(推荐)
- key: nodeenv #nodeenv 为标签名
operator: In #关系符:Exists(存在)、DoesNotExist(不存在)、In(包含)、NotIn(不在...范围)、Gt(大于)、Lt(小于)
values: ["xxx","yyy"]
matchLabels: #指多个matchExpression映射的内容
·可配置项1-软限制
spec:
containers:
....
affinity: #亲和性设置
podAffinity: #设置node亲和性
preferredDuringSchedulingIgnoredDuringExecution: #设置硬限制条件(x下面的所有条件必须满足才能调度到相应的node上)
podAffinityTerm: #选项
namespaces:
topologyKey:
labelSelector:
matchExpressions: #(按节点标签列出的节点选择器要求列表)匹配env的值在["xxx","yyy"]中的标签
key: nodeenv #nodeenv 为标签名
operator: In
values: ["xxx","yyy"]
weigh #倾向权重、范围在1-100
topologyKey:用于指定调度时作用域:
·如果指定为kubernetes.io/hostname 那就是以Node节点为区分范围
·如果指定为 beta.kubernetes.io/os 则以Node节点的操作系统的类型来区分
-------------------------
实例:
#1、先创建一个pod,用于参照
·创建pod的yaml文件:vim pod-podaffinity-target.yaml
-----------------------------------------------------
apiVersion: v1
kind: Pod
metadata:
name: pod-podaffinity-target
namespace: dev
labels:
podenv: pro #设置标签
spec:
containers:
- name: nginx
image: nginx:1.17.1
nodeName: node-1 #将pod放在node-1节点上
------------------------------------------------------------
·创建pod:kubectl create -f pod-podaffinity-target.yaml
·查看pod信息: kubectl get pod pod-podaffinity-target -ndev -o wide --show-labels
#2、创建pod的硬限制pod
·创建yaml文件:vim pod-podaffinity-req.yaml
-------------------------------------------------------
apiVersion: v1
kind: Pod
metadata:
name: pod-podaffinity-req
namespace: dev
spec:
containers:
- name: nginx
image: nginx:1.17.1
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution: #硬限制
- labelSelector:
matchExpression: #匹配标签
- key: podenv
operator: In
values: ["pro","xxx"]
topologyKey: kubernetes.io/hostname
--------------------------------------------------------------------------------
·创建pod:kubectl create -f pod-podaffinity-req.yaml
·查看pod的详细信息:kubectl get pod pod-podaffinity-req -ndev -o wide --show-labels
·将pod-podaffinity-req 这个pod调度到有这个标签的(poddev=pro)pod所在的同一个node节点上去
测试pod的反亲和性: