kubernetes默認情況下創建pod調度是由kubernetes scheduler來管理的,但顯然有時候還是需要人為介入。根據目前的kubernetes版本來說,有兩種自定義資源調度的方式:Node和Pod。
實例label配置:
10-19-53-145 node=node01
10-19-152-121 node=node02
10-19-25-188 node=node03
一.Node資源調度
Node資源調度又分為兩種:1.通過NodeSelector選擇label指定到相應的node節點。2.Node的親和性(nodeAffinity)
1.NodeSelector的原理是通過在node節點創建對應的label,然后直接創建分配pod。通過命令賦予node節點lable的key和value,然后kubectl get nodes --show-labels查看具體效果。
kubectl label node nodename key=value
使用創建了goweb-4.yaml文件使用NodeSelector選擇到指定的node01。
apiVersion: apps/v1
kind: Deployment
metadata:
name: goweb-4
spec:
selector:
matchLabels:
app: goweb-4
replicas: 1
template:
metadata:
labels:
app: goweb-4
spec:
containers:
- image: harbor.yanjiyou.net/yjy/goweb:v1.1
name: goweb-4
ports:
- containerPort: 8000
nodeSelector:
node: node01
NodeSelector只是最簡單的調度使用,顯然還不能完全滿足額外的需求。
2.Node的親和性(affinity)可以更加靈活選擇的node調度,其中涉及到兩個容易混淆的參數requiredDuringSchedulingIgnoredDuringExecution和preferredDuringSchedulingIgnoredDuringExecution,最為簡單的理解就是必要硬件條件,非必要軟性條件,只要在滿足硬性條件下才能執行軟性條件。
使用創建了goweb-5.yaml文件選擇不在node02調度,盡量在node03上進行資源調度。
apiVersion: apps/v1
kind: Deployment
metadata:
name: goweb-5
spec:
selector:
matchLabels:
app: goweb-5
replicas: 2
template:
metadata:
labels:
app: goweb-5
spec:
containers:
- image: harbor.yanjiyou.net/yjy/goweb:v1.1
name: goweb-5
ports:
- containerPort: 8000
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: node
operator: NotIn
values:
- node02
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: node
operator: In
values:
- node03
①key和values需要提前指定
②operator有In和NotIn參數,指定和非指定到某個節點
二.Pod資源調度
和node節點的資源調度一樣pod資源調度也是親和性(podAffinity)和反親和性(podAntiAffinity)的管理方式,只是管理的范圍不同,一個是面向node資源管理,一個是面向pod資源管理。
使用創建了goweb-6.yaml文件選擇和goweb-4容器在同一個節點上。
apiVersion: apps/v1
kind: Deployment
metadata:
name: goweb-6
spec:
selector:
matchLabels:
app: goweb-6
replicas: 2
template:
metadata:
labels:
app: goweb-6
spec:
containers:
- image: harbor.yanjiyou.net/yjy/goweb:v1.1
name: goweb-6
ports:
- containerPort: 8000
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- goweb-4
topologyKey: kubernetes.io/hostname
topologyKey可以設置成如下幾種類型
kubernetes.io/hostname#同個Node
failure-domain.beta.kubernetes.io/zone#同個Zone
failure-domain.beta.kubernetes.io/region #同個Region
補充:
1.使用親和性后可以同理使用反親和性,結果取相反。
2.Taints和tolerations特殊用法:如果一個節點被標記為taints,除非pod配置了tolerations,否則是不會被允許調度。在生產環境如果master也作為work節點的話,可以把master標記Taints,畢竟master運行kubernetes系統組件,如果運行pod容易把資源耗盡,造成master節點崩潰,當然后期如果要添加額外的系統組件,這時就可以通過給對應的pod配置toleration。
kubectl taint nodes nodename key=value:NoSchedule
value參數可以配置多個值
NoSchedule:不能調度,當之前調度的不管。
PreferNoSchedule:盡量不調度。
NoExecute:不能調度,而且之前已經調度上去的也會自動遷移走。
apiVersion: apps/v1
kind: Deployment
metadata:
name: goweb-7
spec:
selector:
matchLabels:
app: goweb-7
replicas: 2
template:
metadata:
labels:
app: goweb-7
spec:
containers:
- image: harbor.yanjiyou.net/yjy/goweb:v1.1
name: goweb-7
ports:
- containerPort: 8000
tolerations:
- key: "key"
operator: "Equal"
value: "value"
effect: "NoSchedule