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
文章评论