• 10、Kubernetes核心技术 - Label标签


    目录

    一、概述

    二、Label Selector(标签选择器)

    1)、基于等值(Equality-based)

    2)、基于集合(Set-based)

    三、Label相关操作

    (1)、yaml文件定义标签

    (2)、查看标签

    (3)、筛选标签

    (4)、添加标签

    (5)、更新标签

    (6)、删除标签

    三、Label使用场景


    一、概述

    Label(标签)是Kubernetes系统中一个比较重要的概念,给某个资源对象(Node、Pod、Service等)定义一个Label,就相当于给它打了一个标签,然后可以通过Label Selector(标签选择器)查询和筛选拥有某些Label的资源对象,Kubernetes通过label对资源进行分区和管理。

    Label的特点:

    • 1)、一个Label是一个key=value的键值对,其中key与value由用户自己指定。Label可以被附加到各种资源对象上,例如Node、Pod、Service等。
    • 2)、一个资源对象可以定义任意数量的Label,同一个Label也可以被添加到任意数量的资源对象上。
    • 3)、Label通常在资源对象定义时确定,也可以在对象创建后动态添加或者删除。

    我们可以通过给指定的资源对象捆绑一个或多个不同的Label来实现多维度的资源分组管理功能,以便灵活、方便地进行资源分配、调度、配置、部署等管理工作。

    示例如下:这是一个有 environment: production 和 app: nginx 标签的 Pod 配置文件。

    1. apiVersion: v1
    2. kind: Pod
    3. metadata:
    4. name: label-demo
    5. labels: # 定义标签集合
    6. environment: production # 使用键值对方式定义
    7. app: nginx
    8. spec:
    9. containers:
    10. - name: nginx
    11. image: nginx:1.14.2
    12. ports:
    13. - containerPort: 80

    二、Label Selector(标签选择器)

    Label标签定义完毕之后,还要考虑到标签的选择,这就要使用到Label Selector(标签选择器),即:

    • Label用于给某个资源对象定义标签;
    • Label Selector用于查询和筛选拥有某些标签的资源对象;

    API 目前支持两种类型的选择算符:基于等值的基于集合的

    1)、基于等值(Equality-based)

    基于等值或基于不等值的需求允许按标签键和值进行过滤。 匹配对象必须满足所有指定的标签约束,尽管它们也可能具有其他标签。 可接受的运算符有 =、== 和 != 三种。 前两个表示相等(并且是同义词),而后者表示不相等。例如:

    • app = nginx:匹配所有具有标签app=nginx的资源对象;
    • environment != prod:匹配所有不具有标签environment = prod的资源对象,比如environment = dev、environment = qa等;

    2)、基于集合(Set-based)

    基于集合的标签需求允许你通过一组值来过滤键。 支持三种操作符:in、notin 和 exists(只可以用在键标识符上)。例如:

    • release in(stable, beta):匹配所有具有标签release = stable或者release = beta的资源对象;
    • tier not in(backend):匹配所有不具有标签tier = backend的资源对象;

    标签的选择条件可以使用多个,此时将多个Label Selector进行组合,使用逗号","进行分隔即可。例如app=nginx,environment!=prod、release in (stable, beta),app=nginx等等。

    复杂查询下Selector的示例:

    1. selector:
    2. matchLabels: # 由 {key,value} 对组成的映射
    3. app: nginx
    4. matchExpressions: # Pod 选择算符需求的列表
    5. # 可以使用的操作包括In、NotIn、Exists、DoesNotExist
    6. - { key: tier , operator: In , values: [frontend]}
    7. - { key: environment, operator: NotIn, values: [dev]}

    三、Label相关操作

    (1)、yaml文件定义标签

    以nginx Pod为例,Label被定义在其metadata中,如下图:

    然后我们就可以在Service、RC等管理对象中通过Label Selector(标签选择器)设置需要关联Pod的Label,如下图:

    (2)、查看标签

    kubectl get xxx 命令默认不会列出任何标签,使用 --show-labels 选项来查看。例如:

    1. $ kubectl get pod
    2. NAME READY STATUS RESTARTS AGE
    3. nginx-748c667d99-6d5s9 1/1 Running 0 35m
    4. $ kubectl get pod --show-labels
    5. NAME READY STATUS RESTARTS AGE LABELS
    6. nginx-748c667d99-6d5s9 1/1 Running 0 35m app=nginx,pod-template-hash=748c667d99
    7. $ kubectl get svc
    8. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
    9. kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 7d8h
    10. nginx NodePort 10.103.144.31 <none> 80:32327/TCP 34m
    11. $ kubectl get svc --show-labels
    12. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE LABELS
    13. kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 7d8h component=apiserver,provider=kubernetes
    14. nginx NodePort 10.103.144.31 <none> 80:32327/TCP 35m app=nginx

    (3)、筛选标签

    查看匹配标签条件的pod:

    1. $ kubectl get pod --show-labels
    2. NAME READY STATUS RESTARTS AGE LABELS
    3. nginx-748c667d99-6d5s9 1/1 Running 0 41m app=nginx,pod-template-hash=748c667d99
    4. $ kubectl get pod -l app=nginx
    5. NAME READY STATUS RESTARTS AGE
    6. nginx-748c667d99-6d5s9 1/1 Running 0 42m
    7. $ kubectl get pod -l app=nginx1
    8. No resources found in default namespace.

    查看匹配标签key的pod:

    1. $ kubectl get pod --show-labels
    2. NAME READY STATUS RESTARTS AGE LABELS
    3. nginx-748c667d99-6d5s9 1/1 Running 0 43m app=nginx,pod-template-hash=748c667d99
    4. $ kubectl get pod -L app
    5. NAME READY STATUS RESTARTS AGE APP
    6. nginx-748c667d99-6d5s9 1/1 Running 0 43m nginx
    7. $ kubectl get pod -L pod-template-hash
    8. NAME READY STATUS RESTARTS AGE POD-TEMPLATE-HASH
    9. nginx-748c667d99-6d5s9 1/1 Running 0 44m 748c667d99

    多个匹配条件之间使用逗号分开,多个条件之间是“and”关系。例如:

    1. # 选择release为stable或者beta的pod
    2. kubectl get pod -l 'release in (stable, beta)' --show-labels
    3. # 选择release为stable或者beta但不包括env=test的pod
    4. kubectl get pod -l env!=test,'release in (stable, beta)' --show-labels

    (4)、添加标签

    给名为nginx 的pod添加Label:environment=dev

    1. $ kubectl get pod --show-labels
    2. NAME READY STATUS RESTARTS AGE LABELS
    3. nginx-748c667d99-6d5s9 1/1 Running 0 45m app=nginx,pod-template-hash=748c667d99
    4. $ kubectl label pod nginx-748c667d99-6d5s9 environment=dev
    5. pod/nginx-748c667d99-6d5s9 labeled
    6. $ kubectl get pod --show-labels
    7. NAME READY STATUS RESTARTS AGE LABELS
    8. nginx-748c667d99-6d5s9 1/1 Running 0 46m app=nginx,environment=dev,pod-template-hash=748c667d99

    (5)、更新标签

    把名为nginx 的pod修改Label 为 environment=test,且覆盖现有的value。

    1. $ kubectl get pod --show-labels
    2. NAME READY STATUS RESTARTS AGE LABELS
    3. nginx-748c667d99-2trsf 1/1 Running 0 60s app=nginx,environment=dev,pod-template-hash=748c667d99
    4. #使用--overwrite覆盖
    5. $ kubectl label pod nginx-748c667d99-2trsf environment=test --overwrite
    6. pod/nginx-748c667d99-2trsf labeled
    7. $ kubectl get pod --show-labels
    8. NAME READY STATUS RESTARTS AGE LABELS
    9. nginx-748c667d99-2trsf 1/1 Running 0 2m12s app=nginx,environment=test,pod-template-hash=748c667d99

    注意,如果更新的时候标签不存在怎么处理呢?答案是会创建一个新的标签。例如:

    1. $ kubectl get pod --show-labels
    2. NAME READY STATUS RESTARTS AGE LABELS
    3. nginx-748c667d99-q2j2r 1/1 Running 0 44s app=nginx,env=test,pod-template-hash=748c667d99
    4. # 更新一个不存在的标签release=stable,那么k8s将会创建新的标签,自动添加上去
    5. $ kubectl label pod nginx-748c667d99-q2j2r release=stable --overwrite
    6. pod/nginx-748c667d99-q2j2r labeled
    7. $ kubectl get pod --show-labels
    8. NAME READY STATUS RESTARTS AGE LABELS
    9. nginx-748c667d99-q2j2r 1/1 Running 0 105s app=nginx,env=test,pod-template-hash=748c667d99,release=stable

    (6)、删除标签

    1. $ kubectl get pod --show-labels
    2. NAME READY STATUS RESTARTS AGE LABELS
    3. nginx-748c667d99-2trsf 1/1 Running 0 2m12s app=nginx,environment=test,pod-template-hash=748c667d99
    4. #标签名后面加个“-”就代表要删除该标签
    5. $ kubectl label pod nginx-748c667d99-2trsf environment-
    6. pod/nginx-748c667d99-2trsf unlabeled
    7. $ kubectl get pod --show-labels
    8. NAME READY STATUS RESTARTS AGE LABELS
    9. nginx-748c667d99-2trsf 1/1 Running 0 5m6s app=nginx,pod-template-hash=748c667d99

    除了给Pod添加Label之外,Service、Node等对象也是可以添加标签的,例如某个应用需要运行在一个或者多个固定的节点上,我们就可以给Node节点添加特定的Label,这样k8s调度的时候,只会将Pod调度到具有特定Label的节点上。

    三、Label使用场景

    一些常用的Label示例如下:

    • "release" : "stable", "release" : "canary"
    • "environment" : "dev", "environment" : "qa", "environment" : "production"
    • "tier" : "frontend", "tier" : "backend", "tier" : "cache"
    • "partition" : "customerA", "partition" : "customerB"
    • "track" : "daily", "track" : "weekly"

    有一些常用标签的例子;你可以任意制定自己的约定。 请记住,标签的 Key 对于给定对象必须是唯一的。

    Label Selector在Kubernetes中的重要使用场景如下。

    • kube-controller进程通过在资源对象RC上定义的Label Selector来筛选要监控的Pod副本数量,使Pod副本数量始终符合预期设定的全自动控制流程。
    • kube-proxy进程通过Service的Label Selector来选择对应的Pod,自动建立每个Service到对应Pod的请求转发路由表,从而实现Service的智能负载均衡机制。
    • 通过对某些Node定义特定的Label,并且在Pod定义文件中使用NodeSelector这种标签调度策略,kube-scheduler进程可以实现Pod定向调度的特性。
  • 相关阅读:
    数图可视化品类空间管理系统入编《零售门店数字化赋能专项报告(2024年)》
    超详细介绍如何使用 OpenCV 和 BGS 库进行背景扣除
    实验6 用例图
    mysql使用--分组查询
    JVM命令:jsp(找进程),jstack(线程栈),jmap(内存),jinfo(参数)
    nnunetv2训练报错 ValueError: mmap length is greater than file size
    LVS+Keepalived
    Pytorch CIFAR10图像分类 MobileNetv2篇
    iOS 15.5 被曝“偷跑”流量?苹果:建议恢复出厂设置
    jar解压修改后,如果再打成jar包
  • 原文地址:https://blog.csdn.net/Weixiaohuai/article/details/132719834