label 介绍
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" 的对象
创建 pod
创建一个 pod-nginx.yaml 文件,内容如下
apiVersion: v1 kind: Pod metadata: name: nginx namespace: zouzou # 前提是 zouzou 的命名空间要存在 spec: containers: - image: nginx:1.13 name: pod ports: - name: nginx-port containerPort: 80 protocol: TCP
创建 pod
kubectl apply -f pod-nginx.yaml -n zouzou
这样我们的 pod 就创建好了
查看标签
我们使用 kubectl get pod 的时候是没有显示标签的
[root@dce-10-6-215-215 ~]# kubectl get pod -n zouzou NAME READY STATUS RESTARTS AGE nginx 1/1 Running 0
如果要显示标签加上 --show-labels
# 加上 --show-labels 就可以查看标签了 kubectl get pod -n zouzou --show-labels
给 pod 打标签
# 格式如下 kubectl label pod pod名称 标签名=标签值 -n 命名空间名称 # 例子,给 nginx 的 pod 打了个标签 version=1.0,在命名空间 zouzou 下 kubectl label pod nginx version=1.0 -n zouzou
更新标签
# 格式如下 kubectl label pod pod名称 标签名=标签值 -n 命名空间名称 --overwrite # 例子,给 nginx 的 pod 更新标签,更新为 version=2.0,在命名空间 zouzou 下,更新的话必须加 --overwrite kubectl label pod nginx version=2.0 -n zouzou --overwrite
那如果更新的时候标签不存在怎么处理呢?答案是会创建一个标签
删除标签
上面我们更新标签的时候,写错了,多创建了一个 ve=2.0 的标签,我们就要删掉
# 格式如下,注意,标签名后面加个 - 就代表要删除该标签 kubectl label pod pod名称 标签名- -n 命名空间名称 # 例子,删除命名空间 zouzou 下 的 nginx pod 的 ve 标签 kubectl label pod nginx ve- -n zouzou
筛选标签
当我们有很多个 pod 的时候,每个 pod 又都有很多的标签,这时候我们想通过标签来进行筛选,更改 pod-nginx.yaml 文件,将 name 改为 nginx1
apiVersion: v1 kind: Pod metadata: name: nginx1 # 更改这里,name 不能重复 namespace: zouzou # 前提是 zouzou 的命名空间要存在 spec: containers: - image: nginx:1.13 name: pod ports: - name: nginx-port containerPort: 80 protocol: TCP
在创建 pod
给 nginx1 打上三个标签
# 先查看标签 [root@dce-10-6-215-215 ~]# kubectl get pod -n zouzou --show-labels NAME READY STATUS RESTARTS AGE LABELS nginx 1/1 Running 0 22m version=2.0 nginx1 1/1 Running 0 2m5s <none> # 给 nginx1 打上 version=1.0 的标签 [root@dce-10-6-215-215 ~]# kubectl label pod nginx1 version=1.0 -n zouzou pod/nginx1 labeled # 可以一次打多个标签,中间通过空格隔开 [root@dce-10-6-215-215 ~]# kubectl label pod nginx1 app=v1 name=ng -n zouzou pod/nginx1 labeled # 查看标签 [root@dce-10-6-215-215 ~]# kubectl get pod -n zouzou --show-labels NAME READY STATUS RESTARTS AGE LABELS nginx 1/1 Running 0 24m version=2.0 nginx1 1/1 Running 0 3m59s app=v1,name=ng,version=1.0
准备工作做好之后,我们就可以筛选了
# 格式如下,注意,-l 后面加筛选条件 kubectl get pod --show-labels -l 标签名=值 -n 命名空间名称 # 例子,筛选命名空间 zouzou 下 的 version=2.0 的标签 kubectl get pod --show-labels -l version=2.0 -n zouzou
通过配置的方式创建标签
上面我们通过 yaml 文件的方式创建的 pod,但没有在 yaml 里面写上标签,只是使用命令创建标签,我们可以在 yaml 里直接写上标签,pod-nginx.yaml 如下
apiVersion: v1 kind: Pod metadata: name: nginx2 # name 不能重复 namespace: zouzou # namespace 要存在 labels: # 下面有两个标签 version: "3.0" env: "test" spec: containers: - image: nginx:1.13 name: pod ports: - name: nginx-port containerPort: 80 protocol: TCP
创建
kubectl apply -f pod-nginx.yaml
这样我们就可以在创建 yaml 文件的时候配置好标签