我的任务是为所有deployments
,daemonsets
和cronjobs
添加名为“ app”的标签,以便在监视工具中更轻松地查询整个堆栈中的应用程序。这样,我们可以构建使用单个选择器(即应用程序)的仪表板。
为避免停机,我决定通过以下步骤解决此问题:
在使用$ 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
我需要了解为什么会引发此错误。
答案 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
。除selector
和apps/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担心未定义标签,从而导致出现此错误消息。