持续创作,加速成长!这是我参与「掘金日新计划 · 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组。。。这也是标签。这样参照理解起来就方便了,一句话,标签就是用来分组,方便管理的。