調度規則
deployment全自動調度: 運行在哪個節點上完全由master的scheduler經過一系列的算法計算得出, 用戶無法進行干預
nodeselector定向調度: 指定pod調度到一些node上, 通過設置node的標簽和deployment的nodeSelctor屬性相匹配
多個node有相同標簽, scheduler 會選擇一個可用的node進行調度
nodeselector定義的標簽匹配不上任何node上的標簽, 這個pod是無法調度
k8s給node預定義了一些標簽, 通過kubectl describe node xxxx進行查看
用戶可以使用k8s給node預定義的標簽
NodeAffinity: node節點親和性
硬限制 : 必須滿足指定的規則才可以調度pod到node上
軟限制 : 優先滿足指定規則,調度器會嘗試調度pod到node上, 但不強求
PodAffinity: pod親和與互斥調度, 根據在節點上正在運行的pod標簽而不是節點的標簽進行判斷和調度
親和: 匹配標簽兩個pod調度到同一個node上
互斥: 匹配標簽兩個pod不能運行在同一個node上
nodeselector定向調度
- 給目標node打上一些標簽
kubectl label nodes <node-name> <label-key>=<label-value>
kubectl label nodes 192.168.1.62 disk=ssd
- 在pod的定義加上nodeSelector設置
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 1
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.11
ports:
- containerPort: 80
nodeSelector:
disk: ssd

如果給多個node都定義了相同的標簽, 則調度器會根據調度算法從這組node中挑選一個可用的node進行pod調度
如果指定了pod的nodeSelector條件, 且集群中不存在包含響應標簽的Node, 則即使在集群中還有其它可供使用的Node,這個pod也無法被成功調度
用戶可以自行給node添加標簽, kubernetes也會給node預定義一些標簽, 可以通過kubectl describe node
Labels: beta.kubernetes.io/arch=amd64
beta.kubernetes.io/os=linux
disk=ssd
kubernetes.io/hostname=192.168.1.62
uploading-image-951691.png
NodeAffinity
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 4
template:
metadata:
labels:
app: nginx
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: beta.kubernetes.io/arch
operator: In
values:
- amd64
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: disk
operator: In
values:
- ssd
containers:
- name: nginx
image: nginx:1.11
ports:
- containerPort: 80
requiredDuringSchedulingIgnoredDuringExecution: 硬限制, 要求只運行在amd64的節點上
preferredDuringSchedulingIgnoredDuringExecution: 軟限制, 盡量運行在磁盤類型ssd的節點上
PodAffinity: pod親和性調度
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment-test1
spec:
selector:
matchLabels:
app: nginx-test1
replicas: 1
template:
metadata:
labels:
app: nginx-test1
security: s1
spec:
containers:
- name: nginx
image: nginx:1.11
ports:
- containerPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment-test2
spec:
selector:
matchLabels:
app: nginx-test2
replicas: 4
template:
metadata:
labels:
app: nginx-test2
security: s1
spec:
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- nginx-test1
topologyKey: kubernetes.io/hostname
containers:
- name: nginx
image: nginx:1.11
ports:
- containerPort: 80

