错误:选择器与模板标签不匹配
Posted
技术标签:
【中文标题】错误:选择器与模板标签不匹配【英文标题】:Error: selector does not match template labels 【发布时间】:2019-04-17 16:05:59 【问题描述】:我的任务是为所有deployments
、daemonsets
和cronjobs
添加一个名为“app”的标签,以便更轻松地在我们的监控工具中跨堆栈查询我们的应用程序。这样,我们可以构建使用单个选择器的仪表板,即应用程序。
为避免停机,我决定通过以下步骤解决此问题:
-
为开发、测试和暂存环境添加标签。
为产品环境添加标签。
部署 (1)
部署 (2)
删除旧标签并更新开发服务以使用新标签。然后测试和部署。 (目前在这一步)
对阶段重复 (5)。
对产品重复 (5)。
当使用$ kubectl apply
更新资源时,我已将“app”标签添加到/替换“服务”标签与“app”标签到,我遇到以下错误:
来自服务器的错误(无效):应用补丁时出错: longAssPatchWhichIWon'tIncludeButYaGetThePoint 到:&0xc421b02f00 0xc420803650 默认配置 manifests/prod/provisioning-deployment.yaml 0xc 42000c6f8 3942200 false 为:“manifests/prod/provisioning-deployment.yaml”: Deployment.apps“配置”无效:s pec.template.metadata.labels:无效值: 地图[字符串]字符串“应用程序”:“配置”,“组件”:“市场”:
selector
与模板不匹配labels
我需要一些关于它为什么抛出这个错误的见解。
【问题讨论】:
你能分享部署的 yaml 吗?快速提醒一下,您部署的spec.selector
必须与 spec.template.metadata.labels
的标签匹配。
@EmruzHossain 我明白,但即使在更新之后,我仍然收到同样的错误。我已经包含了我的 .yaml 文件。
您应该在问题描述中插入代码或清单或类似内容,而不是通过链接插入它们
更正spec.selector.matchLabels
、spec.selector.matchLabels.app
和spec.selector.matchLabels.component
中的缩进。您使用了 4 个空格而不是 2 个空格。
【参考方案1】:
看来你有麻烦了。查看此部分:Label selector updates
注意:在 API 版本
apps/v1
中,Deployment 的标签选择器在创建后是不可变的。
所以,这条线说一旦创建部署就不能更新selector
。除了apps/v1beta1
和extension/v1beta1
之外的任何API 版本都不能更改选择器。参考:TestDeploymentSelectorImmutability.
一种可能的解决方法是保留旧标签并将新标签与旧标签一起添加。这样,您不必更新selector
。部署将使用旧标签选择 pod,但您的仪表板可以选择使用新标签。这可能不符合您的要求,但我没有看到更好的方法。
【讨论】:
该文件的 API 版本是 extension/v1beta1。所以我应该能够更改/更新选择器吗? 理论上是的。我没试过。您已经阅读了我在答案中链接的Label selector updates
部分,对吗?更改selector
有一些问题。 Old ReplicaSet 将被孤立。另外,请确保您的部署是extension/v1beta1
api 版本。 kubectl
将始终返回 extension
api 组,即使您的部署是 apps/v1
。参考:github.com/kubernetes/kubernetes/issues/…
这不是很可怕吗?我正在使用skaffold
进行部署,它添加了一个带有自己版本的标签。因此,当我更新 skaffold
本身时 - 我无法再部署任何东西。【参考方案2】:
此错误难以阅读,但这意味着您的 Deployment 定义的 spec.template.metadata.labels 中指定的标签与同一定义中的 spec.selector.matchLabels 中的标签不匹配。如果您需要进一步的帮助,请上传您的 YAML。 最好的!
【讨论】:
【参考方案3】:据我所知,有几种方法可以解决这个问题。一种方法是删除部署并使用适用于您的部署的键/值重新应用部署:
spec:
selector:
matchLabels:
app: app_name
template:
metadata:
labels:
app: app_name
-- whatever else --
这显然会导致停机,但应该是永久性的。您的另一个选择是编辑部署选择器:
kubectl -n namespace edit deployment app-deployment
然后再次运行您的应用命令。这可能是永久性的,也可能不是永久性的,因为我不知道是什么改变了选择器的开始。
如果您的 pod 甚至不存在进行修改,则此错误可能是合法的。你可能在同一个命名空间中有一个同名的 pod。
【讨论】:
【参考方案4】:有人来找我这个问题,结果发现他们输入了“元数据”而不是“元数据”,所以就 kubernetes 而言,标签没有定义,这导致了这个错误消息。
【讨论】:
以上是关于错误:选择器与模板标签不匹配的主要内容,如果未能解决你的问题,请参考以下文章