如何调试头盔升级失败提示:spec: Forbidden
影响版本: N /
描述
Kubernetes statfulset有很多属性,大多数在部署后都是不可更改的。当运行helm升级时,helm将生成一个新的statfulset模板。如果新模板更改了spec字段中的'replicas', 'template'和'updateStrategy'以外的任何内容,你将看到以下消息:
Error: UPGRADE FAILED: statfulset。spec: Forbidden:对statfulset spec中除“replicas”、“template”和“updateStrategy”之外的字段的更新被禁止&& statfulset。spec: Forbidden:禁止更新statfulset spec中除“replicas”、“template”和“updateStrategy”以外的字段
在某些情况下,错误消息将给出拒绝更改的文件。但是,对于像上面这样的泛型错误,您需要找出导致不可变错误的原因。
在helm升级期间,statfulset模板中的变化通常来自两个来源:值的变化。Yaml和更改图表版本(更改图表中的statfulset模板)。以下是调试步骤的一些提示:
调试和修复
1.确定值。更改Yaml通常是第一步。你可能通过upgrade传递一个新值或者没有传递之前设置的值。使用下面的命令获取当前有效值并进行比较。
$ helm get values
$ helm get values
在helm v2上不需要命名空间,-A将为您提供所有当前值,包括图表默认值
2.如果我们确定变化不是来自于价值观。在Yaml中,我们需要检查模板本身。它可能来自于statfulset模板本身的更新(图表版本/本地修改/configmap/secrets的变化通常是发生这种情况的原因)
检查是否使用升级命令更改了图表版本(如果可能,在升级时忽略图表版本)。
检查是否有任何本地修改(图表是从本地路径安装的)
检查是否有任何configmap/secrets具有较小的age(这表明它最近被更改过),以及statfulset是否引用了configmap或secret。
最后,使用-dry-run选项获取由upgrade命令创建的statfulset模板,并将其与当前的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 statfulset模板,这将导致相同的升级禁止错误,因为您可能正在更改禁止字段。
4.Helm客户端版本或kubernetes版本
升级禁止错误也可能是helm客户端版本或Kubernetes版本的结果。在这种情况下,您将无法在步骤1-3中找到差异。检查客户端或kubernetes版本是否有任何更改。
5.修复
如果我们不能确定变更的来源,有几种方法可以解决这个问题
请在执行升级命令前删除statfulset。Statefulset是一个控制器,删除它不会产生任何直接影响。只要确保在升级命令创建新的statfulset之前不要删除pod。在创建了新的statfulset之后,您可能需要删除这个pod以便生成新的pod(通常k8s会自动创建新的pod)。
另一个更简单的选择是使用-force命令升级,这有点类似于上面。但是请记住,k8s (https://github.com/kubernetes/kubernetes/issues/91459),如果使用-force选项,将导致以下错误:
Error: UPGRADE FAILED:替换对象失败:服务artifactory-ha无效:spec.clusterIP:无效值:"":字段不可变&&替换对象失败:服务artifactory-ha-primary无效:spec.clusterIP:无效值:"":字段不可变
