node节点选择器的使用
- 使用场景
- 实践
- 使用nodeName
- 使用nodeSelector
- nodeName和nodeSelector混合使用
- 1、设置了nodeName 和 设置 Node上都不存在的标签。看调度情况
- 2、设置nodeName 为node1 和 设置 node2上才有的标签。看调度情况
- 实践总结
使用场景
默认情况,在创建Pod资源的时候,会根据schduler进行节点调度,默认会随机调度一个工作节点。
如果想要Pod 调度到指定节点 或者 调度到一些具有相同特点的node节点,就可以运用Pod中的 nodeName 或者 nodeSelector 字段指定要调度到的Node节点。
实践
使用nodeName
运用nodeName,将Pod运行在指定Node上
创建pod资源文件
vim pod-node-name.yaml
apiVersion: v1
kind: Pod
metadata:name: pod-node-namenamespace: test # 指定命名空间
spec:nodeName: k8s-node1 # 指定pod运行的节点名称containers:- name: tomcat-javaimage: tomcat:8.5-jre8-alpineimagePullPolicy: IfNotPresentports:- containerPort: 8080
创建资源
kubectl apply -f pod-node-name.yaml
查看创建的pod调度到哪个节点
kubectl get pods -n test -o wide
看pod的详细信息
kubectl describe pods pod-node-name -n test
使用nodeSelector
运用nodeSelector,指定Pod调度到具有哪些 标签 的Node节点上
看Node节点的标签
kubectl get nodes --show-labels
指定创建的Pod要调度到具有node-type=worker标签的node上
(ps. 以下操作顺序:先建Pod再给Node打上标签)
创建pod资源文件
vim pod-node-selector.yaml
apiVersion: v1
kind: Pod
metadata:name: pod-node-selectornamespace: test # 指定命名空间
spec:nodeSelector:node-type: workercontainers:- name: tomcat-javaports:- containerPort: 8080image: tomcat:8.5-jre8-alpineimagePullPolicy: IfNotPresent
创建资源
kubectl apply -f pod-node-selector.yaml
查看创建的pod调度到哪个节点
kubectl get pods -n test -o wide
看pod的详细信息
kubectl describe pods pod-node-selector -n test
找不到符合标签的node,pod一直处于创建中
给Node名为 k8s-node2 的节点打个具有 “node-type=worker” 的标签
kubectl label nodes k8s-node2 node-type=worker
Node节点上打标签后,再看 Pod状态 和 调度的节点
kubectl get pods -n test -o wide
找到符合的node节点后,成功运行
nodeName和nodeSelector混合使用
1、设置了nodeName 和 设置 Node上都不存在的标签。看调度情况
创建pod资源文件
vim pod-node-mix1.yaml
apiVersion: v1
kind: Pod
metadata:name: pod-node-mix1namespace: test # 指定命名空间
spec:nodeName: k8s-node2nodeSelector:node-type: backupcontainers:- name: tomcat-javaports:- containerPort: 8080image: tomcat:8.5-jre8-alpineimagePullPolicy: IfNotPresent
创建资源
kubectl apply -f pod-node-mix1.yaml
再查看pod
kubectl get pods -n test -o wide
同一个yaml文件里定义Pod资源,如果同时定义了 nodeName 和 nodeSelector,那么条件必须都满足,有一个不满足都会调度失败
再给Node名为 k8s-node2 的节点打上标签
kubectl label nodes k8s-node2 node-type=backup
重建pod
kubectl delete pods pod-node-mix1 -n testkubectl apply -f pod-node-mix1.yaml
pod就能正常调度到k8s-node2上
kubectl get pods -n test -owide
2、设置nodeName 为node1 和 设置 node2上才有的标签。看调度情况
创建pod资源文件
vim pod-node-mix2.yaml
apiVersion: v1
kind: Pod
metadata:name: pod-node-mix2namespace: test # 指定命名空间
spec:nodeName: k8s-node1nodeSelector:node-type: backupcontainers:- name: tomcat-javaports:- containerPort: 8080image: tomcat:8.5-jre8-alpineimagePullPolicy: IfNotPresent
创建资源
kubectl apply -f pod-node-mix2.yaml
查看pod调度到哪个节点
kubectl get pods -n test -owide
看pod的详细信息
kubectl describe pods pod-node-mix2 -n test
找节点调度时,同时设置了nodeName和nodeSelector,nodeName调度的优先级最高
但Pod状态还是非running,尽量不要同时使用nodeName和nodeSelector
实践总结
- 同时设置了nodeName和nodeSelector,nodeName优先级最高
- 如果同时定义了 nodeName 和 nodeSelector,那么条件必须都满足,否则会调度失败
- 只设置了nodeSelector,当找不到符合标签的node,pod一直处于创建中