我是Kubernetes的新手,所以这可能是显而易见的,但在部署yaml中,为什么我们必须在部署元数据中定义标签,然后在模板元数据中定义相同的标签,但在选择器中分别匹配这些标签呢?
模板属于它所在的部署不是应该很明显吗?部署中是否存在与模板不匹配的用例?
apiVersion: apps/v1
kind: Deployment
metadata:
name: api-backend
spec:
replicas: 2
selector:
matchLabels:
app: api-backend
template:
metadata:
labels:
app: api-backend
spec:
#...etc
我可能错过了对k8或yamls的一些关键理解。
有一个没有标签的模板,它似乎工作,但我不明白为什么。Kubernetes可能是自动魔术插入标签。
3条答案
按热度按时间hfwmuf9z1#
从技术上讲,参数
matchLabels
决定了哪些Pod属于给定的部署(以及底层的ReplicaSet)。在实践中,我从未见过labels
与matchLabels
不同的部署。因此,原因可能是其他Kubernetes资源之间的一致性(如Service,其中matchLabels
更有意义)。我推荐阅读博客文章matchLabels, labels, and selectors explained in detail, for beginners。
huus2vyu2#
让我们先简化标签、选择器和模板标签。
.spec.template
部分中的标签分配给部署创建的pod。这些标签实际上称为PodTemplate标签。.spec.selector.matchLabels
节中的标签匹配的资源。现在,matchLabels部分中不一定要有所有podTemplate标签。一个pod可以有许多标签,但只有一个matchLabels就足以标识pod。下面是一个使用案例,可以了解为什么必须使用它
“假设您有一个部署X,该部署创建了两个pod,标签为
nginx-pods
,映像为nginx
,另一个部署Y应用于标签为nginx-pods
但使用映像nginx:alpine
的pod。如果部署X正在运行,您在之后运行部署Y,则它不会创建新pod,而是它将使用nginx:alpine
映像替换现有Pod。由于Pod中的标签与两个部署.spec.selector.matchLabels
中的标签匹配,因此两个部署都将标识Pod“agxfikkp3#
因为 Deployment.metadata.labels 属于部署资源,Deployment.spec.template.metadata.labels 属于部署控制器处理的Pod。部署控制器根据Pod资源上的标签知道哪些Pod属于哪个部署。
这就是为什么必须以这种方式指定标签的原因。