该篇文章已经被专栏《从零开始学k8s》收录
文章图片
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
NAMEREADYSTATUSRESTARTSAGEIPNODENOMINATED NODE
demo-pod2/2Running035s10.244.2.18k8snode
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
NAMEREADYSTATUSRESTARTSAGEIPNODENOMINATED NODEdemo-pod-11/1Running08s10.244.1.19k8snode2
#如果标签和nodename都有的话 优先选择好的node。
污点和污点容忍 污点容忍 污点容忍就是某个节点可能被调度,也可能不被调度
node 节点亲和性 node 节点亲和性调度:nodeAffinity 用帮助文档查看亲和性字段下面的东西
[root@k8smaster node]# kubectl explain pods.spec.affinity
KIND:Pod
VERSION:v1RESOURCE: 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-demo0/1Pending011s# 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-demo1/1Running04m4s10.244.2.19k8snode
例 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-21/1Running029s10.244.1.20k8snode2#上面说明软亲和性是可以运行这个 pod 的,尽管没有运行这个 pod 的节点定义的 zone1 标签
Node 节点亲和性针对的是 pod 和 node 的关系,Pod 调度到 node 节点的时候匹配的条件
写在最后 创作不易,如果觉得内容对你有帮助,麻烦给个三连关注支持一下我!如果有错误,请在评论区指出,我会及时更改!
目前正在更新的系列:从零开始学k8s
感谢各位的观看,文章掺杂个人理解,如有错误请联系我指出~
文章图片
推荐阅读
- #|kubernetes-POD调度
- linux|K8S复习(一)(kubernetes设计架构)
- k8s|k8s部署及其相关介绍
- Dockerfile参数详解
- kubesphere|(十三)从零开始搭建k8s集群——使用KubeSphere管理平台搭建一个高可用的zookeeper版kafka集群服务
- kubesphere|(八)从零开始搭建k8s集群——使用KubeSphere管理平台创建一个高可用的Nacos(2.0.4)集群服务
- 云原生(K8s|菜鸟学Kubernetes(K8s)系列——(四)关于Volume卷(PV、PVC、StorageClass等)
- 云原生(K8s|菜鸟学Kubernetes(K8s)系列——(五)关于ConfigMap和Secret
- docker|跟拐友们讲讲docker compose的用法