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)'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ethan-running

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值