标签和标签选择器
标签(labels)是和名字(name)以及UID相对应的, 名字和UID在同一个namespace+kind下是唯一的,例如你只能存在一个名字为my-app的deployment,但是可以同时存在一个名字为my-app的deployment和pod. UID则是更加唯一的,每一个对象(Object)都只能有一个UID(UUID), 但是标签和他们不一样,标签是附加在对象(Object)上边的
我们知道的对象有哪些
几个典型的经常使用的对象有
- Deployment
- Pod
- Service
- Ingress
Deployment 标签
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
fff: ffff
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
这是一个普通的 nginx
deployment Object对象
有 apiVersion
kind
metadata
和 spec
.
- 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
/api/v1/namespaces/default/pods.json?labelSelector=app=nginx&limit=100
这里的根据标签选择器 app=nginx,来选择对应的POD(POD的标签来源于deployment的spec.template.metadata.labels) , 所以如果我们定义的deployment的模板标签出现在多个项目上,那么通过该API可以得到多个POD结果集
更重要的是,对外提供服务的Service也是根据标签选择器来进行选择的,这个选择过程和deployment的选择过程一致,因此deployment的模板标签是不可以随意设置的