`helm install`失败,但`helm upgrade`成功。如何进行调试?

93次阅读
没有评论

问题描述

在开发Helm chart时,使用helm install命令时,会出现一系列不同的错误,错误信息显示已经存在相应的部署对象,例如:

Error: secrets "my-secret-name" already exists

如果再次尝试运行相同的命令,但将install替换为upgrade(并删除不适用的选项,如--create-namespace),则可以成功。这个问题非常可靠,以至于用户已经将其编写成一个脚本,自动执行installupgrade操作。
通常情况下,错误会发生在特定的secret或两个命名空间中。用户无法回忆起有没有出现过不是这三个特定对象的错误,但对这个错误已经有些麻木了。
用户经常将chart部署到Kind和GKE集群中,这个错误在两个地方都会发生,即使是在一个全新的没有任何对象的集群上,如果卸载并重新安装,仍然会出现这个错误。在任何情况下,对象已经存在的说法都是不正确的。
不幸的是,用户无法分享chart的源代码。以下是一些用户可以分享的信息:
– 用户的chart有5个依赖的子chart。其中三个是第三方的(etcd、minio、kube-prometheus-stack),另外两个是内部的chart。每次用户注意到已经存在的对象都属于内部子chart中的一个特定子chart;从未出现过属于用户自己的chart的对象。
– 子chart是一个tarball,用户定期使用helm dependency update进行构建和导入。使用不同的方法构建和包含它似乎没有任何区别。
– 用户首次遇到这个问题是在Helm 3.5.2版本。用户升级到Helm 3.5.4,问题仍然存在。用户在Helm的开放Github问题中进行了搜索,但没有找到相关问题。用户还进行了谷歌搜索,没有找到其他人遇到相同的问题。
– 用户对Helm相对较新,所以这可能只是用户自己的一个新手错误。用户认为这是chart或更可能是子chart的问题。用户知道helm template --debug命令,但它没有帮助。模板本身的输出是预期的(因为如果在失败的install之后立即进行upgrade,它可以正常工作)。用户多次阅读Helm文档,试图找到一些可以启用的选项,在安装过程中生成更多的输出,以便更好地理解失败的原因,但没有找到任何有用的信息。
helm install --debug会产生额外的输出,但与失败无关。
用户没有提供足够的细节让其他人为他调试(也因为公司原因无法提供),所以用户的问题是:如何进一步调试?如果你在自己的chart中遇到这个问题,你会怎么做来缩小问题的范围?
假设你已经将chart和子chart精简到最小的模板/等所需的集合,但仍然没有有用的输出;在全新的集群中没有任何关于对象“已经存在”的指示。现在该怎么办?

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

在调试Helm安装过程中,可以尝试以下方法来进一步缩小问题的范围:
1. 使用--dry-run选项运行helm install命令,以查看生成的Kubernetes资源清单。这将允许你检查生成的资源是否与预期一致。
2. 使用--debug选项运行helm install命令,以获取更详细的输出。这可能会提供有关失败原因的更多信息。
3. 检查Helm chart中的模板文件,确保它们正确地生成了所需的Kubernetes资源。可以使用helm template命令来查看生成的资源清单。
4. 检查Helm chart中的values.yaml文件,确保配置正确。特别注意与已经存在的对象相关的配置项。
5. 检查Helm chart中的依赖关系,确保它们正确地定义和配置。可以使用helm dependency list命令来查看依赖关系。
6. 如果可能,尝试在不同的环境中运行helm install命令,以确定问题是否与特定环境相关。
7. 如果问题仍然存在,可以尝试使用helm template生成的资源清单手动部署到Kubernetes集群中,以查看是否会出现相同的错误。这将帮助你确定问题是由Helm还是Kubernetes引起的。

方案2

如果以上方法仍然无法解决问题,可以尝试以下方法来进一步调试:
1. 使用Kubernetes的命令行工具(如kubectl)直接查看集群中的对象,以确定是否存在与错误消息中提到的对象相同的对象。可以使用以下命令来检查对象是否存在:
kubectl get <object_type> <object_name> -n <namespace>
其中,<object_type>是对象的类型(如secrets),<object_name>是对象的名称,<namespace>是对象所在的命名空间。
2. 如果对象确实存在,可以尝试手动删除它们,并重新运行helm install命令。这将确保在安装过程中不会出现对象已经存在的错误。
3. 如果对象不存在,可以尝试使用Kubernetes的事件日志来查看是否有与安装过程相关的错误或警告。可以使用以下命令来查看事件日志:
kubectl get events -n <namespace>
这将显示与命名空间相关的所有事件。
4. 如果问题仍然存在,可以尝试在不同的Kubernetes集群上运行helm install命令,以确定问题是否与特定集群相关。

方案3

如果以上方法仍然无法解决问题,可以尝试以下方法来进一步调试:
1. 使用Helm的调试模式运行helm install命令,以获取更详细的输出。可以使用以下命令来启用调试模式:
helm install --debug <chart_name> -n <namespace>
这将提供更多关于安装过程的详细信息,可能有助于确定失败的原因。
2. 检查Helm chart中的模板文件和values.yaml文件,确保它们正确地生成了所需的Kubernetes资源和配置。可以使用helm template命令来查看生成的资源清单。
3. 检查Helm chart中的依赖关系,确保它们正确地定义和配置。可以使用helm dependency list命令来查看依赖关系。
4. 如果可能,尝试在不同的环境中运行helm install命令,以确定问题是否与特定环境相关。
5. 如果问题仍然存在,可以尝试使用helm template生成的资源清单手动部署到Kubernetes集群中,以查看是否会出现相同的错误。这将帮助你确定问题是由Helm还是Kubernetes引起的。

方案4

如果以上方法仍然无法解决问题,可以尝试以下方法来进一步调试:
1. 检查Helm chart中的模板文件和values.yaml文件,确保它们正确地生成了所需的Kubernetes资源和配置。可以使用helm template命令来查看生成的资源清单。
2. 检查Helm chart中的依赖关系,确保它们正确地定义和配置。可以使用helm dependency list命令来查看依赖关系。
3. 如果可能,尝试在不同的环境中运行helm install命令,以确定问题是否与特定环境相关。
4. 如果问题仍然存在,可以尝试使用helm template生成的资源清单手动部署到Kubernetes集群中,以查看是否会出现相同的错误。这将帮助你确定问题是由Helm还是Kubernetes引起的。
5. 如果问题仍然存在,可以尝试使用其他工具或方法来部署和管理Kubernetes资源,以确定问题是否与Helm相关。例如,可以尝试使用Kustomize或直接使用Kubernetes的命令行工具(如kubectl)来部署资源。
以上是一些常见的调试方法,希望能帮助你进一步缩小问题的范围并找到解决方案。如果问题仍然存在,请提供更多细节,以便我们能够更好地帮助你。

正文完