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

时间:2018-11-14 16:12:21

标签: kubernetes yaml

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

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

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

在使用$ kubectl apply更新资源时,我向“服务”标签添加了“应用”标签/使用“应用”标签替换了“服务”标签,但遇到以下错误:

  

服务器错误(无效):应用补丁时出错:   { longAssPatchWhichIWon'tIncludeButYaGetThePoint }到:&{0xc421b02f00   0xc420803650默认设置   manifests / prod / provisioning-deployment.yaml 0xc 42000c6f8 3942200   false}代表:“ manifests / prod / provisioning-deployment.yaml”:   Deployment.apps“设置”无效:   pec.template.metadata.labels:无效值:   map [string] string {“ app”:“ provisioning”,“ component”:“ marketplace”}:   selector与模板labels

不匹配

我需要了解为什么会引发此错误。

4 个答案:

答案 0 :(得分:3)

看来您有麻烦了。检查以下部分:Label selector updates

  

注意:在API版本spring jpa: database: POSTGRESQL show-sql: true hibernate: ddl-auto: create-drop datasource: platform: postgres url: jdbc:postgresql://localhost:5432/db username: postgres password: <something> driverClassName: org.postgresql.Driver 中,部署的标签选择器在创建后是不可变的。

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

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

答案 1 :(得分:2)

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

spec:
  selector:
    matchLabels:
      app: app_name
  template:
    metadata:
      labels:
        app: app_name
        -- whatever else --

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

kubectl -n namespace edit deployment app-deployment

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

有人问我这个问题,结果发现他们输入了“ matadata”而不是“ metadata”,以至于kubernetes担心未定义标签,从而导致出现此错误消息。