6-2 nodeSelector, nodeName, node亲和与反亲和

文章目录

  • 前言
  • nodeSelector
  • nodeName
  • node affinity
    • 硬亲和
    • 软亲和
    • 反亲和
    • 亲和组合

前言

Pod在创建时,master会根据node节点物理机的状态,pod资源请求requests,淘汰掉不符合要求的node。剩下的node会根据评分机制选择最高分的。分数相同也会随机选一个。

在生产环境中,会根据实际需求人为干预调度过程。如指定创建在某个pod,或倾向创建在某些pod等。



nodeSelector

nodeSelector即节点选择器,事先为node打标签,然后选择拥有该标签的node进行调度。

查看node节点默认标签:

sudo kubectl describe node 192.168.100.156
Name: 192.168.100.156 
Roles: node 
Labels: beta.kubernetes.io/arch=amd64 beta.kubernetes.io/os=linux kubernetes.io/arch=amd64 kubernetes.io/hostname=192.168.100.156kubernetes.io/os=linux kubernetes.io/role=node

为node添加标签,采用key=value格式。

kubectl label node 192.168.100.156 project="eshop"
kubectl label node 192.168.100.156 disktype="ssd"

两个条件都必须满足的nodes才被选择,如多个node都符合再根据高分选出其中一个node。

kind: Deployment
apiVersion: apps/v1
metadata:labels:app: myserver-tomcat-app2-deployment-labelname: myserver-tomcat-app2-deploymentnamespace: myserver
spec:replicas: 4selector:matchLabels:app: myserver-tomcat-app2-selectortemplate:metadata:labels:app: myserver-tomcat-app2-selectorspec:nodeSelector:project: eshopdisktype: ssdcontainers:- name: myserver-tomcat-app2-containerimage: tomcat:7.0.94-alpine imagePullPolicy: IfNotPresentports:- containerPort: 8080protocol: TCPname: http

nodeName

nodeName即节点名字,每个节点名字都不一样。使用了nodeName则不需要筛选,直接调度到指定名字的node节点。

pod直接调度到了192.168.100.156节点上。

kind: Deployment
apiVersion: apps/v1
metadata:labels:app: myserver-tomcat-app2-deployment-labelname: myserver-tomcat-app2-deploymentnamespace: myserver
spec:replicas: 2selector:matchLabels:app: myserver-tomcat-app2-selectortemplate:metadata:labels:app: myserver-tomcat-app2-selectorspec:nodeName: 192.168.100.156containers:- name: myserver-tomcat-app2-containerimage: tomcat:7.0.94-alpine imagePullPolicy: IfNotPresentports:- containerPort: 8080protocol: TCPname: http

查看pod是否落在了192.168.100.156节点上。

sudo kubectl get pod -n myserver -o wide
NAME                  							  READY   STATUS    RESTARTS   AGE     IP                NODE 
myserver-tomcat-app2-deployment-32ac23d58b-29vqx   1/1     Running   0          4m12s   172.20.135.27   192.168.100.156 

node affinity

node affinity即节点亲和,是nodeSelector的进阶,标签条件包含与或非等,支持硬匹配和软匹配,类型包括硬亲和,软亲和,反亲和。

  1. requiredDuringScheduling:必须满足条件才调度,没有满足的不进行调度。
  2. preferredDuringScheduling:倾向符合标签的node,没有满足的也可以调度。
  3. IgnoredDuringExecution:Pod运行中Node改变标签,即使不再符合也继续运行。

硬亲和

使用In做条件,有一个值符合即可。matchExpressions有多个,有一个符合即可。

kind: Deployment
apiVersion: apps/v1
metadata:labels:app: myserver-tomcat-app2-deployment-labelname: myserver-tomcat-app2-deploymentnamespace: myserver
spec:replicas: 2selector:matchLabels:app: myserver-tomcat-app2-selectortemplate:metadata:labels:app: myserver-tomcat-app2-selectorspec:containers:- name: myserver-tomcat-app2-containerimage: tomcat:7.0.94-alpine imagePullPolicy: IfNotPresentports:- containerPort: 8080protocol: TCPname: httpaffinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:           nodeSelectorTerms:- matchExpressions: - key: disktypeoperator: In #只有一个value是匹配成功也可以调度values:- ssd - sas- matchExpressions: - key: projectoperator: In #只有一个value是匹配成功也可以调度values:- eshop  #即使这俩条件都匹配不上也可以调度,即多个matchExpressions只要有任意一个能匹配任何一个value就可以调用。- email

只有一个matchExpressions,则两个key都必须符合。但每个key匹配一个value即为符合。

...
前部分如上
...affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:           nodeSelectorTerms:- matchExpressions: - key: disktypeoperator: Invalues:- ssd - sas- key: projectoperator: Invalues:- eshop- email

软亲和

weight权重越大优先选择,软亲和没有合适的node最后也被调度。

...
前部分如上
...affinity:nodeAffinity:preferredDuringSchedulingIgnoredDuringExecution:- weight: 80 #软亲和条件1,weight值越大优先级越高,越优先匹配调度 preference: matchExpressions: - key: project operator: In values: - eshop- weight: 60 #软亲和条件2,在条件1不满足时匹配条件2preference: matchExpressions: - key: disktypeoperator: In values: - ssd

反亲和

标签匹配逻辑使用NotIn便是反亲和,使用hdd硬盘的node不被调度。

...
前部分如上
...affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:           nodeSelectorTerms:- matchExpressions: - key: disktypeoperator: NotInvalues:- hdd 

亲和组合

硬亲和,软亲和,反亲和可以一起使用。

...
前部分如上
...affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution: #硬亲和nodeSelectorTerms:- matchExpressions: #硬匹配条件- key: "kubernetes.io/role" operator: NotIn  #反亲和values:- "master" #硬性匹配key的值kubernetes.io/role不包含master的节点,即绝对不会调度到master节点(node反亲和)preferredDuringSchedulingIgnoredDuringExecution: #软亲和- weight: 80 preference: matchExpressions: - key: project operator: In values: - eshop- weight: 60 preference: matchExpressions: - key: disktypeoperator: In values: - hdd



本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部