为什么需要多次定义部署的标签?为了快速解释我的问题,我将举一个例子。
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 所有,并且将对它们进行监督。