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"
.......