理解Helm安装升级参数wait、wait-for-jobs、atomic、cleanup-on-fail、timeout

本文深入探讨了Helm在执行install和upgrade命令时的参数wait、wait-for-jobs、atomic和cleanup-on-fail的含义和作用。wait参数确保所有pod资源正常运行,wait-for-jobs等待所有job完成。atomic保证安装或升级的原子性,失败时自动回滚。cleanup-on-fail在升级失败时删除新增资源。文章还分析了这些参数在 Helm 源码中的实现逻辑,帮助读者更好地管理和监控chart应用状态。

理解Helm安装升级参数wait、wait-for-jobs、atomic、cleanup-on-fail、timeout

Helm执行install、upgrade指令时可以指定–wait、–atomic、–timeout参数,并且upgrade指令还可以指定–cleanup-on-fail参数。此篇文章将从helm源码的角度去理解这几个参数的实现及其意义,并给出如何自己管理chart应用的状态

wait、wait-for-jobs参数

语义

Helm应用在执行升级安装时,其实现逻辑是将values参数及内置参数按模版渲染成K8s资源,并发送给K8s集群。当K8s集群接收资源后helm就认为安装成功,此时应用的状态将更新成deployed。此时其实K8s并没有真正将Chart包中定义的资源创建、更新好,如果K8s资源更新创建失败,整个发布其实不能算是成功了,因为根本没有运行起来。而添加了–wait参数后,helm将启动一个循环,查看Chart包下所有pod资源在K8s中是否正常更新创建并运行。如果所有pod资源都正常被K8s
更新创建并运行,则将发布状态设置为deployed;如果有pod资源出现异常将返回failed状态。如果到达timeout设置的超时时间仍然所有pod资源没有正常运行,则返回failed状态。wait-for-jobs参数与wait参数类似,但需要先开启wait参数,否则不生效,wait-for-jobs区别于wait参数的地方是需要等到所有job完成。由此可见在设置–wait参数后,如果升级安装操作正常完成,返回deployed状态,则可以确认此次升级安装是执行成功了。但我们也发现有一个不太完美的事情,由于要设置超时时间,如果超过超时时间则认为这次安装失败,有可能由于设置的超时时间不太合理导致虚假故障。并且这个循环操作是在helm中执行的,如果是自己依赖helm源码做的客户化工具,那么客户化工具重启或升级也会加大出问题的风险。对于哪些在升级安装前需要通过钩子实现初始化种子数据的Chart而言超时的可能性更大,因为初始化种子数据一般耗时较长,而且在3.2.0之前是串行执行,在3.2.0之后对于相同权重的钩子资源执行顺序与非钩子资源相同

helm客户端中如何设置及源码处理逻辑

通过helm升级、安装Chart并开启wait、wait-for-jobs

我们需要添加helm客户端的依赖。下面列出的helm依赖是我自己客户化的helm客户端

require (
	github.com/aimjianzhang/helm v0.0.0-20220411123222-8d7d0eade5d5
)

我们需要自己写安装chart包的逻辑,这个安装方法可以参考helm客户端中的helm.cmd.helm.install.go@runInstall方法。通过设置创建的Install对象的Wait属性为ture可以启用wait,我们认真观察一下,可以发现Install对象的属性其实和我们通过helm命令install安装时可以指定的参数是一样的,helm的install命令其实最后转换成的就是Install对象。获取代码

var helmInstallReleaseParams model.HelmInstallReleaseParams
	err := json.Unmarshal([]byte(cmd.Payload), helmInstallReleaseParams)
	if err != nil {
		return nil, NewResponseReleaseError(cmd.Key, cmd.Type, err.Error())
	}

	chartPathOptions := action.ChartPathOptions{
		RepoURL:  helmInstallReleaseParams.RepoURL,
		Version:  helmInstallReleaseParams.ChartVersion,
		Username: helmInstallReleaseParams.RepoUserName,
		Password: helmInstallReleaseParams.RepoPassword,
	}
	// 获取helm配置信息
	actionConfiguration, settings := getCfg(helmInstallReleaseParams.Namespace)

	// 创建install客户端,可以设置helm install支持的参数
	instClient := action.NewInstall(actionConfiguration)
	// 设置chart仓库地址及版本、认证信息等
	instClient.ChartPathOptions = chartPathOptions
	// 设置安装chart包等待所有pod起好
	instClient.Wait = true
	// 设置安装chart包等待所有job运行完成
	instClient.WaitForJobs = true
	// 设置安装是原子的,如果安装失败会回滚到上一个正常版本
	instClient.Atomic = true
	// 需要在那个命名空间下安装
	instClient.Namespace = helmInstallReleaseParams.Namespace
	// release的名称
	instClient.ReleaseName = helmInstallReleaseParams.ReleaseName

	// 查找chart返回完整路径或错误。如果有配置验证chart,将尝试验证
	cp, err := instClient.ChartPathOptions.LocateChart(helmInstallReleaseParams.ChartName, settings)
	if err != nil {
		return nil, NewResponseReleaseError(cmd.Key, cmd.Type, err.Error())
	}

	valuesOptions := getValuesOptions(helmInstallReleaseParams.Values)
	getters := getter.All(settings)
	vals, err := valuesOptions.MergeValues(getters)
	if err != nil {
		return nil, NewResponseReleaseError(cmd.Key, cmd.Type, err.Error())
	}
	// Check chart dependencies to make sure all are present in /charts
	chartRequested, err := loader.Load(cp)
	if err != nil {
		return nil, NewResponseReleaseError(cmd.Key, cmd.Type, er
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值