在configmap上进行头盔升级是否会自动将新数据注入正在运行的pod中?

时间:2019-02-07 18:07:02

标签: kubernetes kubernetes-helm configmap

在运行中的Pod上发布头盔升级时,我的configmap会更新,但是Pod会自动知道configmap更新的值,还是需要采取其他步骤将新的configmap值注入Pod? >

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

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

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

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

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

3 个答案:

答案 0 :(得分:3)

否,广告连播不会自动了解配置映射更改的内容。

对于头盔升级,这就是为什么您需要使用头盔模板语法将配置映射文件的哈希值添加到Pod(或Pod模板)元数据的原因。这将在配置和pod之间创建一个链接。

如果执行此操作,即使仅更改配置映射,也会更新pod(或pod模板)。然后,无需手动干预。

答案 1 :(得分:3)

如果您的Helm图表创建了ConfigMap,并且该ConfigMap作为卷安装到了容器中,则当ConfigMap更新时,the container filesystem also updates。然后由应用程序来注意到文件已更改。

诸如setting a hash of the file contents as a pod annotation之类的技巧专门用于使Deployment更新,从而删除并重新创建现有Pod。没关系! Kubernetes中的Pod非常易于使用,如果删除由Deployment管理的Pod,它将自动重新创建。如果您的应用程序仅在启动时读取ConfigMap内容(这是非常典型的),则您需要执行以下操作以使Pod自行重启(从链接文档中复制):

kind: Deployment
spec:
  template:
    metadata:
      annotations:
        checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }}

答案 2 :(得分:0)

使用头盔:

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