在Kubernetes部署yaml中,为什么我们必须将模板标签与选择器中的部署标签相匹配?

uxhixvfz  于 2022-12-26  发布在  Kubernetes
关注(0)|答案(3)|浏览(130)

我是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可能是自动魔术插入标签。

hfwmuf9z

hfwmuf9z1#

从技术上讲,参数matchLabels决定了哪些Pod属于给定的部署(以及底层的ReplicaSet)。在实践中,我从未见过labelsmatchLabels不同的部署。因此,原因可能是其他Kubernetes资源之间的一致性(如Service,其中matchLabels更有意义)。
我推荐阅读博客文章matchLabels, labels, and selectors explained in detail, for beginners

huus2vyu

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“

agxfikkp

agxfikkp3#

因为 Deployment.metadata.labels 属于部署资源,Deployment.spec.template.metadata.labels 属于部署控制器处理的Pod。部署控制器根据Pod资源上的标签知道哪些Pod属于哪个部署。
这就是为什么必须以这种方式指定标签的原因。

相关问题