Kubernetes中的Namespace、Label和Annotation是三个基本概念。它们有不同的作用和用途:
- Namespace(命名空间)是用于在一个Kubernetes集群中将资源进行逻辑上的隔离和划分的机制。通过将资源分配到不同的Namespace中,可以实现资源的逻辑分组和管理。不同的Namespace之间资源的名称可以重复,但不同Namespace之间的资源是相互隔离的。
- Label(标签)是用于对Kubernetes中的资源进行分类或标记的标识符。Label是键值对的形式,可用于选择和过滤资源,并支持资源的动态组织。通过Label,可以对资源进行灵活的标记和分类,更方便地管理和操作资源。
- Annotation(注释)是在Kubernetes中为资源添加的键值对信息。与Label不同,Annotation并不用于对资源进行分类或标记,而是用于提供关于资源的元数据信息,如资源的描述、注释或其他附加信息。Annotation可以用于存储对资源的描述、审计信息、工具的额外配置等。
Namespace 命名空间
- 命名空间为K8s资源对象的名称提供了一个作用域。一方面避免了资源名称的冲突;另一方面,通过合理的分组实现科学管理,避免误操作不属于自己的资源
查看命名空间
arduino
kubectl get ns
- 效果如下所示。注意,当kubectl命令、Yaml配置文件均未指定命名空间。故其默认会使用名为default的命名空间
创建命名空间
- 显然可以通过Yaml配置文件来创建命名空间资源
vbnet
apiVersion: v1
# 资源类型: 命名空间
kind: Namespace
metadata:
# 命名空间的名称
name: custom-namespace-1
- 效果如下所示
- 还可以通过命令直接创建
bash
# 创建指定名称的命名空间
kubectl create ns <命名空间名称>
使用命名空间
- 前面提到,如果未指定命名空间则会默认使用名为default的命名空间。如果期望使用指定的命名空间,可通过两种方式实现。创建资源时我们可以直接在Yaml配置文件中指定命名空间的名称,如下所示
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选项显式指定命名空间的名称。
效果如下所示
Label 标签
- Label 标签是一种简单却功能强大的K8s特性,其不仅适用于Pod,也可以适用于其他的K8s资源。简单来说,Label 标签就是附加到资源上的任意键值对
添加标签
- 可以在创建资源的Yaml文件中指定标签信息
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添加标签
ini
# 给指定Pod添加标签
kubectl label pod <Pod名称> <标签的键>=<标签的值>
# 给名为my-bootcamp-pod-2的Pod添加名为env、值为prod的标签
kubectl label pod my-bootcamp-pod-2 env=prod
修改标签
- 修改现有Pod的标签信息,类似于添加标签的命令。只需添加--overwrite选项即可
bash
# 将指定Pod的标签值修改为指定值
kubectl label pod <Pod名称> <标签的键>=<标签的新值> --overwrite
# 将名为my-bootcamp-pod-2的Pod的名为env的标签值修改为test
kubectl label pod my-bootcamp-pod-2 env=test --overwrite
删除标签
- 删除现有Pod的标签信息,只需指定欲删除标签的名称,并在后面添加一个减号即可
css
# 对指定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选项实现查看所有标签信息
csharp
# 查看所有Pod资源, 同时展示所有标签信息
kubectl get pod --show-labels
- 查看资源时,可通过-L选项实现查看感兴趣的标签信息
xml
# 查看所有Pod资源, 同时展示指定标签名的标签信息
kubectl get pod -L <标签名1>,<标签名2>,<标签名3>
Annotation 注解
- Annotation注解和标签很类似,其同样是一个键值对。但目的是将非标识性的元数据附加到K8s资源对象上,以便客户端程序(例如工具和库)能够获取这些元数据信息。故在注解中不存在所谓的注解选择器
添加注解
- 可以在创建资源的Yaml文件中指定注解信息
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添加注解
ini
# 给指定Pod添加注解
kubectl annotate pod <Pod名称> <注解的键>=<注解的值>
# 给名为my-bootcamp-pod-2的Pod添加名为name、值为hello的注解
kubectl annotate pod my-bootcamp-pod-2 name=hello
修改注解
- 修改现有Pod的注解信息,类似于添加注解的命令。只需添加--overwrite选项即可
ini
# 将指定Pod的注解值修改为指定值
kubectl annotate pod <Pod名称> <注解的键>=<注解的新值> --overwrite
# 将名为my-bootcamp-pod-2的Pod的名为name的注解值修改为hi
kubectl annotate pod my-bootcamp-pod-2 name=hi --overwrite
删除注解
- 删除现有Pod的注解信息,只需指定欲删除注解的名称,并在后面添加一个减号即可
perl
# 对指定Pod,删除指定的注解
kubectl annotate pod <Pod名称> <注解的键>-
# 对名为my-bootcamp-pod-2的Pod, 删除名为name的注解
kubectl annotate pod my-bootcamp-pod-2 name-
查看注解
- 可借助于kubectl describe命令查看注解信息
sql
kubectl describe <Pod名称>
- 而如果使用kubectl get命令查看Json形式的Pod信息,我们会发现注解信息位于.metadata.annotations项中。故我们还可以使用-o jsonpath选项指定注解的路径来直接查看
ini
# 查看指定Pod的注解信息
kubectl get pod <Pod名称> -o jsonpath='{.metadata.annotations}'
kubectl get pod my-bootcamp-pod-2-annotation -o jsonpath='{.metadata.annotations}'
效果如下所示