这里介绍Kubernetes中基本概念——Label标签、Annotation注解、Namespace命名空间
Label 标签
Label 标签是一种简单却功能强大的K8s特性,其不仅适用于Pod,也可以适用于其他的K8s资源。简单来说,Label 标签就是附加到资源上的任意键值对
添加标签
可以在创建资源的Yaml文件中指定标签信息
1 | apiVersion: v1 |
效果如下所示
也可以直接对现有Pod添加标签
1 | # 给指定Pod添加标签 |
效果如下所示
修改标签
修改现有Pod的标签信息,类似于添加标签的命令。只需添加—overwrite选项即可
1 | # 将指定Pod的标签值修改为指定值 |
效果如下所示
删除标签
删除现有Pod的标签信息,只需指定欲删除标签的名称,并在后面添加一个减号即可
1 | # 对指定Pod,删除指定的标签 |
效果如下所示
查看标签
查看资源时,可通过—show-labels选项实现查看所有标签信息
1 | # 查看所有Pod资源, 同时展示所有标签信息 |
效果如下所示
查看资源时,可通过-L选项实现查看感兴趣的标签信息
1 | # 查看所有Pod资源, 同时展示指定标签名的标签信息 |
效果如下所示
标签选择器
标签只是附属在K8s资源上的附加信息。其配合标签选择器才能真正体现价值。这里我们利用标签选择器来过滤资源。具体地,我们在查看资源时通过-l选项实现通过标签选择器进行过滤
1. 包含指定名称的标签
1 | # 查看包含指定标签名称的Pod,不论标签的值是什么 |
效果如下所示
2. 不包含指定名称的标签
如果期望查看包含不指定标签名称的Pod、不论标签的值是什么的时候,可以将!选择运算符加在标签名称的前面。由于!在Shell中存在特殊含义。故我们还需使用单引号来避免Shell对其进行特殊处理
1 | # 查看包含不指定标签名称的Pod,不论标签的值是什么 |
效果如下所示
3. 包含指定名称的标签 且 标签值为指定值
可以使用=选择运算符,选择出包含指定名称的标签 且 标签值为指定值的资源
1 | # 查看Pod,条件为包含指定名称的标签 且 标签值为指定值 |
效果如下所示
此外,如果标签的值只需满足若干指定值中任意一个。还可以使用in运算符。同理,这里也需要使用单引号
1 | # 查看Pod,条件为包含指定标签名称的Pod 且 标签值位于指定值集合当中 |
效果如下所示
4. 不包含 指定名称的标签的值与指定值相同
可以使用!=选择运算符,选择出不包含 指定名称的标签的值与指定值相同。这里其实会选择出两种类型的资源
- 资源存在指定名称的标签,但值与指定值不同
- 资源不存在指定名称的标签
1 | # 查看Pod,条件为 不包含 指定名称的标签的值与指定值相同 |
效果如下所示
类似地,这里的值也可以是一个范围值。即标签的值不能是若干指定值中的任意一个。还可以使用notin运算符。同理,这里也需要使用单引号
1 | # 查看Pod,条件为 不包含 指定名称的标签的值与任意一个指定值相同 |
效果如下所示
Annotation 注解
Annotation注解和标签很类似,其同样是一个键值对。但目的是将非标识性的元数据附加到K8s资源对象上,以便客户端程序(例如工具和库)能够获取这些元数据信息。故在注解中不存在所谓的注解选择器
添加注解
可以在创建资源的Yaml文件中指定注解信息
1 | apiVersion: v1 |
效果如下
也可以直接对现有Pod添加注解
1 | # 给指定Pod添加注解 |
效果如下所示
修改注解
修改现有Pod的注解信息,类似于添加注解的命令。只需添加—overwrite选项即可
1 | # 将指定Pod的注解值修改为指定值 |
效果如下所示
删除注解
删除现有Pod的注解信息,只需指定欲删除注解的名称,并在后面添加一个减号即可
1 | # 对指定Pod,删除指定的注解 |
效果如下所示
查看注解
可借助于kubectl describe命令查看注解信息
1 | kubectl describe <Pod名称> |
效果如下所示
而如果使用kubectl get命令查看Json形式的Pod信息,我们会发现注解信息位于.metadata.annotations项中。故我们还可以使用-o jsonpath选项指定注解的路径来直接查看
1 | # 查看指定Pod的注解信息 |
效果如下所示
Namespace 命名空间
命名空间为K8s资源对象的名称提供了一个作用域。一方面避免了资源名称的冲突;另一方面,通过合理的分组实现科学管理,避免误操作不属于自己的资源
查看命名空间
1 | kubectl get ns |
效果如下所示。注意,当kubectl命令、Yaml配置文件均未指定命名空间。故其默认会使用名为default的命名空间
创建命名空间
显然可以通过Yaml配置文件来创建命名空间资源
1 | apiVersion: v1 |
效果如下所示
还可以通过命令直接创建
1 | # 创建指定名称的命名空间 |
效果如下所示
使用命名空间
前面提到,如果未指定命名空间则会默认使用名为default的命名空间。如果期望使用指定的命名空间,可通过两种方式实现。创建资源时我们可以直接在Yaml配置文件中指定命名空间的名称,如下所示
1 | apiVersion: v1 |
效果如下所示
另外创建资源时我们也可以不在配置文件指定命名空间,而是在kubectl create命令后添加 -n <命名空间名称> 选项实现。通常,我们在管理(编辑、查看、删除等)其他命名空间中的资源时,都需要通过-n选项显式指定命名空间的名称。效果如下所示
清空命名空间
可通过下述命令,实现删除指定命名空间下的(几乎)所有资源。即相当于将该命名空间进行了清空。但需要说明的是某些特殊资源可能并不会删除,需要我们显式地指定删除
1 | # 删除指定命名空间下的(几乎)所有资源 |
效果如下所示
删除命名空间
1 | # 删除指定名称的命名空间 |
效果如下所示。命名空间删除后,该命名空间下Pod显然也会伴随命名空间自动删除
参考文献
- Kubernetes in Action中文版 Marko Luksa著
- 深入剖析Kubernetes 张磊著