歡迎訪問我的GitHub
這里分類和匯總了欣宸的全部原創(chuàng)(含配套源碼):https://github.com/zq2599/blog_demos
本篇概覽
- 本文是欣宸在學習Kubernetes調度器的過程中,對親和性相關知識點的整理和總結,這是一篇筆記性質的博客
kubernetes默認調度器的調度過程:
- 調度過程如下:
- 預選(Predicates)
- 優(yōu)選(Priorities)
- 選定(Select)
親和性一覽
- 這里將親和性先分類,便于理解
節(jié)點親和性和pod親和性的區(qū)別
- 舉個例子,假設給小明分配班級(小明是pod,班級是節(jié)點)
-
節(jié)點親和性:直接告訴小明,你去一年級
-
pod親和性:從小朋友中找出和小明同年的,找到了小張,發(fā)現(xiàn)小張是一年級的,于是讓小明去一年級
節(jié)點親和性:硬親和性
-
requiredDuringSchedulinglgnoredDuringExecution:用于定義節(jié)點硬親和性
-
nodeSelectorTerm:節(jié)點選擇器,可以有多個,之間的關系是邏輯或,即一個nodeSelectorTerm滿足即可
-
matchExpressions:匹配規(guī)則定義,多個之間的關系是邏輯與,即同一個nodeSelectorTerm下所有matchExpressions定義的規(guī)則都匹配,才算匹配成功
-
示例:
apiVersion: v1
kind: Pod
metadata:
name: with-required-nodeaffinity
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- {key: zone, operator: In, values: ["foo"]}
containers:
- name: nginx
image: nginx
- 功能與nodeSelector類似,用的是匹配表達式,可以被理解為新一代節(jié)點選擇器
- 不滿足硬親和性條件時,pod為Pending狀態(tài)
- 在預選階段,節(jié)點硬親和性被用于預選策略MatchNodeSelector
節(jié)點親和性:軟親和性
-
特點:條件不滿足時也能被調度
-
示例:
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deploy-with-node-affinity
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
name: nginx
labels:
app: nginx
spec:
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 60
preference:
matchExpressions:
- {key: zone, operator: In, values: ["foo"]}
- weight: 30
preference:
matchExpressions:
- {key: ssd, operator: Exists, values: []}
containers:
- name: nginx
image: nginx
- 集群中的節(jié)點,由于標簽不同,導致的優(yōu)先級結果如下:
-
在優(yōu)選階段,節(jié)點軟親和性被用于優(yōu)選函數(shù)NodeAffinityPriority
-
注意:NodeAffinityPriority并非決定性因素,因為優(yōu)選階段還會調用其他優(yōu)選函數(shù),例如SelectorSpreadPriority(將pod分散到不同節(jié)點以分散節(jié)點故障導致的風險)
-
pod副本數(shù)增加時,分布的比率會參考節(jié)點親和性的權重
Pod親和性(podAffinity)
-
如果需求是:新增的pod要和已經存在pod(假設是A)在同一node上,此時用節(jié)點親和性是無法完成的,因為A可能和節(jié)點沒啥關系(可能是隨機調度的),此時只能用pod親和性來實現(xiàn)
-
pod親和性:一個pod與已經存在的某個pod的親和關系,需要通過舉例來說明
- 創(chuàng)建一個deployment,這個pod有標簽app=tomcat:
kubectl run tomcat -l app=tomcat --image tomcat:alpine
- 創(chuàng)建pod,需求是和前面的pod在一起,使用pod親和性來實現(xiàn):
apiVersion: v1
kind: Pod
metadata:
name: with-pod-affinity-1
spec:
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- {key: app, operator: In, values: ["tomcat"]}
topologyKey: kubernetes.io/hostname
containers:
- name: nginx
image: nginx
- 調度邏輯:
- 表面上看,最終只是根據hostname去調度的,但如果topologyKey的值是多個節(jié)點所擁有的,就更有通用性了,如下圖,topologyKey等于filure-domain.beta.kubernetes.io/zone:
文章來源:http://www.zghlxwxcb.cn/news/detail-585420.html
- 硬親和:requiredDuringSchedulingIgnoredDuringExecution
- 軟親和:preferredDuringSchedulingIgnoredDuringExecution
Pod反親和(podAntiAffinity)
- 與親和性相反,將當前pod調度到滿足匹配條件之外的節(jié)點上
- 適用場景:
- 分散同一類應用
- 將不同安全級別的pod調度至不同節(jié)點
- 示例如下,匹配表達式和自身標簽一致,作用是分散同一類應用,讓相同pod不要調度到同一個節(jié)點:
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-with-pod-anti-affinity
spec:
replicas: 4
selector:
matchLabels:
app: myapp
template:
metadata:
name: myapp
labels:
app: myapp
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- {key: app, operator: In, values: ["myapp"]}
topologyKey: kubernetes.io/hostname
containers:
- name: nginx
image: nginx
- 如果集群中只有三個節(jié)點,那么執(zhí)行上述yaml的結果就是最多創(chuàng)建三個pod,另一個始終處于pending狀態(tài)
參考
- 本篇筆記參考了以下文章,兩張圖片也來自該文章,致敬作者山山仙人博客
- https://www.ssgeek.com/post/kubernetes-pod-diao-du-zhi-qin-he-xing-diao-du/
歡迎關注博客園:程序員欣宸
學習路上,你不孤單,欣宸原創(chuàng)一路相伴...文章來源地址http://www.zghlxwxcb.cn/news/detail-585420.html
到了這里,關于Kubernetes親和性學習筆記的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!