目录

一、nodeSelector节点选择器

二、nodeSelector的使用


一、nodeSelector节点选择器

NodeSelector是Kubernetes调度器的一部分,是节点选择约束的最简单推荐形式。它允许开发者根据节点的标签,精确地控制Pod在集群中的调度位置。通过在Pod的定义中设置NodeSelector,可以确保Pod只会被调度到具有特定标签的节点上。关键点是标签label

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

# 如果集群只有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: registry.cn-hangzhou.aliyuncs.com/oslee-dockerhub/nginx:1.27-alpine3.19
        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. 创建资源
# 查看节点标签
[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
# 编辑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

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐