• Label 与 Label Selector


    目录

    一、标签(Label)

    1、Label

    2、 动机(方便管理)

    3、标签的语法

    4、创建时指定标签

    5、查看Label

    二、标签选择器(Label Selector)

    1、标签选择器(Label Selector)

    2、基于等值的标签选择器

    3、基于集合的标签选择器

    4、标签选择器常用命令

    5、将节点打上标签

    6、使用 Nodeselector 选择节点

     7、使用 Node affinity


    一、标签(Label)

    1、Label

    1. 标签(Label)是附在kubernetes 对象(如pod,deployment等)上的键值对(key-value),可以在创建时指定,也可以在创建后指定

    2. Label 的值本身不具备具体含义,但可以通过 label 来筛选对象特定的子集,便于管理

    3. 每一个对象可以有多个标签

    2、 动机(方便管理)

    对哪一组pod来操作

    3、标签的语法

    1. 标签由一组键值对构成

    2.  Label key的组成:

            ·  Key值必须唯一

            ·  可以使用前缀,使用 / 分隔,前缀必须是DNS子域(必须带.),不得超过253个字符,系统中的               自动化组件创建的label必须指定前缀,kubernetes.io/ 由kubernetes保留

            ·  不得超过63个字符

            ·  起始必须是字母(大小写都可以)或数字,中间可以有连字符,下划线和点

    3. Label value 的组成:

            ·  不得超过63个字符

            ·  起始必须是字母(大小写都可以)或数字,中间可以有连字符,下划线和点

    4、创建时指定标签

    1. labelpod.yaml 文件创建一个pod

    1. $ vim label-1.yml
    2. apiVersion: v1
    3. kind: Pod
    4. metadata:
    5. name: labelpod
    6. labels:
    7. app: nginx
    8. version: new
    9. spec:
    10. containers:
    11. - name: labelpod
    12. image: nginx:1.14.2
    13. ports:
    14. - containerPort: 80

    2. 在创建时指定两个label

            ·  app: nginx

            ·  version: new

    $ kubectl apply -f label-1.yml

    5、查看Label

    1. 通过命令 --show-label 可以查看指定对象的所有 label(级别相同逗号分隔)

    1. $ kubectl get pods --show-labels
    2. NAME READY STATUS RESTARTS AGE LABELS
    3. labelpod 1/1 Running 0 10s app=nginx,version=new

    2. 同样可以使用 label 指令在已创建的对象上添加标签

    1. $ kubectl label pods labelpod time=2022
    2. $ kubectl get pods --show-labels
    3. NAME READY STATUS RESTARTS AGE LABELS
    4. labelpod 1/1 Running 0 6m14s app=nginx,time=2022,version=new

    3. 修改已有key的value值(删除key 或者 --overwrite

    1. $ kubectl label pods labelpod time=2023
    2. error: 'time' already has a value (2022), and --overwrite is false
    3. '使用--overwrite选项覆盖原有的值'
    4. kiosk@k8s-master:~$ kubectl label pods labelpod time=2023 --overwrite
    5. pod/labelpod labeled
    6. kiosk@k8s-master:~$ kubectl get pods --show-labels
    7. NAME READY STATUS RESTARTS AGE LABELS
    8. labelpod 1/1 Running 0 12m app=nginx,time=2023,version=new
    1. $ kubectl label pods labelpod time- #删除标签的key
    2. pod/labelpod unlabeled
    3. $ kubectl label pods labelpod time=202211
    4. kiosk@k8s-master:~$ kubectl get pods --show-labels
    5. NAME READY STATUS RESTARTS AGE LABELS
    6. labelpod 1/1 Running 0 16m app=nginx,time=202211,version=new

    二、标签选择器(Label Selector)

    1、标签选择器(Label Selector)

    1. 标签不具备唯一性,在通常情况下,多个不同的对象有这相同的标签

    2. 通过标签选择器,用户或客户端可以指定批量的对象进行操作。

        标签选择器也是 kubernetes 的核心分组方式

    3. 目前支持两种标签选择器,

            基于等值的(equality-based)

            基于集合的(set-based)

    2、基于等值的标签选择器

    Equality-based 标签选择器允许用标签的key 和 value 过滤。

    有三种运算符可以使用,分别是'=' , '==' , 和 '!='

    前两种运算符同义,代表相等,后一种代表不相等 

            1. 查看有特定标签的对象

    1. $ kubectl get pods -l time=202211 --show-labels
    2. NAME READY STATUS RESTARTS AGE LABELS
    3. labelpod 1/1 Running 0 48m app=nginx,time=202211,version=new

            2. 查看不包括特定标签的对象

    $ kubectl get pods -l time!=202211 --show-labels

    3、基于集合的标签选择器

    1. Set-based 的标签条件允许用一组 value 来过滤 key。

        支持三种操作符:innotin  和  exists(仅针对于 key 符号)

    2. 两种标签选择器也可以混用,如:

            ·  partition in (customer A,customer B),enviornment != qa

    标签和选择算符

    4、标签选择器常用命令

    1. 查看对象的清单时,可以选择使用 -L 命令查看标签,或使用 -l 命令筛选对象

    2. 查看pod ,并显示app 标签的值

    1. 'L选项针对key(app)新增了一列打印出来'
    2. $ kubectl get pods --show-labels -L app
    3. NAME READY STATUS RESTARTS AGE APP LABELS
    4. labelpod 1/1 Running 0 169m nginx app=nginx,time=202211,version=new

    3. 筛选 pod 中标签为 app=nginx 的 pod

    1. ~$ kubectl get pods -l app=nginx
    2. NAME READY STATUS RESTARTS AGE
    3. labelpod 1/1 Running 0 174m

    5、将节点打上标签

    1. 为 k8s-worker1 打上标签

    $ kubectl label nodes k8s-worker1 env=test

    2. 查看节点上的 env 标签

    1. $ kubectl get nodes -L env
    2. NAME STATUS ROLES AGE VERSION ENV
    3. k8s-master Ready control-plane 59d v1.24.1
    4. k8s-worker1 Ready 59d v1.24.1 test
    5. k8s-worker2 NotReady 59d v1.24.1

    3. 也可以使用 --show-label 命令查看所有标签

            $ kubectl get nodes --show-label

    1. $ kubectl get nodes --show-labels
    2. NAME STATUS ROLES AGE VERSION LABELS
    3. k8s-worker1 Ready 59d v1.24.1 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,env=test,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-worker1,kubernetes.io/os=linux

    6、使用 Nodeselector 选择节点

    1. 编辑 yaml 文件,创建deployment

    1. $ vim deployment_label.yml
    2. apiVersion: apps/v1
    3. kind: Deployment
    4. metadata:
    5. name: nginx-deployment
    6. labels:
    7. app: nginx
    8. spec:
    9. replicas: 3
    10. selector:
    11. matchLabels:
    12. app: nginx
    13. template:
    14. metadata:
    15. labels:
    16. app: nginx
    17. spec:
    18. containers:
    19. - name: nginx
    20. image: nginx:1.14.2
    21. ports:
    22. - containerPort: 80
    23. nodeSelector:
    24. env: test
    25. $ kubectl apply -f deployment_label.yml

    2.查看pod 所在节点位置,可以看到创建出来的pod 都运行在 k8s-worker1上

    1. $ kubectl get pods -o wide
    2. NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
    3. nginx-deployment-678d4fd6d9-fsrpf 1/1 Running 0 40m 172.16.194.80 k8s-worker1
    4. nginx-deployment-678d4fd6d9-nglxn 1/1 Running 0 40m 172.16.194.87 k8s-worker1
    5. nginx-deployment-678d4fd6d9-rdk8q 1/1 Running 0 40m 172.16.194.81 k8s-worker1

     7、使用 Node affinity

    1. 使用集合的方式运行

    1. apiVersion: apps/v1
    2. kind: Deployment
    3. metadata:
    4. name: nginx-deployment
    5. labels:
    6. app: nginx
    7. spec:
    8. replicas: 3
    9. selector:
    10. matchLabels:
    11. app: nginx
    12. template:
    13. metadata:
    14. labels:
    15. app: nginx
    16. spec:
    17. containers:
    18. - name: nginx
    19. image: nginx:1.14.2
    20. ports:
    21. - containerPort: 80
    22. affinity:
    23. nodeAffinity:
    24. requiredDuringSchedulingIgnoredDuringExecution:
    25. nodeSelectorTerms:
    26. - matchExpressions:
    27. - key: env
    28. operator: In
    29. values:
    30. - test
    31. $ kubectl apply -f deployment_label.yml

    2. 查看 pod 运行节点,依然全部运行在 k8s-worker1 上

    1. $ kubectl get pods -o wide
    2. NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
    3. nginx-deployment-5787cb97df-jwc47 1/1 Running 0 34s 172.16.194.85 k8s-worker1
    4. nginx-deployment-5787cb97df-qn74w 1/1 Running 0 33s 172.16.194.88 k8s-worker1
    5. nginx-deployment-5787cb97df-whxsg 1/1 Running 0 30s 172.16.194.83 k8s-worker1
  • 相关阅读:
    香港第一金:美元指数昨晚拉高,不确定性加深金价下跌
    linux上lua版本的替换和luasocket的安装和使用
    Splunk: 使用btool 后台检查alert / fields / macros 配置
    PyTorch深度学习(二)【反向传播、用pytorch实现线性回归】
    leaflet+vue2实现地图交互
    全网最全 Chrome浏览器插件推荐大全 持续更新中
    Ubuntu 安装配置与调优 Docker 并支持 IPv6
    MyBatis + Servlet + JSP实现用户登录【JavaWeb、有数据库】
    机器人导航必备的栅格地图数学模型及使用
    【文献阅读】基于卷积神经网络的方法对感应电动机进行故障诊断
  • 原文地址:https://blog.csdn.net/qq_41619571/article/details/127579446