kubernetes云原生纪元:一次性搞懂Scheduler 服务调度(下)
续 一次性搞懂Scheduler 服务调度(上)
文章目录
2. pod 亲和性
一个区域内,一个pod和其他pod亲和关系,比如想跟某些pod运行在一起,不想跟某些pod运行在一起,pod和pod之间的亲和关系.
配置
-
affinity: #亲和性
-
podAffinity: #pod亲和性
-
requiredDuringSchedulingIgnoredDuringExecution: #必须匹配满足下面的条件才能满足
-
labelSelector:
matchExpressions: #匹配条件
key: app # app in(web-demo) 想跟key=app的包含web-demod的pod运行在一起
operator: In
values:
web-demo -
topologyKey: kubernetes.io/hostname #节点上label的名字 每个节点的主机名,限制范围是节点范围条件,组合在一起就是:想跟key=app的包含web-demod的pod运行在同一台主机上
-
preferredDuringSchedulingIgnoredDuringExecution: #可以满足下面条件,不是必须
-
podAffinityTerm: #可以多个,
labelSelector:
matchExpressions: # 匹配条件:最好 可以跟key=app 的包含web-demo-node 的pod运行在一台主机
key: app
operator: In
values:
web-demo-node
topologyKey: kubernetes.io/hostname有些值与上个章节 相同这里不描述
affinity: #亲和性
podAffinity: #pod亲和性
requiredDuringSchedulingIgnoredDuringExecution: #必须匹配满足下面的条件才能满足
- labelSelector:
matchExpressions: #匹配条件
- key: app # app in(web-demo) 想跟key=app的包含web-demod的pod运行在一起
operator: In
values:
- web-demo
topologyKey: kubernetes.io/hostname #节点上label的名字 每个节点的主机名,限制范围是节点范围条件,组合在一起就是:想跟key=app的包含web-demod的pod运行在同一台主机上
preferredDuringSchedulingIgnoredDuringExecution: #可以满足下面条件,不是必须
- podAffinityTerm: #可以多个,
labelSelector:
matchExpressions: # 匹配条件:最好 可以跟key=app 的包含web-demo-node 的pod运行在一台主机
- key: app
operator: In
values:
- web-demo-node
topologyKey: kubernetes.io/hostname
weight: 100 #权重
完整配置如下:
Web-dev-pod.yaml
#deploy
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-demo
namespace: dev
spec:
selector:
matchLabels:
app: web-demo
replicas: 1
template:
metadata:
labels:
app: web-demo
spec:
containers:
- name: web-demo
image: hub.zhang.com/kubernetes/demo:2020011512381579063123
ports:
- containerPort: 8080
affinity: #亲和性
podAffinity: #pod亲和性
requiredDuringSchedulingIgnoredDuringExecution: #必须匹配满足下面的条件才能满足
- labelSelector:
matchExpressions: #匹配条件
- key: app # app in(web-demo) 要跟key=app的包含web-demod的pod运行在一起
operator: In
values:
- web-demo
topologyKey: kubernetes.io/hostname #节点上label的名字 每个节点的主机名,限制范围是节点范围条件,组合在一起就是:要跟key=app的包含web-demod的pod运行在同一台主机上
preferredDuringSchedulingIgnoredDuringExecution: #可以满足下面条件,不是必须
- podAffinityTerm:
labelSelector:
matchExpressions: # 匹配条件:最好 可以跟key=app 的包含web-demo-node 的pod运行在一台主机
- key: app
operator: In
values:
- web-demo-node
topologyKey: kubernetes.io/hostname
weight: 100 #权重
---
#service
apiVersion: v1
kind: Service
metadata:
name: web-demo
namespace: dev
spec:
ports:
- port: 80
protocol: TCP
targetPort: 8080
selector:
app: web-demo
type: ClusterIP
---
#ingress
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: web-demo
namespace: dev
spec:
rules:
- host: web.demo.com
http:
paths:
- path: /
backend:
serviceName: web-demo
servicePort: 80
我们创建一下:
发现他被创建到121因为121上有给pod的label是app=web-demo,符合我们的预期。
我们可以测试一下把条件换成其他的,还会不会创建服务成功,这里就不测试了。
3. Pod反亲和性
pod反亲和性和Pod亲和性可以配置到一起的,他的工作原理正好跟Pod亲和性相反,很容易理解。
理解pod反亲和性 必须理解Pod亲和性,这里多余参数不多说跟Pod亲和性的参数一直,但是在
要
的基础上变成了不要
- ==podAntiAffinity: ===# 反亲和性
具体配置如下:
affinity: #亲和性
podAntiAffinity: # 反亲和性
requiredDuringSchedulingIgnoredDuringExecution: #必须匹配满足下面的条件才能满足
- labelSelector:
matchExpressions: #匹配条件
- key: app # app in(web-demo) 不想跟key=app的包含web-demod的pod运行在一起
operator: In
values:
- web-demo
topologyKey: kubernetes.io/hostname #节点上label的名字 每个节点的主机名,限制范围是节点范围条件,组合在一起就是:想跟key=app的包含web-demod的pod运行在同一台主机上
preferredDuringSchedulingIgnoredDuringExecution: #可以满足下面条件,不是必须
- podAffinityTerm:
labelSelector:
matchExpressions: # 匹配条件:最好不要 可以跟key=app 的包含web-demo-node 的pod运行在一台主机
- key: app
operator: In
values:
- web-demo-node
topologyKey: kubernetes.io/hostname
weight: 100 #权重
具体配置:
web-dev-pod.yaml
#deploy
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-demo
namespace: dev
spec:
selector:
matchLabels:
app: web-demo
replicas: 1
template:
metadata:
labels:
app: web-demo
spec:
containers:
- name: web-demo
image: hub.zhang.com/kubernetes/demo:2020011512381579063123
ports:
- containerPort: 8080
affinity: #亲和性
podAntiAffinity: # 反亲和性
requiredDuringSchedulingIgnoredDuringExecution: #必须匹配满足下面的条件才能满足
- labelSelector:
matchExpressions: #匹配条件
- key: app # app in(web-demo) 想跟key=app的包含web-demod的pod运行在一起
operator: In
values:
- web-demo
topologyKey: kubernetes.io/hostname #节点上label的名字 每个节点的主机名,限制范围是节点范围条件,组合在一起就是:想跟key=app的包含web-demod的pod运行在同一台主机上
preferredDuringSchedulingIgnoredDuringExecution: #可以满足下面条件,不是必须
- podAffinityTerm:
labelSelector:
matchExpressions: # 匹配条件:最好 可以跟key=app 的包含web-demo-node 的pod运行在一台主机
- key: app
operator: In
values:
- web-demo-node
topologyKey: kubernetes.io/hostname
weight: 100 #权重
---
#service
apiVersion: v1
kind: Service
metadata:
name: web-demo
namespace: dev
spec:
ports:
- port: 80
protocol: TCP
targetPort: 8080
selector:
app: web-demo
type: ClusterIP
---
#ingress
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: web-demo
namespace: dev
spec:
rules:
- host: web.demo.com
http:
paths:
- path: /
backend:
serviceName: web-demo
servicePort: 80
我们创建下:
[root@master-001 ~]# kubectl apply -f web-dev-pod.yaml -n dev
没有问题他正确的运行在有pod标签为app=web-demo的机器上了
还有一种问题就是,他不想跟自己运行在一台机器:
假设因为自己标签配置上app=web-demo-pod 而反亲和性配置的同样的标签,然后把副本数改两个
我们创建一下:
发现他在120创建一个121创建一个。当我们有些服务不想让他跑在同一台机器上,我就可以使用这种设置。
相反我们想把一样的服务跑在同一台机器上,就可以改成podiAffinity:发现创建不成功,因为我们之前创建过podAntiAffinity的又没有其他机器 所有就僵住了
4. taint污点&&Toleration容忍
它跟podiAffinitypod亲和性相反,他说拒绝node pod的运行,可以在node上设置一个或多个污点,拒绝pod运行在这个机器上,除非某些pod 明确声明可以容忍
这些污点,否则它是不可能运行在当前机器的。
这种场景比如,某几台机器专门单独给某些类型或者某几个应用进行使用,我们就可以在机器上打一个污点,其他pod在正常调度的时候就不可能被调度上来,只有这些特色的pod才能调度上来。在比如某些机器的硬件CPU ssd非常少不想给一般的pod使用。给他打上污点,需要用这些pod的设备,配置上污点容忍就可以。
给node打污点
. node打上污点方法 的三种类型以及介绍
kubectl taint nodes node1 key=value:NoSchedule
kubectl taint nodes node1 key=value:NoExecute
kubectl taint nodes node1 key=value:PreferNoSchedule
NoSchedule:K8Snode添加这个effecf类型污点,新的不能容忍的pod不能再调度过来,但是老的运行在node上不受影响
NoExecute:K8Snode添加这个effecf类型污点,新的不能容忍的pod不能调度过来,老的pod也会被驱逐
PreferNoSchedule:pod会尝试将pod分配到该节点
node删除污点
在污点类型后加上-
kubectl taint nodes kube11 key:NoSchedule-
通过kubectl taint 为一个节点打污点例如:
kubectl taint nodes node1 key=value:NoSchedule
[root@master-001 ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
master-001 Ready master 18d v1.16.3
node-001 Ready <none> 18d v1.16.3
[root@master-001 ~]# kubectl taint nodes node-001 gpu=true:NoSchedule
node/node-001 tainted
这样就把键为gpu
,值为true
,效果为NoSchedule
的污点添加到了节点node-001
上.这样除非pod有符合的容忍(toleration),否则不会被调度到此节点上
除了NoSchedule
(不要把这样的pod)到这个节点这样的污点类型,还有 PreferNoSchedule
(最好不要把这样的pod调度到这个节点),还有一种更严格的 NoExecute
(除了必须不调度之外,如果已经有这样的pod运行在这样的节点上了,会把pod去除掉,没有设置容忍时间就会立刻马上去除掉)
pod设置容忍
配置tolerations容忍需要在yaml配置文件配置跟containers同级
容忍条件解释:当gpu=true 的时候我容忍这个污点可以把pod运行在这个节点
注意:容忍污点后是可以运行这个节点上,但是不是说必须运行在这个节点上
tolerations: # 容忍 容忍条件解释:当gpu=true 的时候我容忍这个污点
- key: "gpu"
operator: "Equal" #Equal相等的意思
value: "true"
effect: "Noschedule"
完整配置
#deploy
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-demo
namespace: dev
spec:
selector:
matchLabels:
app: web-demo
replicas: 1 #两个实例
template:
metadata:
labels:
app: web-demo-pod
spec:
containers:
- name: web-demo
image: hub.zhang.com/kubernetes/demo:2020011512381579063123
ports:
- containerPort: 8080
tolerations: # 容忍 容忍条件解释:当gpu=true 的时候我容忍这个污点
- key: "gpu"
operator: "Equal" #Equal相等的意思
value: "true"
effect: "Noschedule"
.......