k8s入门知识之Label

172 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6天,点击查看活动详情

1、背景

上一篇文章中我们了解了一些关于Pod的基本知识和操作,今天咱们来继续学习k8s中的Label。

2、简介

Label是kubernetes系统中的一个重要概念。它的作用就是在资源上添加标识,用来对它们进行区分和选择。 关于Label它有如下的特点:

  • 一个Label会以key/value键值对的形式附加到各种对象上,如Node、Pod、Service等等
  • 一个资源对象可以定义任意数量的Label ,同一个Label也可以被添加到任意数量的资源对象上去
  • Label通常在资源对象定义时确定,当然也可以在对象创建后动态添加或者删除 我们可以通过Label实现资源的多维度分组,以便灵活、方便地进行资源分配、调度、配置、部署等管理工作。我们常用的一些Label示例如下:
  • 版本标签:"version":"release", "version":"stable"......
  • 环境标签:"environment":"dev","environment":"test","environment":"pro"
  • 架构标签:"tier":"frontend","tier":"backend" 标签定义完毕之后,还要考虑到标签的选择,这就要使用到Label Selector,即: Label用于给某个资源对象定义标识,Label Selector用于查询和筛选拥有某些标签的资源对象,当前有两种Label Selector:
  • 基于等式的Label Selector name = slave: 选择所有包含Label中key="name"且value="slave"的对象

env != production: 选择所有包括Label中的key="env"且value不等于"production"的对象

  • 基于集合的Label Selector name in (master, slave): 选择所有包含Label中的key="name"且value="master"或"slave"的对象

name not in (frontend): 选择所有包含Label中的key="name"且value不等于"frontend"的对象 标签的选择条件可以使用多个,此时将多个Label Selector进行组合,使用逗号","进行分隔即可。例如: name=slave,env!=production

name not in (frontend),env!=production

3、命令

3.1、为pod资源打标签

[root@master ~]# kubectl label pod nginx-pod version=1.0 -n dev
pod/nginx-pod labeled

3.2、为pod资源更新标签

[root@master ~]# kubectl label pod nginx-pod version=2.0 -n dev --overwrite
pod/nginx-pod labeled

3.3、查看标签

[root@master ~]# kubectl get pod nginx-pod  -n dev --show-labels
NAME        READY   STATUS    RESTARTS   AGE   LABELS
nginx-pod   1/1     Running   0          10m   version=2.0

3.4、筛选标签

[root@master ~]# kubectl get pod -n dev -l version=2.0  --show-labels
NAME        READY   STATUS    RESTARTS   AGE   LABELS
nginx-pod   1/1     Running   0          17m   version=2.0
[root@master ~]# kubectl get pod -n dev -l version!=2.0 --show-labels
No resources found in dev namespace.

3.5、删除标签

[root@master ~]# kubectl label pod nginx-pod version- -n dev
pod/nginx-pod labeled

3.6、配置方式

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: dev
  labels:
    version: "3.0" 
    env: "test"
spec:
  containers:
  - image: nginx:latest
    name: pod
    ports:
    - name: nginx-port
      containerPort: 80
      protocol: TCP

4、总结

标签相对来说比较容易理解,它本身独立存在是没有任何含义的,只有和K8S中的资源对象结合起来才有其真正的用途。

简单来说就是分组的作用,就像平时的生活中对人,对物进行分组管理一样。举个栗子: 在一个学校中,有无数多的人员,如果不给这些人员分组,给定一些固定的身份,那么管理起来是非常麻烦的。所以我们给他们一个身份(这里的身份就是标签),比如有老师、学生、后勤人员等等,分组之后学生还是特别多,还是不好管理,然后我们可以继续分组(指定标签),学生有年纪、班级等,又给学生打上分组标签,这样管理起来就方便多了,上课以班级为组织,那班级内部又可以分组,A组,B组,C组。。。这也是标签。这样参照理解起来就方便了,一句话,标签就是用来分组,方便管理的。