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 就会重新创建,因为校验和也会发生变化。我确实使用了策略:重新创建因为我的解决方案不需要滚动更新。但这也适用于滚动更新。