我的舵图有大约12个PODS。当我在更改一些值后执行helm upgrade
时,除了一个之外,所有POD都会重新启动。
我的问题是:
即使不受升级影响,helm upgrade
是否会重新启动PODS?
换一种方式:
是helm upgrade
仅在POD受到升级影响时才重新启动吗?
标志--recreate-pods
在Helm 2中被标记为已弃用,并在Helm 3中被移除。
Helm建议添加其他文件的校验和,这些文件可能会像一样发生变化
annotations:
checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }}
或者添加带有随机数的注释,强制每个卷展栏进行更新:
annotations:
rollme: {{ randAlphaNum 5 | quote }}
参见Helm文档:https://v3.helm.sh/docs/howto/charts_tips_and_tricks/#automatically-滚动部署
就我而言,只重新启动受升级影响的吊舱
如果你想重新启动所有pod,你可以使用——重新创建pod标志
-重新创建pod->如果适用,则为资源执行pod重新启动
例如,如果您有仪表板图表,您可以使用此命令重新启动每个pod。
helm upgrade --recreate-pods -i k8s-dashboard stable/k8s-dashboard
有一个github问题为其提供了另一种解决方法
每次需要重新启动pod时,都要更改该注释的值。一个好的注释可以是时间戳
首先,向pod添加一个注释。如果您的图表属于部署类型,请在spec.template.metadata.annotations中添加注释。例如:
kind: Deployment
spec:
template:
metadata:
labels:
app: ecf-helm-satellite-qa
annotations:
timestamp: "{{ .Values.timestamp }}"
部署它。现在,每次在helm命令中设置时间戳时。Kubernetes将在不停机的情况下推出新的更新。
helm upgrade ecf-helm-satellite-qa . --set-string timestamp=a_random_value
--recreate-pods
已在helm 3中删除,这无疑引起了一些helm用户的注意。
我强制使用部署pod规范中的时间戳来重新创建pod。注意,它必须在规范中,这在部署顶层不起作用:
spec:
template:
metadata:
annotations:
releaseTime: {{ dateInZone "2006-01-02 15:04:05Z" (now) "UTC"| quote }}
您需要先删除作业,并运行
helm history <release_name>
helm rollback <release_name> <number> --recreate-pods
我已经使用推荐定义了一个模板助手,并在这里添加了它,这样我就不会忘记:(
{{- define "vtd2-consumer.annotations" -}}
{{ .Values.podAnnotations | toYaml }}
releaseTime: {{ dateInZone "2006-01-02 15:04:05Z" (now) "UTC"| quote }}
rollme: {{ randAlphaNum 5 | quote }}
checksum/config: {{ include (print $.Template.BasePath "/config.yaml") . | sha256sum }}
{{- end }}
删除决定你喜欢哪种方法releaseTime、rollme或checksum/config,非常确定你不需要两者都有。
--force force resource updates through a replacement strategy
https://helm.sh/docs/helm/helm_upgrade/