11.1.k8s中pod的调度-nodeSelector节点选择器

目录

一、概念

二、节点选择器nodeSelector的使用


一、概念

NodeSelector是Kubernetes调度器的一部分,它允许开发者根据节点的标签,精确地控制Pod在集群中的调度位置。通过在Pod的定义中设置NodeSelector,可以确保Pod只会被调度到具有特定标签的节点上。

我们先创建一个普通的deploy资源,设置为10个副本,查看创建的pod;

bash 复制代码
# 如果集群只有2个节点,可以将master节点也作为work节点
[root@k8s1 deploy]# kubectl taint nodes --all node-role.kubernetes.io/master:NoSchedule-

# 创建deploy资源
[root@k8s1 deploy]# cat deploy.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: dm01
spec:
  #声明设置升级策略
  strategy:
    #设置升级的策略类型,类型有两种;
    #第一种:Recreate:先停止所有pod,再批量创建新的pod;生产环境不建议使用,因为用户在此时会访问不到服务;
    #第二种:RollingUpdate:滚动更新,即实现部分更新,逐渐替换掉原有的pod,也就是默认的策略;
    type: RollingUpdate
    #如果设置了滚动更新RollingUpdate类型,还需要设置更新的策略;
    rollingUpdate:
      #在原有pod副本数量的基础上,多启动pod的数量(也就是说,更新过程中同时可以存在2+副本数个pod,新旧版本一起)
      maxSurge: 2
      #在升级的过程中最大不可访问的pod的数量(也就是说,pod副本数-1的数量可以被访问)
      maxUnavailable: 1
  replicas: 10
  selector:
    matchLabels:
      k8s: oslee
  template:
    metadata:
      name: pod01
      labels:
        k8s: oslee
    spec:
      containers:
      - name: c1
        image: harbor.oslee.com/oslee-private/my-nginx:v2
        ports:
        - containerPort: 80

[root@k8s1 deploy]# kubectl apply -f deploy.yaml 
deployment.apps/dm01 created

我们发现,其是随机创建在,k8s1和k8s2节点上的;

那么我们有没有方法,让pod根据我们自己的想法,创建在我们想要的节点上呐?

接下来,我们就学习,关于pod调度的节点选择器,nodeSelector

二、节点选择器nodeSelector的使用

通过标签让pod创建在我们想要的节点上;

使用步骤

  1. 给节点(k8s1、k8s2)打不同的标签
  2. pod中编辑节点选择(选择节点的标签)
  3. 创建资源
bash 复制代码
# 查看节点标签
[root@k8s1 deploy]# kubectl get nodes --show-labels
NAME   STATUS   ROLES                  AGE   VERSION    LABELS
k8s1   Ready    control-plane,master   4d    v1.23.17   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s1,kubernetes.io/os=linux,node-role.kubernetes.io/control-plane=,node-role.kubernetes.io/master=,node.kubernetes.io/exclude-from-external-load-balancers=
k8s2   Ready    <none>                 4d    v1.23.17   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s2,kubernetes.io/os=linux

# 给节点打标签
[root@k8s1 deploy]# kubectl label node k8s1 node=k8s1 os=lee
node/k8s1 labeled
[root@k8s1 deploy]# kubectl label node k8s2 node=k8s2 os=lee
node/k8s2 labeled
bash 复制代码
# 编辑deploy资源
[root@k8s1 deploy]# cat deploy.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: dm01
spec:
  #声明设置升级策略
  strategy:
    #设置升级的策略类型,类型有两种;
    #第一种:Recreate:先停止所有pod,再批量创建新的pod;生产环境不建议使用,因为用户在此时会访问不到服务;
    #第二种:RollingUpdate:滚动更新,即实现部分更新,逐渐替换掉原有的pod,也就是默认的策略;
    type: RollingUpdate
    #如果设置了滚动更新RollingUpdate类型,还需要设置更新的策略;
    rollingUpdate:
      #在原有pod副本数量的基础上,多启动pod的数量(也就是说,更新过程中同时可以存在2+副本数个pod,新旧版本一起)
      maxSurge: 2
      #在升级的过程中最大不可访问的pod的数量(也就是说,pod副本数-1的数量可以被访问)
      maxUnavailable: 1
  replicas: 10
  selector:
    matchLabels:
      k8s: oslee
  template:
    metadata:
      name: pod01
      labels:
        k8s: oslee
    spec:
      nodeSelector:
        # 根据标签调度到节点k8s1上,如果使用os=lee两个节点都有,就是两个节点都调度
        node: k8s1
      containers:
      - name: c1
        image: harbor.oslee.com/oslee-private/my-nginx:v2
        ports:
        - containerPort: 80

[root@k8s1 deploy]# kubectl apply -f deploy.yaml 
deployment.apps/dm01 created

=============================== 至此,已成艺术==============================

相关推荐
风落无尘17 小时前
Stable Diffusion WebUI & ComfyUI 完整安装教程:官方部署+一键整合包+Docker容器化(2026最新)
docker·容器·stable diffusion
CodeMartain21 小时前
Dify Windows 原生部署(无 Docker、纯本地)
运维·docker·容器
牛奶咖啡131 天前
k8s容器编排技术实践——使用containerd作为容器运行时部署k8s集群
kubernetes·k8s的安装部署·开启系统的ipvs支持·安装containerd·containerd配置加速器·安装k8s的工具·安装calico网络插件
万里侯1 天前
云原生数据备份与恢复:保障数据安全的最佳实践
微服务·容器·k8s
llrraa20101 天前
配置docker国内镜像源
运维·docker·容器
阿里云云原生1 天前
阿里云 STAROps 全域智能运维平台发布!从“被动救火”到“主动自治”
云原生
2301_780789661 天前
手游遇到攻击为什么要用SDK游戏盾手游遇到攻击为什么要用 SDK 游戏盾?
安全·web安全·游戏·架构·kubernetes·ddos
35岁程序员的自救之路1 天前
AiBBS - 面向下一个十年的AI + 云原生社区系统
人工智能·云原生
珂玥c1 天前
k8s集群ingress碎碎念
云原生·容器·kubernetes
佳杰云星1 天前
如何给大模型集群选“大脑”?智算调度与管理平台 10 维选型指南(附选型评分表)
人工智能·kubernetes·大模型·云计算·gpu·算力调度·智算中心