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

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

相关推荐
pride.li4 小时前
Docker教程-Docker安装与镜像配置
运维·docker·容器
bgy66664 小时前
Docker Swarm 容器编排实战指南
运维·docker·容器
再卷还是菜5 小时前
Cephfs总结及kubernetes+Cephfs的整合项目
云原生·容器·kubernetes
底层玩家老张5 小时前
数据库上K8s,运维为什么反而更累了?从StatefulSet到Operator的复盘
数据库·kubernetes·operator·数据库运维·架构选型
力江6 小时前
GitLab 私有化部署实战 —— 从 Omnibus 到 Docker 的踩坑之旅
docker·容器·gitlab
深念Y6 小时前
Docker 镜像体积从 110MB 降到 13MB 后端服务的瘦身
运维·docker·容器
秦jh_8 小时前
【Docker】镜像仓库
docker·容器
IT大白鼠8 小时前
使用 Docker 部署 Kubernetes 集群:容器方式搭建 K8s 环境
docker·容器·kubernetes
大大大大晴天️11 小时前
从 HDFS 到对象存储:计算存储分离如何重塑云原生大数据底座
大数据·云原生
阿里云云原生1 天前
Agent 观测与优化三城巡演丨第二站深圳精彩回顾 & PPT 下载
云原生