错误:选择器与模板标签不匹配

Posted

技术标签:

【中文标题】错误:选择器与模板标签不匹配【英文标题】:Error: selector does not match template labels 【发布时间】:2019-04-17 16:05:59 【问题描述】:

我的任务是为所有deploymentsdaemonsetscronjobs 添加一个名为“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.matchLabelsspec.selector.matchLabels.appspec.selector.matchLabels.component 中的缩进。您使用了 4 个空格而不是 2 个空格。 【参考方案1】:

看来你有麻烦了。查看此部分:Label selector updates

注意:在 API 版本 apps/v1 中,Deployment 的标签选择器在创建后是不可变的。

所以,这条线说一旦创建部署就不能更新selector。除了apps/v1beta1extension/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 而言,标签没有定义,这导致了这个错误消息。

【讨论】:

以上是关于错误:选择器与模板标签不匹配的主要内容,如果未能解决你的问题,请参考以下文章

选择器与常用属性

CSSCSS 复合选择器 ① ( 基础选择器与复合选择器 | 后代选择器 )

jQuery选择器与JavaScript易出错知识点

Kendo UI 日期选择器与 Chrome 56 不兼容

Jquery学习笔记 - 选择器

HTML下(css选择器与左线练习处理)