【云原生 | 从零开始学Kubernetes九、k8s的node节点选择器与node节点亲和性

node节点选择器与污点容忍度
- node 节点选择器
-
- 1、nodeName
- 2、nodeSelector
- 污点和污点容忍
-
- 污点容忍
- node 节点亲和性
- 写在最后
node 节点选择器
我们在创建 pod 资源的时候,pod 会根据 schduler 进行调度,那么默认会调度到随机的一个工作节点,如果我们想要 pod 调度到指定节点或者调度到一些具有相同特点的 node 节点,怎么办呢? 可以使用 pod 中的 nodeName 或者 nodeSelector 字段指定要调度到的 node 节点
1、nodeName
指定 pod 节点运行在哪个具体 node 上
#node1和2用docker下载tomcat busybox [root@k8smaster node]# vim pod-node.yml apiVersion: v1 kind: Pod metadata: name: demo-pod namespace: default labels: app: myapp env: dev spec: nodeName: k8snode containers: - name: tomcat-pod-java ports: - containerPort: 8080 image: tomcat imagePullPolicy: IfNotPresent - name: busybox image: busybox:latest command: - "/bin/sh" - "-c" - "sleep 3600" [root@k8smaster node]# kubectl apply -f pod-node.yml pod/demo-pod created #查看 pod 调度到哪个节点 [root@k8smaster node]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE demo-pod 2/2 Running 0 35s 10.244.2.18 k8snode
2、nodeSelector
指定 pod 调度到具有哪些标签的 node 节点上
#给 node 节点打标签,打个具有 disk=ceph 的标签 [root@k8smaster node]# kubectl describe nodes k8snode2 查看node属性 [root@k8smaster node]# kubectl label nodes k8snode2 disk=ceph node/k8snode2 labeled #然后再查看去label哪里就能看到了 #定义 pod 的时候指定要调度到具有 disk=ceph 标签的 node 上 [root@k8smaster node]# vim pod-1.yaml apiVersion: v1 kind: Pod metadata: name: demo-pod-1 namespace: default labels: app: myapp env: dev spec: nodeSelector: disk: ceph containers: - name: tomcat-pod-java ports: - containerPort: 8080 image: tomcat imagePullPolicy: IfNotPresent [root@k8smaster node]# kubectl apply -f pod-1.yaml pod/demo-pod-1 created #查看 pod 调度到哪个节点 [root@k8smaster node]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE demo-pod-1 1/1 Running 0 8s 10.244.1.19 k8snode2#如果标签和nodename都有的话 优先选择好的node。
污点和污点容忍
污点容忍
污点容忍就是某个节点可能被调度,也可能不被调度
node 节点亲和性
node 节点亲和性调度:nodeAffinity 用帮助文档查看亲和性字段下面的东西
[root@k8smaster node]# kubectl explain pods.spec.affinity KIND: Pod VERSION: v1 RESOURCE: affinity
affinity:亲和性,下面的node是node亲和性,然后requ硬亲和性,nodeselect是对象列表,我们用-链接,然后match也是对象列表,同上,key是zone,然后等值关系,值是foo和bar。 这个yaml意思是:我们检查当前节点中有任意一个节点拥有 zone 标签的值是 foo 或者 bar,就可以把 pod 调度到这个 node 节点的 foo 或者 bar 标签上的节点上,现在找不到,因为没打标签!
[root@k8smaster node]# kubectl apply -f pod-nodeaffinity-demo.yaml pod/pod-node-affinity-demo created [root@k8smaster node]# kubectl get pods -o wide | grep pod-node pod-node-affinity-demo 0/1 Pending 0 11s1. status 的状态是 pending,上面说明没有完成调度,因为没有一个拥有 zone 的标签的值是 foo 或者 bar,而且使用的是硬亲和性,必须满足条件才能完成调度。 [root@k8smaster node]# kubectl label nodes k8snode zone=foo node/k8snode labeled #给这个节点打上标签 zone=foo,在查看 [root@k8smaster node]# kubectl get pods -o wide 显示running了 pod-node-affinity-demo 1/1 Running 0 4m4s 10.244.2.19 k8snode 例 2:使用 preferredDuringSchedulingIgnoredDuringExecution 软亲和性 [root@k8smaster node]# vim pod-nodeaffinity-demo-2.yaml apiVersion: v1 kind: Pod metadata: name: pod-node-affinity-demo-2 namespace: default labels: app: myapp tier: frontend spec: containers: - name: myapp image: nginx affinity: nodeAffinity: preferredDuringSchedulingIgnoredDuringExecution: - preference: matchExpressions: - key: zone1 operator: In values: - foo1 - bar1 weight: 60 #用的还是node亲和性,然后是软亲和性,如果所有的工作节点都没有这个标签,pod还是会调度 [root@k8smaster node]# kubectl apply -f pod-nodeaffinity-demo-2.yaml pod/pod-node-affinity-demo-2 created [root@k8smaster node]# kubectl get pods -o wide |grep demo-2 pod-node-affinity-demo-2 1/1 Running 0 29s 10.244.1.20 k8snode2 #上面说明软亲和性是可以运行这个 pod 的,尽管没有运行这个 pod 的节点定义的 zone1 标签 Node 节点亲和性针对的是 pod 和 node 的关系,Pod 调度到 node 节点的时候匹配的条件
写在最后
创作不易,如果觉得内容对你有帮助,麻烦给个三连关注支持一下我!如果有错误,请在评论区指出,我会及时更改! 目前正在更新的系列:从零开始学k8s 感谢各位的观看,文章掺杂个人理解,如有错误请联系我指出~