kube-scheduler 是 Kubernetes 集群的默認調度器; 在做調度決定時需要考慮的因素包括: 單獨和整體的資源請求煎娇、硬件/軟件/策略限制二庵、親和以及反親和要求、數據局域性缓呛、負載間 的干擾等等
一催享,指定nodeName
一,指定nodeName:(與containers同級別)
示例:
spec:
containers:
- name: nginx
image: nginx
nodeName: node1
1)如果節(jié)點沒有資源容納pod哟绊,則調度失敗
2)節(jié)點不存在因妙,調度失敗
二,nodeSelector
二票髓,nodeSelector(與containers同級別)
示例:
# 給node1打標簽
kubectl label nodes node1 disktype=ssd
#指定按照標簽選擇節(jié)點
spec:
containers:
- name: nginx
image: nginx
nodeSelector:
disktype: ssd
1) 如果沒有匹配到標簽會無法運行pod攀涵,pending狀態(tài)
2) 刪除node標簽不會影響已運行的pod,伸縮或者重新部署會pending
三洽沟,親和/反親和
(基于上面的nodeSelector擴展以故,nodeSelector匹配不到標簽會調度失敗,可以發(fā)現(xiàn)規(guī)則是“軟”/“偏好”裆操,而不是硬性要求怒详,因此,如果調度器無法滿足該要求踪区,仍然調度該pod)
節(jié)點親和
? requiredDuringSchedulingIgnoredDuringExecution 必須滿足
? preferredDuringSchedulingIgnoredDuringExecution 傾向滿足
? IgnoreDuringExecution 表示如果在Pod運行期間Node的標簽發(fā)生變化昆烁,導致 親和性策略不能滿足,則繼續(xù)運行當前的Pod缎岗。
nodeaffinity還支持多種規(guī)則匹配條件的配置:
? In: label 的值在列表內
? NotIn: label 的值不在列表內
? Gt: label 的值大于設置的值静尼,不支持Pod親和性 ? Lt:label 的值小于設置的值,不支持pod親和性 ? Exists:設置的label 存在
? DoesNotExist: 設置的 label 不存在
示例1: spec:
containers:
- name: nginx
image: nginx
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: disktype
operator: In
values:
- ssd
必須滿足,調度到標簽為disktype=ssd的節(jié)點上
示例2:
template:
metadata:
labels:
app: nginx
spec:
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- preference:
matchExpressions:
- key: disktype
operator: In
values:
- ssd
weight: 1
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostnme
operator: NotIn
values:
- cn-shanghai.192.168.50.27
1) 傾向滿足調度到鼠渺,標簽為disktype=ssd的節(jié)點上
2) 必須滿足蜗元,不調度在節(jié)點cn-shanghai.192.168.50.27上
示例3:
template:
metadata:
labels:
app: nginx
spec:
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- podAffinityTerm:
labelSelector:
matchExpressions:
- key: disktype
operator: In
values:
- ssd
topologyKey: kubernetes.io/hostname
weight: 100
反親和
不調度到,標簽為disktype=ssd的節(jié)點
四系冗,污點
# ? Taints(污點)是Node的一個屬性奕扣,設置了Taints后,所以Kubernetes是不會將 Pod調度到這個Node上的掌敬,
于是Kubernetes就給Pod設置了個屬性Tolerations(容忍)惯豆, 只要 Pod能夠容忍Node上的污點,那么Kubernetes就會忽略Node上的污點奔害,就能夠(不是必須)把Pod調度過去
tolerations中定義的key楷兽、value、effect华临,要與node上設置的taint保持一致:
? 如果 operator 是 Exists 芯杀,value可以省略。
? 如果 operator 是 Equal 雅潭,則key與value之間的關系必須相等揭厚。
? 如果不指定operator屬性,則默認值為Equal
還有兩個特殊值:
? 當不指定key扶供,再配合Exists 就能匹配所有的key與value 筛圆,可以容忍所有污點。 ? 當不指定effect 椿浓,則匹配所有的effect太援。
#必須滿足
# 添加污點
kubectl taint node node1 node-role.kubernetes.io/master:NoSchedule
#Toleration(容忍)
operator可以定義為:
Equal:表示key是否等于value,默認 Exists:表示key是否存在扳碍,此時無需定義value
tain 的 effect 定義對 Pod 排斥效果
NoSchedule:僅影響調度過程提岔,對現(xiàn)存的Pod對象不產生影響;
NoExecute:既影響調度過程,也影響顯著的Pod對象;不容忍的Pod對象將被驅逐
PreferNoSchedule: 表示盡量不調度
#示例1:
spec:
containers:
- name: myapp
image: myapp:v1
tolerations:
- effect: NoExecute
key: kafka
operator: Equal
value: kafkadaptation
#以上的配置容忍kafka=kafkadaptation笋敞,則打了污點的標簽可以調度(如果沒有這個配置的容器碱蒙,不可以被調度打了污點的節(jié)點上)
#示例2: containers:
- name: myapp
image: myapp:v1
tolerations:
- operator: "Exists"
effect: "NoSchedule"
tolerationSeconds: 6000(當 pod 需要被驅逐時,可以繼續(xù)在 node 上 運行的時間)
# 當不指定key液样,再配合Exists 就能匹配所有的key與value 振亮,可以容忍所有污點巧还。(容忍后有污點的節(jié)點都可以調度)
1)如果effect是NoSchedule(如上)鞭莽,則打了污點的NoSchedule節(jié)點也會被調度
2)如果effect是NoExecute,則打了污點的NoExecute節(jié)點可以被調度
3)如果不指定effect麸祷,則忽視所有污點澎怒,所有打了污點的標簽都可以被調度(如示例3)
#示例3:
containers:
- name: myapp
image: myapp:v1
tolerations:
- operator: "Exists"
# ? 當不指定effect ,則匹配所有的effect。即所有污點都會忽視
PS1:
如果想讓一個deployment不管有多少個pod都在一個節(jié)點上喷面,
tolerations:
- effect: NoExecute
key: wd
operator: Equal
value: wd
只能NoExecute才可以做到
PS2:
如果10個節(jié)點打了一樣的污點星瘾,有10個deployment需要在這10臺機器跑,并且各個服務之間的pod不能再用一個節(jié)點上(10個deployment各只有一個pod為例)
# 設置pod反親和
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: adaptor
operator: In
values:
- adaptor
topologyKey: kubernetes.io/hostname
containers:
... ...
resources:
requests:
cpu: 250m
memory: 64Mi
terminationGracePeriodSeconds: 30
# 增加容忍度
tolerations:
- effect: NoExecute
key: kafka
operator: Equal
value: kafkadaptation
volumes:
- hostPath:
path: /etc/localtime
type: ''
name: volume-localtime