即使 POD 不受升级影响,"helm upgrade"重新启动它们吗?



我的舵图有大约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/

最新更新