Helm Charts hooks钩子让资源按照先后顺序创建,并延迟执行或暂停等待几秒再执行
在使用Helm Charts部署应用到Kubernetes Cluster集群中时,可能需要等待一些依赖项先行启动起来,后续应用部署才不至于启动出错。
比如在安装时在加载其他chart之前加载配置映射或密钥。
比如部署的微服务应用需要等待数据库初始化操作成功,才可以启动时。如果这时候应用在数据库初始化还未成功完成时之前便开始执行启动操作时,大概率是会有问题发生的。
为了解决这个问题,我们需要使用到helm charts hooks钩子的权重特性来调整安排资源创建的先后启动顺序:
假设微服务 Microservice A的启动 依赖于应用B, 需要等待B先启动起来,才可以启动A。
假设A和B都定义在helm charts 应用的templates目录下的deployment.yaml里面,
我们需要给B加上hook钩子的注解
annotations
,例如:
1 | apiVersion: v1 |
那么这时应用B就会比A先行启动,因为B会在pre-install
阶段先启动,并且它的hook-weight权重指定为-5
,
(假如还有其他应用指定了hook-weight权重,假如hook-weight为0还有10,那么执行顺序为-5,0,10)
但是如果这时A只是间隔几秒便开始启动,并未等待B完全启动初始化成功,那么指定hook-weight权重执行顺序也没用。
这时需要在B之后,并且在A之前再加一个等待暂停的hook钩子,并指定hook-weight权重数字大于-5,小于0, 比如-4
.来延迟A的启动操作。
在helm charts 应用的templates目录下创建一个新的文件,文件名为hook-sleep-20s.yaml
加入如下内容:
1 | apiVersion: v1 |
利用Linux的sleep
命令来延迟A的执行,暂停20秒等待B完全初始化成功启动,再来启动A.
会在启动A之前部署一个名为mychart-sleep的Kubernetes的Pod资源。它的使命就是沉睡20秒.等待B完全初始化成功。
因为配置了hook-delete-policy删除政策,所以在等待暂停20秒后会自动删除这个钩子即kubernetes资源pod, 然后开始后续的操作。
还有另外一种方法,是使用kubernetes的initContainers
或者containers lifecycle
功能来实现sleep暂停,
initContainers
是在主容器(Pod中其他容器)启动之前运行的容器,可以用来预处理、配置、初始化容器等。你可以将需要在主容器启动之前运行的脚本放到initContainers中.
lifecycle
是容器的生命周期管理机制,可以用来指定容器启动和停止时需要执行的命令。你可以在lifecycle
中设置postStart
和preStop
,从而实现延迟部署或暂停等待几秒再执行的功能。例如,你可以在postStart中设置一个等待几秒钟的sleep命令,从而实现延迟部署的功能
示例如下:
1 | apiVersion: v1 |
使用lifecycle时,并不能完全保证会在容器的entrypoint之前被执行。
Helm Charts hooks钩子让资源按照先后顺序创建,并延迟执行或暂停等待几秒再执行
https://yanmouxie.com/helm-chart-hooks-sleep-waiting-deploy-by-sequential.html