如何调试头盔升级失败的消息:规格:禁止

保罗•潘
2022-12-25 36

主题

如何调试头盔升级失败的消息:规格:禁止

影响版本

N/A

描述

Kubernetes的statfulset有很多属性,大多数在部署后是不可更改的。当运行helm升级时,helm将生成一个新的statefulset模板。如果新模板在规范字段中改变了'replicas', 'template'和'updateStrategy'之外的任何内容,你将看到以下消息:

错误:升级失败:StatefulSet。"artifactory-ha-artifactory-ha-member"是无效的:spec: Forbidden:除了'replicas', 'template'和'updateStrategy'之外的字段禁止更新statefulset规范&& statefulset。"artifactory-ha-artifactory-ha-primary"是无效的:spec: Forbidden:除了'replicas', 'template'和'updateStrategy'之外的字段禁止更新statefulset spec

在某些情况下,错误消息将给出拒绝更改的文件。然而,对于像上面这样的一般错误,您需要找出导致不可变错误的原因。

头盔升级过程中statefulset模板的变化通常来自两个来源:值的变化。Yaml和图表版本的变化(这改变了图表中的statefulset模板)。下面是一些调试步骤的提示:

调试和修复

1.确定价值。改变Yaml通常是第一步。您可能在升级时传递了一个新值,或者这次没有传递先前设置的值。使用下面的命令获取当前有效值并进行比较。

$ helm get values -n命名空间
$ helm get values -n namespace -A

命名空间不需要helm v2和-A将给你所有的当前值,包括图表默认值

2.如果我们确定变化不是来自于价值观。Yaml,我们需要检查模板本身。它可能来自于statefulset模板本身的更新(图表版本/本地修改/configmap/secrets的变化通常是发生这种情况的原因)

检查是否使用升级命令更改了图表版本(如果可能,在升级中传递图表版本)。

检查是否有任何本地修改(图表是从本地路径安装的)

检查是否有任何年龄较小的configmap/secrets(这表明它最近被更改过),以及statefulset是否引用了configmap或secret。

最后,使用-dry-run选项获取由upgrade命令创建的statefulset模板,并将其与当前的statefuset进行比较。

$ helm升级.....排练

3.边注:

确保检查每个产品的upgrade_notes,并在更改日志中搜索与“升级”相关的任何消息。例如,您可能会在更改日志中注意到以下内容。
10281 - 6月- 22 - 2021 https://github.com/jfrog/charts/blob/3b75f96ec9df3bc89c4c5e86c8df17e8d0e80aea/stable/distribution/CHANGELOG.md

如果这是一个升级,你正在使用默认的PostgreSQL (PostgreSQL .enabled=true),你需要通过之前的9.x/10.x/12。x postgresql.image。之前的postgresql.persistence.size和databaseUpgradeReady=true

如果你没有传递postgresql.image.tag值,helm upgrade可能会从upgrade中获取不同的值。因此,它将创建一个新的postgresql statefulset模板,这将导致相同的升级禁止错误,因为您可以更改一个禁止字段。

4.Helm客户端版本或kubernetes版本

升级禁止错误也可能是helm客户端版本或Kubernetes版本的结果。在这种情况下,您将无法在步骤1-3中找到差异。检查客户端或kubernetes版本是否有任何变化。

5.修复

如果我们不能确定变化的来源,有一些方法可以解决这个问题

执行升级命令前,可以先删除statefulset。Statefulset是一个控制器,删除它没有任何直接影响。只是要确保在升级命令创建一个新的statefulset之前不要删除pod。在创建了新的statefulset之后,你可能需要删除pod以生成新的pod(通常k8s会自动创建新的pod)

另一个更简单的选择是使用-force命令和upgrade,这有点类似于上面的。但是请记住,目前k8s有一个bug (https://github.com/kubernetes/kubernetes/issues/91459)如果你使用-force选项,这将导致以下错误:

Error: UPGRADE FAILED:替换失败object: Service "artifactory-ha" is invalid: spec.clusterIP: invalid值:"":字段不可变&& FAILED to replace object: Service "artifactory-ha-primary" is invalid: spec.clusterIP: invalid值:"":字段不可变