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