标签和标签选择器

标签(labels)是和名字(name)以及UID相对应的, 名字和UID在同一个namespace+kind下是唯一的,例如你只能存在一个名字为my-app的deployment,但是可以同时存在一个名字为my-app的deployment和pod. UID则是更加唯一的,每一个对象(Object)都只能有一个UID(UUID), 但是标签和他们不一样,标签是附加在对象(Object)上边的

我们知道的对象有哪些
几个典型的经常使用的对象有

  • Deployment
  • Pod
  • Service
  • Ingress

等等.

Deployment 标签

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: nginx-deployment
  5. labels:
  6. app: nginx
  7. spec:
  8. replicas: 3
  9. selector:
  10. matchLabels:
  11. app: nginx
  12. template:
  13. metadata:
  14. labels:
  15. app: nginx
  16. fff: ffff
  17. spec:
  18. containers:
  19. - name: nginx
  20. image: nginx:1.14.2
  21. ports:
  22. - containerPort: 80

这是一个普通的 nginx deployment Object对象
apiVersion kind metadataspec .

  • apiVersion 表明使用那个版本的API
  • kind 表明是一个Deployment对象
  • metadata 元数据,表明了deployment的名字是 nginx-deployment , 存在一个 app: nginx 的标签
  • spec是预期POD的数据,k8s系统最终描述的结果,3个POD,容器是nginx,镜像使用 nginx:1.14.2

spec 是用来描述我们预期的结果的,换句话说,这部分是用来生成POD的数据. 如果我们修改了 **spec(预期) 的数据,那么就会重新生成新的POD来反应到我们刚刚的更新上去,最终体现的结果就是POD的数据符合我们的 spec(预期)**

根据这个 Deployment 生成的POD必然包含了2个标签,分别是

  • app: nginx
  • fff: ffff

3个标签的含义

3个标签分别是

  • metadata.labels ,deployment的标签,这个是用来描述deployment的. 按照上边的描述,修改元数据是不会影响到POD的,因为没有修改spec改变预期.
  • spec.template.metadata.labels ,生成POD的标签,这里的标签放置在template(模板)中,是用来给生成的POD设置标签的,修改这里意味这改变预期,会导致POD发生变更.(重启发布)
  • spec.selector.matchLabels,deployment的标签选择起,在k8s中存在一个deployment的控制器,由它来控制POD,那么它是如何来管理POD的呢,正是通过这个标签选择器来选择对应的POD

经过在阿里云上的测试可以得出上边得结论是正确的
查找API通过deployment生成的pod

  1. /api/v1/namespaces/default/pods.json?labelSelector=app=nginx&limit=100
  2. 这里的根据标签选择器 app=nginx,来选择对应的POD(POD的标签来源于deploymentspec.template.metadata.labels) , 所以如果我们定义的deployment的模板标签出现在多个项目上,那么通过该API可以得到多个POD结果集
  3. 更重要的是,对外提供服务的Service也是根据标签选择器来进行选择的,这个选择过程和deployment的选择过程一致,因此deployment的模板标签是不可以随意设置的

参考地址