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