这里介绍Kubernetes中基本概念——Label标签、Annotation注解、Namespace命名空间
Label 标签
Label 标签是一种简单却功能强大的K8s特性,其不仅适用于Pod,也可以适用于其他的K8s资源。简单来说,Label 标签就是附加到资源上的任意键值对
添加标签
可以在创建资源的Yaml文件中指定标签信息
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
效果如下所示
也可以直接对现有Pod添加标签
# 给指定Pod添加标签
kubectl label pod <Pod名称> <标签的键>=<标签的值>
# 给名为my-bootcamp-pod-2的Pod添加名为env、值为prod的标签
kubectl label pod my-bootcamp-pod-2 env=prod
效果如下所示
修改标签
修改现有Pod的标签信息,类似于添加标签的命令。只需添加–overwrite选项即可
# 将指定Pod的标签值修改为指定值
kubectl label pod <Pod名称> <标签的键>=<标签的新值> --overwrite
# 将名为my-bootcamp-pod-2的Pod的名为env的标签值修改为test
kubectl label pod my-bootcamp-pod-2 env=test --overwrite
效果如下所示
删除标签
删除现有Pod的标签信息,只需指定欲删除标签的名称,并在后面添加一个减号即可
# 对指定Pod,删除指定的标签
kubectl label pod <Pod名称> <标签的键>-
# 对名为my-bootcamp-pod-2-label的Pod, 删除名为creation_method的标签
kubectl label pod my-bootcamp-pod-2-label creation_method-
效果如下所示
查看标签
查看资源时,可通过–show-labels选项实现查看所有标签信息
# 查看所有Pod资源, 同时展示所有标签信息
kubectl get pod --show-labels
效果如下所示
查看资源时,可通过-L选项实现查看感兴趣的标签信息
# 查看所有Pod资源, 同时展示指定标签名的标签信息
kubectl get pod -L <标签名1>,<标签名2>,<标签名3>
效果如下所示
标签选择器
标签只是附属在K8s资源上的附加信息。其配合标签选择器才能真正体现价值。这里我们利用标签选择器来过滤资源。具体地,我们在查看资源时通过-l选项实现通过标签选择器进行过滤
「1. 包含指定名称的标签」
# 查看包含指定标签名称的Pod,不论标签的值是什么
kubectl get pod -l <标签名称>
# 查看包含名为author标签名称的Pod,不论标签的值是什么
kubectl get pod -l author
效果如下所示
「2. 不包含指定名称的标签」
如果期望查看包含不指定标签名称的Pod、不论标签的值是什么的时候,可以将!选择运算符加在标签名称的前面。由于!在Shell中存在特殊含义。故我们还需使用单引号来避免Shell对其进行特殊处理
# 查看包含不指定标签名称的Pod,不论标签的值是什么
kubectl get pod -l '!<标签名称>'
# 查看不包含名为author标签名称的Pod,不论标签的值是什么
kubectl get pod -l '!author'
效果如下所示
「3. 包含指定名称的标签 且 标签值为指定值」
可以使用=选择运算符,选择出包含指定名称的标签 且 标签值为指定值的资源
# 查看Pod,条件为包含指定名称的标签 且 标签值为指定值
kubectl get pod -l <标签名称>=<标签的值>
# 查看Pod,条件为包含名为Author的标签 且 其值为Aaron
kubectl get pod -l author=Aaron
效果如下所示
此外,如果标签的值只需满足若干指定值中任意一个。还可以使用in运算符。同理,这里也需要使用单引号
# 查看Pod,条件为包含指定标签名称的Pod 且 标签值位于指定值集合当中
kubectl get pod -l '<标签名称> in (<标签的值1>, <标签的值2>, <标签的值3>)'
# 查看Pod,条件为包含名为Author的标签 且 其值在Tom、Bob、Aaron范围当中
kubectl get pod -l 'author in (Tom,Bob,Aaron)'
效果如下所示
「4. 不包含 指定名称的标签的值与指定值相同」
可以使用!=选择运算符,选择出不包含 指定名称的标签的值与指定值相同。这里其实会选择出两种类型的资源
-
资源存在指定名称的标签,但值与指定值不同 -
资源不存在指定名称的标签
# 查看Pod,条件为 不包含 指定名称的标签的值与指定值相同
kubectl get pod -l '<标签的名称>!=<标签的值>'
# 查看Pod,条件为 不包含 名为Author的标签的值为Aaron
kubectl get pod -l 'author!=Aaron'
效果如下所示
类似地,这里的值也可以是一个范围值。即标签的值不能是若干指定值中的任意一个。还可以使用notin运算符。同理,这里也需要使用单引号
# 查看Pod,条件为 不包含 指定名称的标签的值与任意一个指定值相同
kubectl get pod -l '<标签名称> notin (<标签的值1>, <标签的值2>, <标签的值3>)'
# 查看Pod,条件为 名为Author的标签的值不能是Tom、Bob、Aaron中的任意一个
kubectl get pod -l 'author notin (Tom,Bob,Aaron)'
效果如下所示
Annotation 注解
Annotation注解和标签很类似,其同样是一个键值对。但目的是将非标识性的元数据附加到K8s资源对象上,以便客户端程序(例如工具和库)能够获取这些元数据信息。故在注解中不存在所谓的注解选择器
添加注解
可以在创建资源的Yaml文件中指定注解信息
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
效果如下
也可以直接对现有Pod添加注解
# 给指定Pod添加注解
kubectl annotate pod <Pod名称> <注解的键>=<注解的值>
# 给名为my-bootcamp-pod-2的Pod添加名为name、值为hello的注解
kubectl annotate pod my-bootcamp-pod-2 name=hello
效果如下所示
修改注解
修改现有Pod的注解信息,类似于添加注解的命令。只需添加–overwrite选项即可
# 将指定Pod的注解值修改为指定值
kubectl annotate pod <Pod名称> <注解的键>=<注解的新值> --overwrite
# 将名为my-bootcamp-pod-2的Pod的名为name的注解值修改为hi
kubectl annotate pod my-bootcamp-pod-2 name=hi --overwrite
效果如下所示
删除注解
删除现有Pod的注解信息,只需指定欲删除注解的名称,并在后面添加一个减号即可
# 对指定Pod,删除指定的注解
kubectl annotate pod <Pod名称> <注解的键>-
# 对名为my-bootcamp-pod-2的Pod, 删除名为name的注解
kubectl annotate pod my-bootcamp-pod-2 name-
效果如下所示
查看注解
可借助于kubectl describe命令查看注解信息
kubectl describe <Pod名称>
效果如下所示
而如果使用kubectl get命令查看Json形式的Pod信息,我们会发现注解信息位于.metadata.annotations项中。故我们还可以使用-o jsonpath选项指定注解的路径来直接查看
# 查看指定Pod的注解信息
kubectl get pod <Pod名称> -o jsonpath='{.metadata.annotations}'
效果如下所示
Namespace 命名空间
命名空间为K8s资源对象的名称提供了一个作用域。一方面避免了资源名称的冲突;另一方面,通过合理的分组实现科学管理,避免误操作不属于自己的资源
查看命名空间
kubectl get ns
效果如下所示。注意,当kubectl命令、Yaml配置文件均未指定命名空间。故其默认会使用名为default的命名空间
创建命名空间
显然可以通过Yaml配置文件来创建命名空间资源
apiVersion: v1
# 资源类型: 命名空间
kind: Namespace
metadata:
# 命名空间的名称
name: custom-namespace-1
效果如下所示
还可以通过命令直接创建
# 创建指定名称的命名空间
kubectl create ns <命名空间名称>
效果如下所示
使用命名空间
前面提到,如果未指定命名空间则会默认使用名为default的命名空间。如果期望使用指定的命名空间,可通过两种方式实现。创建资源时我们可以直接在Yaml配置文件中指定命名空间的名称,如下所示
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
效果如下所示
另外创建资源时我们也可以不在配置文件指定命名空间,而是在kubectl create命令后添加 -n <命名空间名称> 选项实现。通常,我们在管理(编辑、查看、删除等)其他命名空间中的资源时,都需要通过-n选项显式指定命名空间的名称。效果如下所示
清空命名空间
可通过下述命令,实现删除指定命名空间下的(几乎)所有资源。即相当于将该命名空间进行了清空。但需要说明的是某些特殊资源可能并不会删除,需要我们显式地指定删除
# 删除指定命名空间下的(几乎)所有资源
# 第一个all 指定所有的资源类型
# 第二个all 指定所有的资源实例
kubectl delete all --all -n <命名空间名称>
效果如下所示
删除命名空间
# 删除指定名称的命名空间
kubectl delete ns <命名空间的名称>
效果如下所示。命名空间删除后,该命名空间下Pod显然也会伴随命名空间自动删除
参考文献
-
Kubernetes in Action中文版 Marko Luksa著 -
深入剖析Kubernetes 张磊著
原文始发于微信公众号(青灯抽丝):Kubernetes基本概念之Label、Annotation、Namespace
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/42064.html