Kubernetes入门 六、标签和选择器

news/2024/7/4 7:45:30 标签: kubernetes, 容器, 云原生

目录

  • 什么是标签
  • 为什么要使用标签?
  • 标签的语法
  • 标签选择器
  • 标签的操作
  • 示例

什么是标签

标签(Label)是附件在 Kubernetes 对象上的一组键值对,其意图是按照对用户有意义的方式来标识 Kubernetes 资源,同时,又不对 Kubernetes 的核心逻辑产生影响。

标签可以用来组织和选择一组 Kubernetes 对象。我们可以在创建 Kubernetes 对象的时候为其添加标签,也可以在创建以后为其添加标签。

每个 Kubernetes 对象可以有多个标签,但同一个对象的标签的 key 必须是唯一的。

示例:

metadata: 
  labels:   
    key1: value1   
    key2: value2

为什么要使用标签?

使用标签(Label)可以高效的查询和监听 Kubernetes 资源,在 Kubernetes 界面工具(如:Kubernetes DashBoard)和 kubectl 中,标签使用的非常普遍。

使用标签,用户可以按照自己期望的形式组织 Kubernetes 对象之间的结构,而无需对 Kubernetes 有任何修改。

应用程序的部署或者批处理程序的部署通常是多维度的(如:多个高可用分区、多个程序版本、多个微服务分层)。管理这些对象的时候,很多时候要针对某一个维护的条件做整体操作,如:将某个版本的程序整体删除。这种情况下,如果用户能够事先规划好标签的使用,再通过标签进行选择,就非常的便捷。

标签的语法

标签是一组键值对(key/value),标签的 key 有两个部分:可选的前缀和标签名,通过 / 分隔。

  1. 标签前缀:
    • 标签前缀部分是可选的。
    • 如果指定,必须是一个 DNS 的子域名,如:k8s.eip.work 。
    • 不能多余 253 个字符。
    • 使用 / 和标签名分隔。
  1. 标签名:
    • 标签名部分是必须的。
    • 不能多余 63 个字符。
    • 必须由字母、数字开始和结尾。
    • 可以包含字母、数字、减号(-)、下划线(_)、小数点(.)。

如果省略标签前缀,则标签的 key 就被认为是专属于用户的。Kubernetes 的系统组件(如:kube-scheduler、kube-controller-manager、kube-apiserver、kubectl 或其他第三方组件)向 Kubernetes 对象添加标签的时候,必须指定一个前缀。kubernetes.io/k8s.io/ 这两个前缀是 Kubernetes 核心组件预留的。

  1. 标签的 value :
    • 不能多于 63 个字符。
    • 可以为空字符串。
    • 如果不为空,则必须由字母、数字开始和结尾。
    • 如果不为空,可以包含字母、数字、减号(-)、下划线(_)、小数点(.)。

示例:

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels: # 标签
    app: nginx
    environment: prod 
spec:
  containers:
  - name: nginx
    image: nginx

标签选择器

通常来讲,会有多个 Kubernetes 对象包含相同的标签。通过使用标签选择器(label selector),用户/客户端可以选择一组对象。标签选择器是 Kubernetes 中最主要的分类和筛选手段。

Kubernetes 的 api-server 支持两种形式的标签选择器,equality-based 基于等式的set-based 基于集合的 。标签选择器可以包含多个条件,并使用逗号进行分隔,此时只要满足所有条件的 Kubernetes对象才会被选中。

  1. 基于等式的标签选择器,可以使用三种操作符 ===!=。前两个操作符含义是一样的,都代表相等;后一个操作符代表不相等。

    # 选择了标签名为 `environment` 且 标签值为 `production` 的Kubernetes对象
    kubectl get pods -l environment=production,tier=frontend
    
    # 选择了标签名为 `tier` 且标签值不等于 `frontend` 的对象,以及不包含标签 `tier` 的对象
    kubectl get pods -l tier != frontend
    
    # 选择所有包含 `partition` 标签的对象
    kubectl get pods -l partition
    
    # 选择所有不包含 `partition` 标签的对象
    kubectl get pods -l !partition
    
  2. 基于集合标签选择器,可以根据标签名的一组值进行筛选。支持的操作符有三种:in、notin、exists。

    # 选择所有的包含 `environment` 标签且值为 `production` 或 `qa` 的对象
    kubectl get pods -l environment in (production, qa)
    
    # 选择所有的 `tier` 标签不为 `frontend` 和 `backend`的对象,或不含 `tier` 标签的对象
    kubectl get pods -l tier notin (frontend, backend)
    
    # 选择包含 `partition` 标签(不检查标签值)且 `environment` 不是 `qa` 的对象
    kubectl get pods -l partition,environment notin (qa)
    

标签的操作

添加临时标签

kubectl label pod nginx-pod hello=world

更新标签

kubectl label pod nginx-pod hello=java --overwrite

删除标签

kubectl label pod nginx-pod hello-

示例

修改前面的yaml如下,添加标签:

apiVersion: v1 # api 文档版本
kind: Pod  # 资源对象类型,也可以配置为像Deployment、StatefulSet这一类的对象
metadata: # Pod 相关的元数据,用于描述 Pod 的数据
  name: nginx-pod # Pod 的名称
  labels: # 定义 Pod 的标签
    type: app # 自定义 label 标签,名字为 type,值为 app
    test: 1.0.0 # 自定义 label 标签,描述 Pod 版本号
  namespace: 'default' # 命名空间的配置
spec: # 期望 Pod 按照这里面的描述进行创建
  containers: # 对于 Pod 中的容器描述
  - name: nginx # 容器的名称
    image: nginx:1.7.9 # 指定容器的镜像
    imagePullPolicy: IfNotPresent # 镜像拉取策略,指定如果本地有就用本地的,如果没有就拉取远程的
    lifecycle: # 生命周期配置
      postStart: # 容器创建之后执行,如果失败会重启容器
        exec: # 在容器启动的时候,执行一条命令,修改掉Nginx的首页内容
          command: ["/bin/sh","-c","echo postStart ... > /usr/share/nginx/html/index.html"]
      preStop: # 容器终止之前执行,执行完成之后容器将成功终止,在其完成之前会阻塞删除容器的操作
        exec: # 在容器停止之前停止Nginx的服务
          command: ["/usr/sbin/nginx","-s","quit"]
    command: # 指定容器启动时执行的命令
    - nginx
    - -g
    - 'daemon off;' # nginx -g 'daemon off;'
    workingDir: /usr/share/nginx/html # 定义容器启动后的工作目录
    ports:
    - name: http # 端口名称
      containerPort: 80 # 描述容器内要暴露什么端口
      protocol: TCP # 描述该端口是基于哪种协议通信的
    env: # 环境变量
    - name: JVM_OPTS # 环境变量名称
      value: '-Xms128m -Xmx128m' # 环境变量的值
    resources:
      requests: # 最少需要多少资源
        cpu: 100m # 限制 cpu 最少使用 0.1 个核心
        memory: 128Mi # 限制内存最少使用 128兆
      limits: # 最多可以用多少资源
        cpu: 200m # 限制 cpu 最多使用 0.2 个核心
        memory: 256Mi # 限制 最多使用 256兆
  restartPolicy: OnFailure # 重启策略,只有失败的情况才会重启

容纳后创建Pod:

kubectl create -f nginx-label.yaml
# pod/nginx-pod created

然后可以查看Pod的标签:

kubectl get po --show-labels

结果如下:

NAME        READY   STATUS    RESTARTS   AGE   LABELS
nginx-pod   1/1     Running   0          77s   test=1.0.0,type=app

下面我临时加一个label:

kubectl label po nginx-pod env=dev1
# pod/nginx-pod labeled

结果如下:

kubectl get po --show-labels

NAME        READY   STATUS    RESTARTS   AGE     LABELS
nginx-pod   1/1     Running   0          4m57s   env=dev1,test=1.0.0,type=app

注意:这种临时加的标签,下次重新创建Pod时就没有了,如果想还有,在yaml文件中加。

下面看看如何使用标签选择器查询:

# 单个标签查询
kubectl get po -l type=app
 
# 多个标签查询
kubectl get po -l type=app,env=dev1

# in查询
kubectl get po -l 'type in (app, web)'

http://www.niftyadmin.cn/n/4946690.html

相关文章

安科瑞AcrelEMS-EV汽车厂房管理系统是一个深度集成的自动化平台-安科瑞黄安南

平台概述 AcrelEMS-EV汽车厂房能效管理平台集变电站综合自动化、电力监控、电气安全、电能质量分析及治理、能耗管理、能效分析、照明控制、充电桩运营管理、设备运维于一体,为建立可靠、安全的工厂能源管理体系提供数据支持。通过一个平台、一个APP整体的对企业用…

String底层Hashtable结构的说明

字符串常量池中是不会存储相同的字符串的。 String的String Pool是一个固定大小的Hashtable,默认值大小长度是1009.如果放进String Pool的String非常多,就会造成Hash冲突严重,从而导致链表会很长,而链表长了后直接会造成的影响就是…

virtualbox桥接网卡启动报错Failed to attach the network LUN的可能解决方法

问题描述 使用桥接网卡启动报错,使用NAT不报错 解决 重新安装桥接网卡驱动 卸载 重新安装 https://www.cnblogs.com/zwjphp/p/10406294.html 参考 https://forums.virtualbox.org/viewtopic.php?f6&t51069

干翻Dubbo系列第十一篇:Dubbo常见协议与通信效率对比

文章目录 文章说明 一:协议 1:什么是协议 2:协议和序列化关系 3:协议组成 (一):头信息 (二):体信息 4:Dubbo3中常见的协议 5:…

Android JNI传递CallBack接口并接收回调

在JNI中,可以通过传递一个Java接口对象的引用给C代码,并在C代码中调用该接口对象的方法,实现JAVA层监听C数据变化,下面是一个简单的示例: 在Java代码中定义一个CallBack接口和JNI方法 class TestLib {companion objec…

[管理与领导-26]:IT基层管理者 - 团队管理 - 育人 - 如何培养团队?如何成为教练式管理者?

目录 一、教练式管理? 1.1 什么是教练式管理 1.2 特点 二、教练式管理与传统管理的区别? 三、从传统的管理转型为教练式管理 四、教练式提问 一、教练式管理? 1.1 什么是教练式管理 教练式管理是一种以引导、激励和发展员工为核心的管…

[管理与领导-24]:IT基层管理者 - 团队管理 - 管理者如何应对团队中几种难搞和沟通的人员

目录 前言: 一、通用的解决策略 二、专用策略 2.1 如何管理“老油条” 2.2 如何管理懒惰型员工 2.3 如何管理内向害羞型 2.4 如何管理防卫型员工 2.5 如何管理受害者型员工 2.6 如何管理“一点就着,暴躁型” 2.7 如何管理佛系员工 前言&#x…

介绍瀑布模式:经典的软件开发项目管理方法

瀑布模式,是指项目开发像瀑布一样从上到下单向行驶的开发方式。 它的问题是:当需求不明确时,会出问题。 这个需求不合理?不行,我们已经过了功能需求的设定期,不能改我们的测试有问题?不行&…