Kubernetes基本概念之Label、Annotation、Namespace

这里介绍Kubernetes中基本概念——Label标签、Annotation注解、Namespace命名空间

abstract.png

Label 标签

Label 标签是一种简单却功能强大的K8s特性,其不仅适用于Pod,也可以适用于其他的K8s资源。简单来说,Label 标签就是附加到资源上的任意键值对

添加标签

可以在创建资源的Yaml文件中指定标签信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
apiVersion: v1
# 资源类型
kind: Pod
metadata:
# Pod 名称
name: my-bootcamp-pod-2-label
# Pod的标签信息
labels:
creation_method: manual
env: prod
spec:
# 容器信息
containers:
# 一个名为my-bootcamp-2-label的容器
- name: my-bootcamp-2-label
# 镜像信息
image: jocatalin/kubernetes-bootcamp:v1
# 仅用于展示容器所使用的端口
ports:
- containerPort: 8080
protocol: TCP

效果如下所示

figure 1.jpeg

也可以直接对现有Pod添加标签

1
2
3
4
5
# 给指定Pod添加标签
kubectl label pod <Pod名称> <标签的键>=<标签的值>

# 给名为my-bootcamp-pod-2的Pod添加名为env、值为prod的标签
kubectl label pod my-bootcamp-pod-2 env=prod

效果如下所示

figure 2.jpeg

修改标签

修改现有Pod的标签信息,类似于添加标签的命令。只需添加—overwrite选项即可

1
2
3
4
5
# 将指定Pod的标签值修改为指定值
kubectl label pod <Pod名称> <标签的键>=<标签的新值> --overwrite

# 将名为my-bootcamp-pod-2的Pod的名为env的标签值修改为test
kubectl label pod my-bootcamp-pod-2 env=test --overwrite

效果如下所示

figure 3.jpeg

删除标签

删除现有Pod的标签信息,只需指定欲删除标签的名称,并在后面添加一个减号即可

1
2
3
4
5
# 对指定Pod,删除指定的标签
kubectl label pod <Pod名称> <标签的键>-

# 对名为my-bootcamp-pod-2-label的Pod, 删除名为creation_method的标签
kubectl label pod my-bootcamp-pod-2-label creation_method-

效果如下所示

figure 4.jpeg

查看标签

查看资源时,可通过—show-labels选项实现查看所有标签信息

1
2
# 查看所有Pod资源, 同时展示所有标签信息
kubectl get pod --show-labels

效果如下所示

figure 5.jpeg

查看资源时,可通过-L选项实现查看感兴趣的标签信息

1
2
# 查看所有Pod资源, 同时展示指定标签名的标签信息
kubectl get pod -L <标签名1>,<标签名2>,<标签名3>

效果如下所示

figure 6.jpeg

标签选择器

标签只是附属在K8s资源上的附加信息。其配合标签选择器才能真正体现价值。这里我们利用标签选择器来过滤资源。具体地,我们在查看资源时通过-l选项实现通过标签选择器进行过滤

1. 包含指定名称的标签

1
2
3
4
5
# 查看包含指定标签名称的Pod,不论标签的值是什么
kubectl get pod -l <标签名称>

# 查看包含名为author标签名称的Pod,不论标签的值是什么
kubectl get pod -l author

效果如下所示

figure 7.jpeg

2. 不包含指定名称的标签

如果期望查看包含不指定标签名称的Pod、不论标签的值是什么的时候,可以将!选择运算符加在标签名称的前面。由于!在Shell中存在特殊含义。故我们还需使用单引号来避免Shell对其进行特殊处理

1
2
3
4
5
# 查看包含不指定标签名称的Pod,不论标签的值是什么
kubectl get pod -l '!<标签名称>'

# 查看不包含名为author标签名称的Pod,不论标签的值是什么
kubectl get pod -l '!author'

效果如下所示

figure 8.jpeg

3. 包含指定名称的标签 且 标签值为指定值

可以使用=选择运算符,选择出包含指定名称的标签 且 标签值为指定值的资源

1
2
3
4
5
# 查看Pod,条件为包含指定名称的标签 且 标签值为指定值
kubectl get pod -l <标签名称>=<标签的值>

# 查看Pod,条件为包含名为Author的标签 且 其值为Aaron
kubectl get pod -l author=Aaron

效果如下所示

figure 9.jpeg

此外,如果标签的值只需满足若干指定值中任意一个。还可以使用in运算符。同理,这里也需要使用单引号

1
2
3
4
5
# 查看Pod,条件为包含指定标签名称的Pod 且 标签值位于指定值集合当中
kubectl get pod -l '<标签名称> in (<标签的值1>, <标签的值2>, <标签的值3>)'

# 查看Pod,条件为包含名为Author的标签 且 其值在Tom、Bob、Aaron范围当中
kubectl get pod -l 'author in (Tom,Bob,Aaron)'

效果如下所示

figure 10.jpeg

4. 不包含 指定名称的标签的值与指定值相同

可以使用!=选择运算符,选择出不包含 指定名称的标签的值与指定值相同。这里其实会选择出两种类型的资源

  1. 资源存在指定名称的标签,但值与指定值不同
  2. 资源不存在指定名称的标签
1
2
3
4
5
# 查看Pod,条件为 不包含 指定名称的标签的值与指定值相同
kubectl get pod -l '<标签的名称>!=<标签的值>'

# 查看Pod,条件为 不包含 名为Author的标签的值为Aaron
kubectl get pod -l 'author!=Aaron'

效果如下所示

figure 11.jpeg

类似地,这里的值也可以是一个范围值。即标签的值不能是若干指定值中的任意一个。还可以使用notin运算符。同理,这里也需要使用单引号

1
2
3
4
5
# 查看Pod,条件为 不包含 指定名称的标签的值与任意一个指定值相同
kubectl get pod -l '<标签名称> notin (<标签的值1>, <标签的值2>, <标签的值3>)'

# 查看Pod,条件为 名为Author的标签的值不能是Tom、Bob、Aaron中的任意一个
kubectl get pod -l 'author notin (Tom,Bob,Aaron)'

效果如下所示

figure 12.jpeg

Annotation 注解

Annotation注解和标签很类似,其同样是一个键值对。但目的是将非标识性的元数据附加到K8s资源对象上,以便客户端程序(例如工具和库)能够获取这些元数据信息。故在注解中不存在所谓的注解选择器

添加注解

可以在创建资源的Yaml文件中指定注解信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
apiVersion: v1
# 资源类型
kind: Pod
metadata:
# Pod 名称
name: my-bootcamp-pod-2-annotation
# Pod的注解信息
annotations:
my.Author: "Aaron Zhu"
my.Age: "18"
spec:
# 容器信息
containers:
# 一个名为my-bootcamp-2-annotation的容器
- name: my-bootcamp-2-annotation
# 镜像信息
image: jocatalin/kubernetes-bootcamp:v1
# 仅用于展示容器所使用的端口
ports:
- containerPort: 8080
protocol: TCP

效果如下

figure 13.jpeg

也可以直接对现有Pod添加注解

1
2
3
4
5
# 给指定Pod添加注解
kubectl annotate pod <Pod名称> <注解的键>=<注解的值>

# 给名为my-bootcamp-pod-2的Pod添加名为name、值为hello的注解
kubectl annotate pod my-bootcamp-pod-2 name=hello

效果如下所示

figure 14.jpeg

修改注解

修改现有Pod的注解信息,类似于添加注解的命令。只需添加—overwrite选项即可

1
2
3
4
5
# 将指定Pod的注解值修改为指定值
kubectl annotate pod <Pod名称> <注解的键>=<注解的新值> --overwrite

# 将名为my-bootcamp-pod-2的Pod的名为name的注解值修改为hi
kubectl annotate pod my-bootcamp-pod-2 name=hi --overwrite

效果如下所示

figure 15.jpeg

删除注解

删除现有Pod的注解信息,只需指定欲删除注解的名称,并在后面添加一个减号即可

1
2
3
4
5
# 对指定Pod,删除指定的注解
kubectl annotate pod <Pod名称> <注解的键>-

# 对名为my-bootcamp-pod-2的Pod, 删除名为name的注解
kubectl annotate pod my-bootcamp-pod-2 name-

效果如下所示

figure 16.jpeg

查看注解

可借助于kubectl describe命令查看注解信息

1
kubectl describe <Pod名称>

效果如下所示

figure 17.jpeg

而如果使用kubectl get命令查看Json形式的Pod信息,我们会发现注解信息位于.metadata.annotations项中。故我们还可以使用-o jsonpath选项指定注解的路径来直接查看

1
2
# 查看指定Pod的注解信息
kubectl get pod <Pod名称> -o jsonpath='{.metadata.annotations}'

效果如下所示

figure 18.jpeg

Namespace 命名空间

命名空间为K8s资源对象的名称提供了一个作用域。一方面避免了资源名称的冲突;另一方面,通过合理的分组实现科学管理,避免误操作不属于自己的资源

查看命名空间

1
kubectl get ns

效果如下所示。注意,当kubectl命令、Yaml配置文件均未指定命名空间。故其默认会使用名为default的命名空间

figure 19.png

创建命名空间

显然可以通过Yaml配置文件来创建命名空间资源

1
2
3
4
5
6
apiVersion: v1
# 资源类型: 命名空间
kind: Namespace
metadata:
# 命名空间的名称
name: custom-namespace-1

效果如下所示

figure 20.jpeg

还可以通过命令直接创建

1
2
# 创建指定名称的命名空间
kubectl create ns <命名空间名称>

效果如下所示

figure 21.jpeg

使用命名空间

前面提到,如果未指定命名空间则会默认使用名为default的命名空间。如果期望使用指定的命名空间,可通过两种方式实现。创建资源时我们可以直接在Yaml配置文件中指定命名空间的名称,如下所示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
apiVersion: v1
# 资源类型
kind: Pod
metadata:
# Pod 名称
name: my-bootcamp-pod-1
# 命名空间名称
namespace: custom-namespace-1
spec:
# 容器信息
containers:
# 一个名为my-bootcamp-1的容器
- name: my-bootcamp-1
# 镜像信息
image: jocatalin/kubernetes-bootcamp:v1
# 仅用于展示容器所使用的端口
ports:
- containerPort: 8080
protocol: TCP

效果如下所示

figure 22.jpeg

另外创建资源时我们也可以不在配置文件指定命名空间,而是在kubectl create命令后添加 -n <命名空间名称> 选项实现。通常,我们在管理(编辑、查看、删除等)其他命名空间中的资源时,都需要通过-n选项显式指定命名空间的名称。效果如下所示

figure 23.jpeg

清空命名空间

可通过下述命令,实现删除指定命名空间下的(几乎)所有资源。即相当于将该命名空间进行了清空。但需要说明的是某些特殊资源可能并不会删除,需要我们显式地指定删除

1
2
3
4
# 删除指定命名空间下的(几乎)所有资源
# 第一个all 指定所有的资源类型
# 第二个all 指定所有的资源实例
kubectl delete all --all -n <命名空间名称>

效果如下所示

figure 24.jpeg

删除命名空间

1
2
# 删除指定名称的命名空间
kubectl delete ns <命名空间的名称>

效果如下所示。命名空间删除后,该命名空间下Pod显然也会伴随命名空间自动删除

figure 25.jpeg

参考文献

  1. Kubernetes in Action中文版 Marko Luksa著
  2. 深入剖析Kubernetes 张磊著
0%