首页 > 编程语言 >每天一点基础K8S--K8S中调度策略---节点选择器nodeName、nodeSelector

每天一点基础K8S--K8S中调度策略---节点选择器nodeName、nodeSelector

时间:2022-11-29 12:01:09浏览次数:48  
标签:node -- worker only io test pod K8S 选择器

K8S中的调度策略---节点选择器

正常情况下,Pod被调度到哪一个节点是通过scheduler完成,但在一些场景中,时常需要将一些pod指定在某一个node上运行。那此时就可以通过nodeName和nodeSelector完成
nodeName
   nodeName	<string>
     NodeName is a request to schedule this pod onto a specific node. If it is non-empty, the scheduler simply schedules this pod onto that node, assuming that it fits resource requirements.
[root@master-worker-node-1 pod]# cat test-node-name.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: test-node-name
  labels: 
    function: test-node-name
spec:
  nodeName: only-worker-node-3
  containers:
  - name: test-ndoe-name-container
    image: busybxox:latest
    imagePullPolicy: IfNotPresent
    command: ['/bin/sh','-c','sleep 1234']
创建pod
[root@master-worker-node-1 pod]# kubectl apply -f test-node-name.yaml 
pod/test-node-name created

pod被调度到了only-worker-node-3
[root@master-worker-node-1 pod]# kubectl get pods --show-labels -o wide
NAME             READY   STATUS    RESTARTS   AGE   IP            NODE                 NOMINATED NODE   READINESS GATES   LABELS
test-node-name   1/1     Running   0          62s   10.244.31.7   only-worker-node-3   <none>           <none>            function=test-node-name
nodeSelector
nodeSelector和后面要学习的亲和性都是根据node的label进行选择。
因为nodeSelector是和标签有关,先给其中一个worker node打上一个标签

[root@master-worker-node-1 pod]# kubectl label nodes only-worker-node-3 test-nodeselector=target-node
node/only-worker-node-3 labeled


[root@master-worker-node-1 pod]# kubectl get nodes --show-labels
NAME                   STATUS   ROLES           AGE     VERSION   LABELS
master-worker-node-1   Ready    control-plane   3d22h   v1.25.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=master-worker-node-1,kubernetes.io/os=linux,node-role.kubernetes.io/control-plane=,node.kubernetes.io/exclude-from-external-load-balancers=
master-worker-node-2   Ready    control-plane   3d21h   v1.25.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=master-worker-node-2,kubernetes.io/os=linux,node-role.kubernetes.io/control-plane=,node.kubernetes.io/exclude-from-external-load-balancers=
only-worker-node-3     Ready    worker          3d21h   v1.25.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=only-worker-node-3,kubernetes.io/os=linux,node-role.kubernetes.io/worker=,test-nodeselector=target-node
only-worker-node-4     Ready    worker          3d21h   v1.25.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=only-worker-node-4,kubernetes.io/os=linux,node-role.kubernetes.io/worker=

[root@master-worker-node-1 pod]# cat test-node-selector.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: test-node-selector
  labels: 
    function: test-node-selector
spec:
  nodeSelector: 
    test-nodeselector: target-node
  containers:
  - name: test-node-selector
    image: busybox:latest
    imagePullPolicy: IfNotPresent
    command: ['/bin/sh','-c','sleep 1234']
创建pod
[root@master-worker-node-1 pod]# kubectl apply -f test-node-selector.yaml 
pod/test-node-selector created

pod被调度到含有nodeslector中关联的label的node上。
[root@master-worker-node-1 pod]# kubectl get pods -o wide 
NAME                 READY   STATUS    RESTARTS   AGE   IP            NODE                 NOMINATED NODE   READINESS GATES
test-node-name       1/1     Running   0          18m   10.244.31.7   only-worker-node-3   <none>           <none>
test-node-selector   1/1     Running   0          11s   10.244.31.8   only-worker-node-3   <none>           <none>
将only-worker-node-4也打上对应的标签test-nodeselector=target-node
[root@master-worker-node-1 pod]# kubectl label nodes  only-worker-node-4 test-nodeselector=target-node
node/only-worker-node-4 labeled
重新新增一个pod,该pod具有相同的nodeSelector
[root@master-worker-node-1 pod]# kubectl apply -f test-node-selector-2.yaml 
pod/test-node-selector-2 created

此时pod被scheduler在具有test-nodeselector这个label的node之间进行调度。结果显示被调度到only-worker-node-4
[root@master-worker-node-1 ~]# kubectl get pods -o wide 
NAME                   READY   STATUS    RESTARTS      AGE   IP            NODE                 NOMINATED NODE   READINESS GATES
test-node-name         1/1     Running   1 (12m ago)   33m   10.244.31.7   only-worker-node-3   <none>           <none>
test-node-selector     1/1     Running   0             14m   10.244.31.8   only-worker-node-3   <none>           <none>
test-node-selector-2   1/1     Running   0             10m   10.244.54.7   only-worker-node-4   <none>           <none>

nodeName和nodeSelector优先级对比
测试前,现将only-worker-node-4的label去除
[root@master-worker-node-1 pod]# kubectl label nodes only-worker-node-4 test-nodeselector-
node/only-worker-node-4 unlabeled
[root@master-worker-node-1 pod]# cat compare-nodename-with-node-selector.yaml 
apiVersion: v1
kind: Pod
metadata: 
  name: compare
  labels:
    function: compare-nodeName-with-nodeSelector
spec:
  nodeName: only-worker-node-4      # nodeName选择only-worker-node-4
  nodeSelector:
    test-nodeselector: target-node  # nodeSelector选择only-worker-node-3
  containers:
  - name: compare
    image: busybox:latest
    imagePullPolicy: IfNotPresent
    command: ['/bin/sh','-c','sleep 1234']
[root@master-worker-node-1 pod]# kubectl apply -f compare-nodename-with-node-selector.yaml 
pod/compare created

发现pod不能正常运行
[root@master-worker-node-1 pod]# kubectl get pods -o wide |  grep compare
compare                0/1     NodeAffinity   0               105s   <none>        only-worker-node-4   <none>           <none>

查看pod详情发现nodeAffnity调度失败
[root@master-worker-node-1 pod]# kubectl describe pods compare | tail -4
Events:
  Type     Reason        Age    From     Message
  ----     ------        ----   ----     -------
  Warning  NodeAffinity  2m23s  kubelet  Predicate NodeAffinity failed
[root@master-worker-node-1 pod]# cat compare-nodename-with-node-selector-2.yaml 
apiVersion: v1
kind: Pod
metadata: 
  name: compare-2
  labels:
    function: compare-nodeName-with-nodeSelector
spec:
  nodeName: only-worker-node-3  # nodeName选择only-worker-node-3
  nodeSelector:
    test-nodeselector: target-node # nodeSelector也选择only-worker-node-3
  containers:
  - name: compare-2
    image: busybox:latest
    imagePullPolicy: IfNotPresent
    command: ['/bin/sh','-c','sleep 1234']
    
 [root@master-worker-node-1 pod]# kubectl apply -f compare-nodename-with-node-selector-2.yaml 
pod/compare-2 created

pod可以运行    
 [root@master-worker-node-1 pod]# kubectl get pods -o wide  |  grep compare
compare                0/1     NodeAffinity   0             8m56s   <none>        only-worker-node-4   <none>           <none>
compare-2              1/1     Running        0             17s     10.244.31.9   only-worker-node-3   <none>           <none>

小结

nodeName是通过node的名称进行调度,nodeSelector是通过node的标签进行调度。

当nodeName和nodeSelector的标签同时存在,且选择不同的node时,pod将因为nodeAffinity创建失败

当nodeName和nodeSelector的标签同时存在,但可以选出相同的node时,pod可以正常运行

标签:node,--,worker,only,io,test,pod,K8S,选择器
From: https://www.cnblogs.com/woshinidaye123/p/16935031.html

相关文章

  • mysql数据库管理
    mysql数据库管理过程分为:创建数据库、修改数据库、删除数据库和查看数据库四种类型。然后今天分享的事手动创建数据库:手动创建mysql首先第一步应该创建一个数据库mysql>cre......
  • SpringCloud Alibaba(四) - Nacos 配置中心
    1、环境搭建1.1依赖<!--nacos注册中心注解@EnableDiscoveryClient--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-......
  • 形容词
    形容词形容词用法定语前置定语ahungryrabbit一个饿了的兔子alittlewhiterabbit一只小白兔后置定语形容词短语作定语一般来说,形容词短语会放在描述的对象......
  • 临场发言,怎样讲得有水平?
    三点一线法三点一线法。就是讲话的时候我们讲三点,而且这三点都在同一条逻辑线上。讲三点,心理学上是有过研究和分析的,我们的大脑是比较容易记住三个点的。你想想看,要是......
  • 接口架构风格——RESTful
    接口架构风格——RESTfulRESTful是非常流行的架构设计风格。一、REST—前后台间的通信方式1.1什么是RESTREST(RepresentationalStateTransfer),表现形式状态转换......
  • 引入进度条插件nprogress
    安装npminstall--savenprogress引入//引入进度条importnprogressfrom"nprogress";//引入进度条样式import"nprogress/nprogress.css"; 使用constr......
  • 定时清除linux内存buff/cache缓存
    1.创建脚本文件       vimclean.sh2.在文件中输入以下脚本#!/bin/bash#每两小时清除一次内存buff/cache缓存echo"开始清除缓存"sync;sync;sync#写......
  • 《Go 语言并发之道》读书笔记(七)
    今天这篇笔记我们来学习Go限流限流是分布式系统中经常需要用到的技术,因为我们让请求没有限制,很容易就出现某个用户开很多线程把我们的服务拉跨,进而影响到别的用户。限流......
  • 开发申请单——流程表单有转交时确保开发人组件值随着转交人变化而变化
    参考宜搭平台接口:https://www.yuque.com/yida/support/aql605说明:只写了一个方法 getProcessData,有页面自动调用函数didMount调用(当前页面-设置-生命周期-页面加载......
  • Vue 前端解析 Excel 数据
    想要在前端实现Excel表格数据的解析,需要安装xlsx包:npminstallxlsx然后在需要使用的地方引入:import*asXLSXfrom'xlsx/xlsx.mjs'使用ElementUI提供......