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的反亲和性:
本文作者:littlecc
本文链接:https://www.cnblogs.com/littlecc/p/17639068.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步