在上一节中我们将标签附加到资源上,以便在列出资源时可以看到每个资源旁边的标签,这看起来并没有什么有趣的地方。但值得注意的是,标签要与标签选择器结合在一起。标签选择器允许我们选择标记有特定标签的pod子集,并对这些pod执行操作。可以说标签选择器是一种能够根据是否包含具有特定值的特定标签来过滤资源的准则。
标签选择器根据资源的以下条件来选择资源:
包含(或不包含)使用特定键的标签
包含具有特定键和值的标签
包含具有特定键的标签,但其值与我们指定的不同
3.4.1 使用标签选择器列出pod
接下来我们使用标签选择器在之前创建的pod上进行操作,以观察我们手动创建的所有pod(用creation_method=manual标记了它们),并执行以下操作:
$ kubectl get pods -l creation_method=manual
NAME READY STATUS RESTARTS AGE
kubia 1/1 Running 0 13h
列出包含env标签的所有pod,无论其值如何:
$ kubectl get po -l env
NAME READY STATUS RESTARTS AGE
kubia 1/1 Running 0 13h
同样列出没有env标签的pod:
$ kubectl get po -l '!env'
NAME READY STATUS RESTARTS AGE
kubia-n7fvq 1/1 Running 0 3d23h
kubia-qrb4q 1/1 Running 0 3d20h
kubia-ww77s 1/1 Running 0 3d23h
注意 确保使用单引号来圈引!env,这样bash shell才不会解释感叹号(译者注:感叹号在bash中有特殊含义,表示事件指示器)。
同理,我们也可以将pod与以下标签选择器进行匹配:
creation_method!=manual
选择带有 creation_method
标签,并且值不等于manual的pod
env in (prod,devel)
选择带有env标签且值为prod或devel的pod
env not in (prod,devel)
选择带有env标签,但其值不是prod或devel的pod
3.4.2 在标签选择器中使用多个条件
在包含多个逗号分隔的情况下,可以在标签选择器中同时使用多个条件,此时资源需要全部匹配才算成功匹配了选择器。
$ kubectl get pods -l creation_method=manual,env=prod
$ kubectl get pods -l 'environment,environment notin (frontend)'
$ kubectl get pods -l 'env in (prod, qa)'
$ kubectl get pods -l 'creation_method in (manual),env in (prod)'
标签选择器不仅帮助我们列出pod,在对一个子集中的所有pod都执行操作时也具有重要意义。例如,在本章的后面我们将看到如何使用标签选择器来实现一次删除多个pod。此外标签选择器不只是被kubectl使用,在后续内容中我们也将看到它们在内部也被使用过。
网友评论