Kubernetes标签,选择器和带有示例的注释

时间:2020-01-09 10:41:07  来源:igfitidea点击:

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