4

在正在运行的 pod 上发布 helm upgrade 时,我的 configmap 会更新,但是 pod 会自动知道 configmap 更新的值,还是我需要采取其他步骤将新的 configmap 值注入 pod?

我的总体目标是避免与正在运行的 pod 交互,例如删除或重新启动/重新安装。

我已经看到很多关于更改 sha1sum 和做一些变通方法的信息,但我的问题更基本 - pod 会自动意识到新的 configmap 项目吗?

---- 更新 --- 所以我们最终做的是:

helm upgrade -n release -f release/values.yaml --recreate-pods

尽管这会终止现有的 pod,但在发出命令后会立即启动另一个 pod,这意味着“接近零”的停机时间。

4

3 回答 3

23

如果您的 Helm chart 创建了 ConfigMap,并且该 ConfigMap 作为卷挂载到 pod 中,那么当 ConfigMap 更新时,容器文件系统也会更新。然后由应用程序来通知文件已更改。

诸如将文件内容的哈希设置为 pod 注释之类的技巧专门用于导致 Deployment 以删除和重新创建现有 Pod 的方式进行更新。这没关系!Kubernetes 中的 Pod 是一次性的,如果你删除一个由 Deployment 管理的 Pod,它会自动重新创建。如果您的应用程序仅在启动时读取 ConfigMap 内容(这是非常典型的),那么您需要执行以下操作以使 Pod 自行重启(从链接文档中复制):

kind: Deployment
spec:
  template:
    metadata:
      annotations:
        checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }}
于 2019-02-08T02:27:09.703 回答
10

不,Pod 不会自动意识到配置映射更改的内容。

在 helm 升级的情况下,这就是您需要使用 helm 模板语法将配置映射文件的哈希值添加到 pod(或 pod 模板)元数据的原因。这会在配置和 pod 之间创建一个链接。

如果您这样做,即使仅更改了配置映射,也会更新 pod(或 pod 模板)。然后,不需要人工干预。

于 2019-02-07T21:46:11.693 回答
1

使用掌舵:

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

于 2020-11-23T21:15:16.147 回答