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

see*_*cat 5 yaml kubernetes

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

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

  1. 在开发,测试和舞台环境中添加标签。
  2. 将标签添加到产品环境中。
  3. 部署(1)
  4. 部署(2)
  5. 删除旧标签并更新开发者的服务以使用新标签。然后测试并部署。(目前正在执行此步骤
  6. 重复步骤(5)。
  7. 对产品重复(5)。

$ kubectl apply用于更新资源时,我已将“ app”标签添加到“ app”标签/将“ service”标签替换为“ app”标签,但遇到以下错误:

来自服务器的错误(无效):将补丁程序{{ longAssPatchWhichIWon'tIncludeButYaGetThePoint } 应用于以下错误:&{0xc421b02f00 0xc420803650默认设置清单/prod/provisioning-deployment.yaml 0xc 42000c6f8 3942200 false} for:“清单/要求。 yaml”:Deployment.apps“配置”无效:s pec.template.metadata.labels:无效值:map [string] string {“ app”:“配置”,“ component”:“ marketplace”}: selector不匹配模板labels

我需要一些为什么会引发此错误的见解。

小智 16

这个错误很难读懂,但这意味着你的部署定义的 spec.template.metadata.labels 中指定的标签与同一定义中的 spec.selector.matchLabels 的标签不匹配。如果您需要进一步的帮助,请上传您的 YAML。最好的事物!


Emr*_*ain 10

看来您有麻烦了。检查此部分:标签选择器更新

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

因此,此行表示selector一旦创建部署,便无法更新。除apps/v1beta1和以外的任何API版本都无法更改选择器extension/v1beta1。参考:TestDeploymentSelectorImmutability

一种可能的解决方法是保留旧标签,并与旧标签一起添加新标签。这样,您不必更新selector。部署将使用旧标签选择容器,但是您的仪表板可以使用新标签选择。这可能无法满足您的要求,但我看不出更好的方法。

  • 这不是很恐怖吗?我正在使用“ skaffold”进行部署,它添加了一个带有自己版本的标签。因此,当我自己更新“ skaffold”时,我将无法再部署任何东西。 (2认同)

Kyl*_*isi 7

据我所知,有几种方法可以解决这个问题。一种方法是删除部署并使用适用于您的部署的键/值重新应用部署:

spec:
  selector:
    matchLabels:
      app: app_name
  template:
    metadata:
      labels:
        app: app_name
        -- whatever else --
Run Code Online (Sandbox Code Playgroud)

这显然会导致停机,但应该是永久性的。您的另一个选择是编辑部署选择器:

kubectl -n namespace edit deployment app-deployment
Run Code Online (Sandbox Code Playgroud)

然后再次运行您的应用命令。这可能是永久性的,也可能不是永久性的,因为我不知道是什么改变了选择器。

如果您的 pod 还不存在,无法进行修改,则此错误可能是合法的。您可能在同一命名空间中有一个同名的 Pod。