Kubernetes标签,选择器和带有示例的注释
Kubernetes提供了两种基本方法来记录基础结构-标签
和注释
。
在先前文章的某些示例中,我们已经使用了标签,但是其中我将解释标签和其他相关术语的用法。
标签
标签为我们提供了另一个层次的分类,这在日常运营和管理方面非常有帮助。
标签被添加到Kubernetes对象上,并且是简单的"键:值"对。
我们将在pod,复制控制器,副本集,服务等上看到它们。
标签本身及其内部的键/值基于一组受约束的变量,因此可以使用优化的算法和数据结构来有效地评估针对它们的查询。
标签用于组织和选择对象的子集,并且可以在创建时添加到对象和/或者在集群操作期间随时修改。
让我们用一个简单的例子来演示。
假设我们想将Pod标识为应用程序前端层的一部分。
我们可以创建一个名为tier的标签,并为其分配一个frontend值,如下所示:
“labels”: { “tier”: “frontend” }
文本" tier"是关键,文本" frontend"是值。
选择器
标签是可查询的,这使它们在组织事物时特别有用。
该查询的机制是"标签选择器"。
标签选择器是一个字符串,用于标识我们要匹配的标签。
当前有两种选择器:"基于等式"和"基于集的选择器"。
基于平等的选择器
基于相等性的测试只是" IS/IS NOT"测试。
例如:
tier = frontend
将返回所有带有标签的所有容器,这些标签带有键" tier"和值" frontend"。
另一方面,如果我们要获取所有不在前端层中的Pod,我们会说:
tier != frontend
我们还可以将需求与逗号结合起来,如下所示:
tier != frontend, game = super-shooter-2
这将返回属于游戏" super-shooter-2"但不在其"前端"层中的所有吊舱。
基于集合的选择器
另一方面,基于集合的测试属于"IN/NOT IN
"种类。
例如:
environment in (production, qa) tier notin (frontend, backend) partition
第一个测试返回带有"环境"标签且值为" production"或者" qa"的豆荚。
下一个测试返回不在frontend
或者backend
层中的所有pod。
最后,第三个测试将返回所有带有" partition"标签的Pod,无论其包含什么值。
与基于相等性的测试一样,这些也可以与逗号结合以执行AND操作,如下所示:
environment in (production, qa), tier notin (frontend, backend), partition
该测试返回处于"生产"或者" qa"环境中的所有吊舱,也未处于"前端"或者"后端"层中的所有吊舱,并且具有某种"分区"标签。
注释
注释是一些有用的信息,我们可能希望存储这些信息,而不必查询它们。
它们也是键/值对,并且具有与标签相同的规则。
我们可能放置的示例包括寻呼机联系人,构建日期或者指向其他地方(例如URL)的更多信息的指针。
标签用于存储有关我们可能需要查询的事物的标识信息。
批注用于存储其他易于获取但无需过滤或者搜索的任意信息。
为部署分配标签
方法1:在创建新对象时分配标签
从任何现有资源对象中使用YAML模板总是一个好主意。
由于我们计划创建部署,因此我可以使用任何现有模板中的YAML模板,但是如果我们没有任何现有模板,则可以使用--dry-run创建一个模板并将其导出到另一个YAML中。
文件:
[root@controller ~]# kubectl create deployment label-nginx-example --image=nginx --dry-run=client -o yaml > label-nginx-example.yml
因此,我们现在有了一个用于新部署的模板文件,其内容如下:
[root@controller ~]# cat label-nginx-example.yml apiVersion: apps/v1 kind: Deployment metadata: creationTimestamp: null labels: app: label-nginx-example name: label-nginx-example spec: replicas: 1 selector: matchLabels: app: label-nginx-example strategy: {} template: metadata: creationTimestamp: null labels: app: label-nginx-example spec: containers: - image: nginx name: nginx resources: {} status: {}
我们可以在此文件中执行清理并删除一些不需要的内容。
我们可以看到,默认情况下kubectl
已经创建并分配了标签app:label-nginx-example
,我将替换它并为我们的部署分配一个新标签app:prod
。
[root@controller ~]# cat label-nginx-example.yml apiVersion: apps/v1 kind: Deployment metadata: labels: app: prod name: label-nginx-example spec: replicas: 2 selector: matchLabels: app: prod template: metadata: labels: app: prod spec: containers: - image: nginx name: nginx
接下来,让我们创建一个新的部署:
[root@controller ~]# kubectl create -f label-nginx-example.yml deployment.apps/label-nginx-example created
列出可用的部署及其标签:
[root@controller ~]# kubectl get deployments --show-labels NAME READY UP-TO-DATE AVAILABLE AGE LABELS label-nginx-example 2/2 2 2 3m12s app=prod nginx-deploy 2/2 2 2 22h type=dev
列出可用的Pod及其标签:
[root@controller ~]# kubectl get pods --show-labels NAME READY STATUS RESTARTS AGE LABELS label-nginx-example-5c57d87787-qjmhw 1/1 Running 0 4m36s app=prod,pod-template-hash=5c57d87787 label-nginx-example-5c57d87787-vsjv5 1/1 Running 0 4m36s app=prod,pod-template-hash=5c57d87787 nginx-deploy-d98cc8bdb-48ppw 1/1 Running 1 22h pod-template-hash=d98cc8bdb,type=dev nginx-deploy-d98cc8bdb-nvcb5 1/1 Running 1 22h pod-template-hash=d98cc8bdb,type=dev
方法2:将新标签分配给现有的Pod运行时作为补丁
在本示例中,我们将在上一个示例中创建的部署标签label-nginx-example中为现有的Pod分配新标签" tier:frontend"。
为此,我们需要创建一个具有所需属性的规范文件:
[root@controller ~]# cat update-label.yml spec: template: metadata: labels: tier: frontend
接下来,使用此YAML文件修补部署:
[root@controller ~]# kubectl patch deployment label-nginx-example --patch "$(cat update-label.yml)" deployment.apps/label-nginx-example patched
现在,我们可以使用" kubectl describe"来检查我们的标签是否应用于部署:
[root@controller ~]# kubectl describe deployment label-nginx-example Name: label-nginx-example Namespace: default CreationTimestamp: Thu, 03 Dec 2017 11:35:15 +0530 Labels: app=prod Annotations: deployment.kubernetes.io/revision: 2 Selector: app=prod Replicas: 2 desired | 2 updated | 2 total | 2 available | 0 unavailable StrategyType: RollingUpdate MinReadySeconds: 0 RollingUpdateStrategy: 25% max unavailable, 25% max surge Pod Template: Labels: app=prod tier=frontend ...
这会将标签应用于Pod:
[root@controller ~]# kubectl get pods --show-labels NAME READY STATUS RESTARTS AGE LABELS label-nginx-example-79fdbb7d49-sd82d 1/1 Running 0 8m26s app=prod,pod-template-hash=79fdbb7d49,tier=frontend label-nginx-example-79fdbb7d49-wf2c4 1/1 Running 0 8m18s app=prod,pod-template-hash=79fdbb7d49,tier=frontend nginx-deploy-d98cc8bdb-48ppw 1/1 Running 1 22h pod-template-hash=d98cc8bdb,type=dev nginx-deploy-d98cc8bdb-nvcb5 1/1 Running 1 22h pod-template-hash=d98cc8bdb,type=dev
方法3:使用kubectl将新标签分配给现有部署运行时
在这个例子中,我们可以使用kubectl
命令为我们的部署分配一个新的标签运行时。
我的集群上还有另一个部署nginx-deploy
,因此我将标签tier:backend分配给该部署:
[root@controller ~]# kubectl label deployment nginx-deploy tier=backend deployment.apps/nginx-deploy labeled
验证标签是否成功应用:
[root@controller ~]# kubectl get deployments --show-labels NAME READY UP-TO-DATE AVAILABLE AGE LABELS label-nginx-example 2/2 2 2 14m app=prod nginx-deploy 2/2 2 2 22h tier=backend,type=dev
使用标签列出资源对象
现在,我已经在上一个示例中使用了其中一些命令,但让我其中再次总结一下,以供我们参考。
要列出所有吊舱及其标签详细信息,请执行以下操作:
[root@controller ~]# kubectl get pods --show-labels NAME READY STATUS RESTARTS AGE LABELS label-nginx-example-79fdbb7d49-sd82d 1/1 Running 0 8m26s app=prod,pod-template-hash=79fdbb7d49,tier=frontend label-nginx-example-79fdbb7d49-wf2c4 1/1 Running 0 8m18s app=prod,pod-template-hash=79fdbb7d49,tier=frontend nginx-deploy-d98cc8bdb-48ppw 1/1 Running 1 22h pod-template-hash=d98cc8bdb,type=dev nginx-deploy-d98cc8bdb-nvcb5 1/1 Running 1 22h pod-template-hash=d98cc8bdb,type=dev
要列出所有部署及其标签详细信息,请执行以下操作:
[root@controller ~]# kubectl get deployments --show-labels NAME READY UP-TO-DATE AVAILABLE AGE LABELS label-nginx-example 2/2 2 2 19m app=prod nginx-deploy 2/2 2 2 22h tier=backend,type=dev
列出所有带有分配标签的资源:
[root@controller ~]# kubectl get all --show-labels NAME READY STATUS RESTARTS AGE LABELS pod/label-nginx-example-79fdbb7d49-sd82d 1/1 Running 0 9m8s app=prod,pod-template-hash=79fdbb7d49,tier=frontend pod/label-nginx-example-79fdbb7d49-wf2c4 1/1 Running 0 9m app=prod,pod-template-hash=79fdbb7d49,tier=frontend pod/nginx-deploy-d98cc8bdb-48ppw 1/1 Running 1 22h pod-template-hash=d98cc8bdb,type=dev pod/nginx-deploy-d98cc8bdb-nvcb5 1/1 Running 1 22h pod-template-hash=d98cc8bdb,type=dev NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE LABELS service/kubernetes ClusterIP 10.96.0.1 443/TCP 5d12h component=apiserver,provider=kubernetes NAME READY UP-TO-DATE AVAILABLE AGE LABELS deployment.apps/label-nginx-example 2/2 2 2 19m app=prod deployment.apps/nginx-deploy 2/2 2 2 22h tier=backend,type=dev NAME DESIRED CURRENT READY AGE LABELS replicaset.apps/label-nginx-example-5c57d87787 0 0 0 19m app=prod,pod-template-hash=5c57d87787 replicaset.apps/label-nginx-example-79fdbb7d49 2 2 2 9m8s app=prod,pod-template-hash=79fdbb7d49,tier=frontend replicaset.apps/nginx-deploy-d98cc8bdb 2 2 2 22h pod-template-hash=d98cc8bdb,type=dev
要使用type:dev
标签列出所有部署,请执行以下操作:
[root@controller ~]# kubectl get deployments -l type=dev NAME READY UP-TO-DATE AVAILABLE AGE nginx-deploy 2/2 2 2 22h
要使用app:prod
标签列出所有Pod,请执行以下操作:
[root@controller ~]# kubectl get pods -l app=prod NAME READY STATUS RESTARTS AGE label-nginx-example-79fdbb7d49-sd82d 1/1 Running 0 12m label-nginx-example-79fdbb7d49-wf2c4 1/1 Running 0 12m
使用选择器列出资源对象
在本节中,我们将使用选择器列出部署和Pod。
Pod的选择器确定" ReplicaSet"在何处运行,因此在我们的示例中,我们在创建部署时定义了选择器。
但是为了演示,我将在此处创建带有两个标签的另一个部署,并使用其中一个标签作为选择器:
[root@controller ~]# cat lab-nginx.yml apiVersion: apps/v1 kind: Deployment metadata: labels: app: dev tier: backend name: lab-nginx spec: replicas: 2 selector: matchLabels: app: dev template: metadata: labels: app: dev spec: containers: - image: nginx name: nginx
现在,我们将创建此部署:
[root@controller ~]# kubectl create -f lab-nginx.yml deployment.apps/lab-nginx created
列出应用于新创建的吊舱和部署的标签:
[root@controller ~]# kubectl get pods --show-labels NAME READY STATUS RESTARTS AGE LABELS lab-nginx-58f9bf94f7-df24l 0/1 ContainerCreating 0 34s app=dev,pod-template-hash=58f9bf94f7 lab-nginx-58f9bf94f7-pc8zf 1/1 Running 0 34s app=dev,pod-template-hash=58f9bf94f7 label-nginx-example-79fdbb7d49-sd82d 1/1 Running 0 52m app=prod,pod-template-hash=79fdbb7d49,tier=frontend label-nginx-example-79fdbb7d49-wf2c4 1/1 Running 0 52m app=prod,pod-template-hash=79fdbb7d49,tier=frontend nginx-deploy-d98cc8bdb-48ppw 1/1 Running 1 23h pod-template-hash=d98cc8bdb,type=dev nginx-deploy-d98cc8bdb-nvcb5 1/1 Running 1 23h pod-template-hash=d98cc8bdb,type=dev [root@controller ~]# kubectl get deployments --show-labels NAME READY UP-TO-DATE AVAILABLE AGE LABELS lab-nginx 0/2 2 0 15s app=dev,tier=backend label-nginx-example 2/2 2 2 62m app=prod nginx-deploy 2/2 2 2 23h tier=backend,type=dev
因此,我们的" lab-nginx"部署中的所有Pod都有两个标签,但使用的是" app = dev"作为选择器,因此我们可以使用它来过滤Pod列表:
[root@controller ~]# kubectl get pods --selector "app=dev" NAME READY STATUS RESTARTS AGE lab-nginx-58f9bf94f7-df24l 1/1 Running 0 18m lab-nginx-58f9bf94f7-pc8zf 1/1 Running 0 18m
但是,如果我们使用tier:backend作为选择器,我们将得到任何输出:
[root@controller ~]# kubectl get pods --selector "tier=backend" No resources found in default namespace.
由于我们使用app = dev作为lab-nginx部署的pods部分的选择器,因此未找到资源。
要使用选择器" app:prod"列出所有部署
[root@controller ~]# kubectl get deployments --selector "app=prod" NAME READY UP-TO-DATE AVAILABLE AGE label-nginx-example 2/2 2 2 32m
在上一个示例中,我们使用了"基于平等的"选择器来过滤可用的部署,现在我们将使用"基于集合的"选择器:
[root@controller ~]# kubectl get deployments --selector "app in (prod, dev)" NAME READY UP-TO-DATE AVAILABLE AGE lab-nginx 2/2 2 2 21m label-nginx-example 2/2 2 2 83m
移除标签
我们还可以使用以下语法从资源对象中删除标签:
]# kubectl label <resource-type> <resource> <label-key>
例如,从由" lab-nginx"部署创建的吊舱中删除标签app:dev:
[root@controller ~]# kubectl label pod lab-nginx-58f9bf94f7-pc8zf app pod/lab-nginx-58f9bf94f7-pc8zf labeled
一旦从Pod中删除选择器标签,副本集就会创建另一个Pod来满足部署的副本要求。
由于lab-nginx
期望有两个带有标签app = dev
的副本Pod,因此一旦我们从现有Pod中删除标签,就会创建另一个副本Pod:
[root@controller ~]# kubectl get pods --show-labels NAME READY STATUS RESTARTS AGE LABELS lab-nginx-58f9bf94f7-df24l 1/1 Running 0 106m app=dev,pod-template-hash=58f9bf94f7 lab-nginx-58f9bf94f7-fbkc2 0/1 ContainerCreating 0 3s app=dev,pod-template-hash=58f9bf94f7 lab-nginx-58f9bf94f7-pc8zf 1/1 Running 0 106m pod-template-hash=58f9bf94f7 ...
因此,正如我们期望的那样,我们可以看到,一旦我退出" lab-nginx" Pod移除了应用程序标签,就会创建一个新标签。
同样,我们也可以从部署中删除标签:
[root@controller ~]# kubectl get deployments --show-labels NAME READY UP-TO-DATE AVAILABLE AGE LABELS lab-nginx 2/2 2 2 107m app=dev,tier=backend label-nginx-example 2/2 2 2 169m app=prod nginx-deploy 2/2 2 2 25h tier=backend,type=dev
现在,我们从此部署中删除应用标签:
[root@controller ~]# kubectl label deployment lab-nginx app deployment.apps/lab-nginx labeled
验证部署的可用标签集:
[root@controller ~]# kubectl get deployments --show-labels NAME READY UP-TO-DATE AVAILABLE AGE LABELS lab-nginx 2/2 2 2 107m tier=backend label-nginx-example 2/2 2 2 170m app=prod nginx-deploy 2/2 2 2 25h tier=backend,type=dev