configmap 上的 helm upgrade 是否会自动将新数据注入 运行 pod?
Does helm upgrade on a configmap automatically inject new data into running pod?
在 运行 pod 上发布 helm upgrade 时,我的 configmap 已更新,但是 pod 会自动知道 configmap 更新的值,还是我需要采取其他步骤来注入新的 configmap 值进入吊舱?
我的总体目标是避免与 运行 pod 交互,例如删除或重新启动/重新安装。
我看到了很多关于更改 sha1sum 和做一些变通方法的信息,但我的问题更基本 - pods 会自动意识到新的 configmap 项目吗?
---- 更新 --- 所以我们最终做的是:
helm upgrade -n release -f release/values.yaml --recreate-pods
虽然这会终止现有的 pod,但另一个会在发出命令后立即启动,这意味着 "near zero" 停机时间。
不,pods不会自动意识到配置映射更改的内容。
在 helm 升级的情况下,这就是您需要使用 helm 模板语法将配置映射文件的哈希值添加到 pod(或 pod 模板)元数据的原因。这会在配置和 pod 之间创建一个 link。
如果你这样做,pod(或 pod 模板)会更新,即使只有配置映射被更改。然后,不需要人工干预。
如果您的 Helm chart 创建了一个 ConfigMap,并且该 ConfigMap 作为卷安装到 pod 中,那么当 ConfigMap 更新时,the container filesystem also updates。然后由应用程序注意到文件已更改。
像 setting a hash of the file contents as a pod annotation 这样的技巧专门用于使 Deployment 以删除和重新创建现有 Pods 的方式进行更新。这没关系! Pods 在 Kubernetes 中是非常一次性的,如果您删除由 Deployment 管理的 Pod,它将自动重新创建。如果您的应用程序仅在启动时读取 ConfigMap 内容(这是非常典型的),那么您需要执行类似的操作以使 Pod 自行重启(从链接文档中复制):
kind: Deployment
spec:
template:
metadata:
annotations:
checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }}
使用头盔:
spec:
strategy:
type: "Recreate"
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
{{- include "dmi.selectorLabels" . | nindent 6 }}
template:
metadata:
{{- with .Values.podAnnotations }}
annotations:
{{- toYaml . | nindent 8 }}
{{- end }}
labels:
checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum | trunc 10}}
只要您的 configmap 发生变化,pod 就会重新创建,因为校验和也会发生变化。我确实使用了策略:重新创建因为我的解决方案不需要滚动更新。但这也适用于滚动更新。
在 运行 pod 上发布 helm upgrade 时,我的 configmap 已更新,但是 pod 会自动知道 configmap 更新的值,还是我需要采取其他步骤来注入新的 configmap 值进入吊舱?
我的总体目标是避免与 运行 pod 交互,例如删除或重新启动/重新安装。
我看到了很多关于更改 sha1sum 和做一些变通方法的信息,但我的问题更基本 - pods 会自动意识到新的 configmap 项目吗?
---- 更新 --- 所以我们最终做的是:
helm upgrade -n release -f release/values.yaml --recreate-pods
虽然这会终止现有的 pod,但另一个会在发出命令后立即启动,这意味着 "near zero" 停机时间。
不,pods不会自动意识到配置映射更改的内容。
在 helm 升级的情况下,这就是您需要使用 helm 模板语法将配置映射文件的哈希值添加到 pod(或 pod 模板)元数据的原因。这会在配置和 pod 之间创建一个 link。
如果你这样做,pod(或 pod 模板)会更新,即使只有配置映射被更改。然后,不需要人工干预。
如果您的 Helm chart 创建了一个 ConfigMap,并且该 ConfigMap 作为卷安装到 pod 中,那么当 ConfigMap 更新时,the container filesystem also updates。然后由应用程序注意到文件已更改。
像 setting a hash of the file contents as a pod annotation 这样的技巧专门用于使 Deployment 以删除和重新创建现有 Pods 的方式进行更新。这没关系! Pods 在 Kubernetes 中是非常一次性的,如果您删除由 Deployment 管理的 Pod,它将自动重新创建。如果您的应用程序仅在启动时读取 ConfigMap 内容(这是非常典型的),那么您需要执行类似的操作以使 Pod 自行重启(从链接文档中复制):
kind: Deployment
spec:
template:
metadata:
annotations:
checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }}
使用头盔:
spec:
strategy:
type: "Recreate"
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
{{- include "dmi.selectorLabels" . | nindent 6 }}
template:
metadata:
{{- with .Values.podAnnotations }}
annotations:
{{- toYaml . | nindent 8 }}
{{- end }}
labels:
checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum | trunc 10}}
只要您的 configmap 发生变化,pod 就会重新创建,因为校验和也会发生变化。我确实使用了策略:重新创建因为我的解决方案不需要滚动更新。但这也适用于滚动更新。