为什么我必须多次明确定义标签?

为什么我必须多次明确定义标签?

为什么需要多次定义部署的标签?为了快速解释我的问题,我将举一个例子。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: app
# 1st Time
  labels:
    app: app
    tier: backend
spec:
  selector:
# 2nd Time
    matchLabels:
      app: app
      tier: backend
  template:
    metadata:
# 3rd time
      labels:
        app: app
        tier: backend

我的第一个问题是我真的找不到任何spec.selector.matchlabels存在的理由。spec.selector.matchlabels 必须匹配 spec.template.metadata.labels正确的?

描述:

Pod 的标签选择器。通过此选择器选择的 Pod 所在的现有 ReplicaSet 将受到此部署的影响。它必须与 pod 模板的标签相匹配。

那么,如果它们应该固定为 kubernetes 无论如何都知道的特定值,并且如果一个与另一个不匹配就会抛出错误,那么为什么必须明确定义它们呢?


我的第二个问题(可能有一个更合理的答案)是,为什么您必须明确定义部署的标签和模板的标签?它们不是应该也相互匹配吗?还是存在它们可能彼此不匹配的情况?我是不是用错了?没有关于它们与模板标签用法的明确文档。 :/

如果我做错了或者理解错了什么请一定指出!:D

答案1

为什么需要多次定义部署的标签?

因为它们面向不同的受众,做不同的事情。当你在电脑中遇到看似重复的东西时,通常就是这种情况

在回答你的其他问题之前,我将直接跳到 tl;dr:如果您的部署对所有 3 个标签使用相同的值,然后您可以使用yaml 锚点停止复制粘贴:

apiVersion: apps/v1
kind: Deployment
metadata:
  labels: &labels
    app: app
    tier: backend
spec:
  selector:
    matchLabels: *labels
  template:
    metadata:
      labels: *labels

我的第一个问题是我真的找不到 spec.selector.matchlabels 存在的任何充分理由。spec.selector.matchlabels 必须与 spec.template.metadata.labels 匹配,对吗?

必须selector:matchLabels:子集应用于 Pod 的标签,但它们不需要匹配确切地否则会限制标签可以应用于 Pod,因为额外的配置会使 Pod 无效,matchLabels:并且 Pod 将不再由 Deployment 管理。

我的第二个问题(可能有一个更合理的答案)是,为什么您必须明确定义部署的标签和模板的标签?它们不是应该也相互匹配吗?还是存在它们可能彼此不匹配的情况?我是不是用错了?没有关于它们与模板标签用法的明确文档。 :/

部署标签是供您自己使用的元数据——据我所知,kubernetes 调度程序根本不会参考它们。s 是调度的单位:其他一切都只是用于让 kubernetescontroller-manager跟踪所需的世界状态。如果您希望能够快速识别由“secops”团队创建的所有部署,您可以说,kubectl get deploy -l team=secops它会愉快地返回列表。或者release=alpha,或者deployed-by=gitlab或其他。它只是元数据。

模板元数据是你如何定义标签应用于尚不存在的对象——Deployment从定义上讲,它描述了世界的未来状态,因此您需要描述在创建事物时希望如何标记它们。然后,您需要能够描述所有被视为“成员”的 Pod 的集合。Deployment创建新的 Deployment匹配selector:现存的Pod——在这种情况下,Deployment 将接管这些 Pod 的责任,并且只要它们符合描述的标准,Pod 调度就不会发生任何变化,但事实上,它们现在归 Deployment 所有,并且将对它们进行监督。

相关内容