微服务架构下可能会部署很多组件,这些组件可能是副本(部署同一组件的多个副本)和多个不同的发布版本(stable, beta, canary 等)同时运行,系统中可能拥有数百个 pod ,如果没有可以有效组织这些组件的机制,将会导致巨大的混乱。 P66
介绍标签 P66标签是一种简单却功能强大的 Kubernetes 特性,不仅可以组织 pod ,还可以组织所有其他的 Kubernetes 资源。标签是可以附加到资源的任意键值对,用以选择具有该确切标签的资源(通过标签选择器完成)。只要标签的 key 在资源内是唯一的,一个资源便可以拥有多个标签。通常在我们创建资源时就会将标签附加到资源上,但之后我们也可以再添加其他标签,或者修改现有标签的值,而无须重新创建资源。 P67
我们以图 3.6 中的微服务为例,通过给这些 pod 添加标签,可以得到一个更组织化的系统,以便我们理解。此时每个 pod 都标有两个标签: P67
app: 基于应用的横向纬度,指定 pod 属于哪一个应用、组件或微服务
rel: 基于版本的纵向纬度,显示在 pod 中运行的应用程序版本 (stable, beta, canary)
金丝雀版 (canary) :部署新版本时,只让一小部分用户体验新版本以观察新版本的表现,然后再向所有用户进行推广,这样可以防止暴露有问题的版本给过多的用户
创建 pod 时指定标签 P67基于 kubia-manual.yaml 创建一个新的描述文件 kubia-manual-with-labels.yaml ,并添加 metadata.labels 属性,指定 creation_method=manual 和 env=prod 标签。
# 遵循 v1 版本的 Kubernetes API apiVersion: v1 # 资源类型为 Pod kind: Pod metadata: # pod 的名称 name: kubia-manual-v2 # pod 的标签 labels: creation_method: manual env: prod spec: containers: # 创建容器所使用的镜像 - image: idealism/kubia # 容器的名称 name: kubia ports: # 应用监听的端口 - containerPort: 8080 protocol: TCPkubectl create -f kubia-manual-with-labels.yaml: 创建一个新 pod
kubectl get pods --show-labels: 查看所有 pod 并列出全部标签NAME READY STATUS RESTARTS AGE LABELS kubia-manual 1/1 Running 0 79m <none> kubia-manual-v2 1/1 Running 0 3m11s creation_method=manual,env=prod
kubectl get pods -L creation_method -L env: 查看所有 pod 并列出指定标签,每个标签自成一列NAME READY STATUS RESTARTS AGE CREATION_METHOD ENV kubia-manual 1/1 Running 0 84m kubia-manual-v2 1/1 Running 0 7m35s manual prod
修改现有 pod 的标签 P68kubectl label pod kubia-manual creation_method=manual: 对 kubia-manual pod 添加 creation_method=manual 标签
kubectl label pod kubia-manual-v2 env=debug --overwrite: 将 kubia-manual-v2 pod 的 env=prod 标签更改为 env=debug
更改现有标签时,需要使用 --overwrite 选项
kubectl get pods -L env,creation_method: 查看所有 pod 并列出指定标签,每个标签自成一列NAME READY STATUS RESTARTS AGE ENV CREATION_METHOD kubia-manual 1/1 Running 0 90m manual kubia-manual-v2 1/1 Running 0 13m debug manual
通过标签选择器列出 pod 子集 P69标签选择器允许我们选择标记有特定标签的 pod 子集,并对这些 pod 执行操作,它可以根据资源的以下条件来选择资源: P68
包含(或不包含)使用特定键的标签
包含具有特定键和值的标签
包含具有特定键的标签,但其值与我们指定但不同
使用标签选择器列出 pod P69kubectl get pods -l creation_method=manual: 列出包含 creation_method=manual 标签的所有 pod
kubectl get pods -l env: 列出有 env 标签的所有 pod ,无论其值为如何
kubectl get pods -l '!env': 列出没有 env 标签的所有 pod
kubectl get pods -l creation_method!=manual: 列出有 creation_method 标签但其值不等于 manual 的所有 pod
kubectl get pods -l 'env in (debug, prod)': 列出有 env 标签并且其值为 debug 或 prod 的所有 pod
kubectl get pods -l 'env notin (debug, prod)': 列出没有 env 标签,或者有 env 标签并且其值不为 debug 和 prod 的所有 pod
使用标签选择器 app=pc 选择前面所述示例中属于 product catalog 微服务的所有 pod 。 P70