K8S之运用节点选择器指定Pod运行的节点

node节点选择器的使用

使用场景

默认情况,在创建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一直处于创建中
相关推荐
wdxylb5 小时前
云原生俱乐部-shell知识点归纳(1)
linux·云原生
木易双人青6 小时前
01-Docker-简介、安装与使用
运维·docker·容器
晴天彩虹雨10 小时前
存算分离与云原生:数据平台的新基石
大数据·hadoop·云原生·spark
罗不俷11 小时前
【RH134知识点问答题】第13章:运行容器
容器·rhel
春人.14 小时前
PortainerCE 跨云管理:cpolar 内网穿透服务实现多环境统一控制
云原生·eureka
tb_first15 小时前
k8sday11服务发现(2/2)
docker·云原生·容器·kubernetes·k8s
zxcxylong17 小时前
almalinux9.6系统:k8s可选组件安装(1)
云原生·容器·kubernetes·metrics·almalinux·hpa·vpa
君不见,青丝成雪18 小时前
大数据云原生是什么
大数据·云原生
一个天蝎座 白勺 程序猿21 小时前
Apache IoTDB(4):深度解析时序数据库 IoTDB 在Kubernetes 集群中的部署与实践指南
数据库·深度学习·kubernetes·apache·时序数据库·iotdb
熊出没1 天前
微服务如何集成swagger3
微服务·云原生·架构