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

我的任务是为所有deploymentsdaemonsetscronjobs 添加一个名为“app”的标签,以便更轻松地在我们的监控工具中跨堆栈查询我们的应用程序。这样,我们可以构建使用单个选择器的仪表板,即应用程序。

为避免停机,我决定通过以下步骤解决此问题:

  1. 为开发、测试和暂存环境添加标签。
  2. 为产品环境添加标签。
  3. 部署 (1)
  4. 部署 (2)
  5. 删除旧标签并更新开发服务以使用新标签。然后测试和部署。 (目前在这一步
  6. 对阶段重复 (5)。
  7. 对产品重复 (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 个空格。

标签: kubernetes yaml


【解决方案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 而言,标签没有定义,这导致了这个错误消息。

      【讨论】:

        猜你喜欢
        • 2020-03-28
        • 2021-09-15
        • 1970-01-01
        • 2020-11-20
        • 1970-01-01
        • 2022-08-21
        • 2023-03-24
        • 2023-03-28
        • 1970-01-01
        相关资源
        最近更新 更多