zoukankan      html  css  js  c++  java
  • k8s pod节点标签选择器-nodeSelector

    1. 节点标签选择器

    • nodeSelector:用于将Pod调度到匹配Label的Node上,如果没有匹配的标签会调度失败。

      • 作用:
        约束Pod到特定的节点运行
        完全匹配节点标签
      • 应用场景:
        专用节点:根据业务线将Node分组管理
        配备特殊硬件:部分Node配有SSD硬盘、GPU
    • 示例:

      确保Pod分配到具有SSD硬盘的节点上

      • 第一步:给节点添加标签
        格式:

        kubectl label nodes <node-name> <label-key>=<label-value>
        

        例如:

        kubectl label nodes k8s-node1 disktype=ssd
        

        验证:

        kubectl get nodes --show-labels
        
      • 第二步:添加nodeSelector字段到Pod配置中

        apiVersion: v1
        kind: Pod
        metadata:
          name: pod-example
        spec:
          nodeSelector:
            disktype: "ssd"
          containers:
          - name: nginx
            image: nginx:1.19
        
      • 最后,验证:

        kubectl get pods -o wide
        

    2. nodeSelector案例

    • 给k8s-node1标记标签

      [root@k8s-master yaml]# kubectl label nodes k8s-node1 disktype="ssd"
      node/k8s-node1 labeled
      
    • 查看验证

      [root@k8s-master yaml]# kubectl get nodes --show-labels 
      NAME         STATUS   ROLES    AGE    VERSION   LABELS
      k8s-master   Ready    master   5d1h   v1.19.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-master,kubernetes.io/os=linux,node-role.kubernetes.io/master=
      k8s-node1    Ready    <none>   5d     v1.19.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,disktype=ssd,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node1,kubernetes.io/os=linux
      k8s-node2    Ready    <none>   5d     v1.19.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node2,kubernetes.io/os=linux
      
    • 编写配置文件

      [root@k8s-master yaml]# vim pod-example.yaml
      [root@k8s-master yaml]# cat pod-example.yaml 
      apiVersion: v1
      kind: Pod
      metadata:
        name: pod-example
      spec:
        nodeSelector:
          disktype: "ssd"
        containers:
        - name: nginx
          image: nginx:1.19
      
    • 运行服务

      [root@k8s-master yaml]# kubectl apply -f pod-example.yaml 
      pod/pod-example created
      
    • 验证服务

      [root@k8s-master yaml]# kubectl get pods -o wideNAME          READY   STATUS    RESTARTS   AGE    IP               NODE        NOMINATED NODE   READINESS GATESinit-demo     1/1     Running   0          23h    10.244.36.93     k8s-node1   <none>           <none>pod-envars    1/1     Running   2          24h    10.244.36.91     k8s-node1   <none>           <none>pod-example   1/1     Running   0          107s   10.244.36.94     k8s-node1   <none>           <none>web           1/1     Running   0          130m   10.244.169.158   k8s-node2   <none>           <none>
      
    • 注释:

      1. 经过测试,在k8s-node1上已经做好标签,在配置文件写入的时候,会引入标签使用,
      2. 如果在,主机上没有设置标签,就会一直在pending的状态,知道有标签才会分配

    3. nodeselector使用deployment来创建

    • 查看标签名

      [root@k8s-master yaml]# kubectl get nodes --show-labels NAME         STATUS   ROLES    AGE    VERSION   LABELSk8s-master   Ready    master   5d1h   v1.19.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-master,kubernetes.io/os=linux,node-role.kubernetes.io/master=k8s-node1    Ready    <none>   5d     v1.19.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,disktype=ssd,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node1,kubernetes.io/os=linuxk8s-node2    Ready    <none>   5d     v1.19.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node2,kubernetes.io/os=linux
      
    • 生成配置文件

      [root@k8s-master pod]# kubectl create deployment web --replicas=1 --image=nginx --dry-run=client -o yaml > kubelet_pod.yaml[root@k8s-master pod]# vim kubelet_pod.yaml [root@k8s-master pod]# cat kubelet_pod.yaml apiVersion: apps/v1kind: Deploymentmetadata:  labels:    app: web  name: webspec:  replicas: 1  selector:    matchLabels:      app: web  strategy: {}  template:    metadata:      labels:        app: web    spec:      nodeSelector:        kubernetes.io/hostname: "k8s-node01"      containers:      - image: nginx        name: nginx
      
    • 启动配置文件

      [root@k8s-master pod]# kubectl apply -f kubelet_pod.yaml deployment.apps/web unchanged
      
    • 验证是否在node01节点

      [root@k8s-master pod]# kubectl get pods -o wideNAME                  READY   STATUS    RESTARTS   AGE     IP              NODE         NOMINATED NODE   READINESS GATESweb-6b8c6845f-b4l2m   1/1     Running   0          4m12s   10.244.85.212   k8s-node01   <none>           <none>
      
  • 相关阅读:
    RTB交接
    awk命令详解
    Linux下的压缩解压缩命令详解
    inux下文件权限设置中的数字表示权限,比如777,677等,这个根据什么得来的
    jmeter接口测试教程
    kafka常用的操作命令
    hadoop常用的操作命令
    linux常用命令
    hive的常用命令
    用shell脚本写一个for循环
  • 原文地址:https://www.cnblogs.com/scajy/p/15481762.html
Copyright © 2011-2022 走看看