【问题标题】:On kubernetes helm how to replace a pod with new config values在 kubernetes helm 如何用新的配置值替换 pod
【发布时间】:2019-11-12 14:35:22
【问题描述】:

我正在使用 helm 图表来部署带有“ConfigMap”管理配置的 pod。

我直接编辑 ConfigMap 对配置文件进行更改,然后使用 kubectl delete 删除 pod,以使新配置生效。

有没有简单的方法使用 helm 将正在运行的 pod 替换为新配置而不执行“kubectl delete”命令

【问题讨论】:

    标签: docker kubernetes config kubernetes-helm


    【解决方案1】:

    我们发现使用 --recreate-pods 将立即终止该部署的所有正在运行的 pod,这意味着您的服务会出现一些停机时间。换句话说,您的 pod 不会滚动更新。

    在 Helm 中解决此问题的问题仍未解决:https://github.com/kubernetes/helm/issues/1702

    相反,helm 建议在注释中将配置文件的校验和添加到部署中。这样一来,部署将具有不同的哈希值,并且基本上看起来“新”,从而使其正确更新。

    sha256sum 函数可用于确保在另一个文件更改时更新部署的注释部分:

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

    来自此处的文档:https://helm.sh/docs/charts_tips_and_tricks/#automatically-roll-deployments-when-configmaps-or-secrets-change

    【讨论】:

    • 这是否适用于存储在存储库中的 Helm 图表?我认为这破坏了存储库的目的,所有图表都必须在本地提取。
    • 嗯,不知道你的意思。如果这段代码的 sn-p 在 helm 图表中,并且该图表在存储库中,那么它应该可以正常工作。
    • 这适用于代码存储库,例如 Git。但它是否适用于 Helm 工件存储库,例如 S3,其中文件以 mychart-0.1.0.tgz 格式保存?
    • 据我所知那里没有区别。 Tiller 通过它的模板运行图表,结果是一样的。除非我的心智模型在某处出错,否则存储在 git 中的图表与存储在其他地方的图表没有区别。
    • 这里没有用。通过描述部署,我可以看到新的注释元数据,但没有重新创建 pod。
    【解决方案2】:

    如果您需要滚动更新而不是立即终止 pod,请添加

    date: "{{ .Release.Time.Seconds }}"
    

    进入规范/模板/元数据/标签。

    该版本将进行配置更改,如果设置为 spec/stategy/type,则会触发滚动更新。

    如果您刚刚更改了 ConfigMap 或 Secret,请查看 https://helm.sh/docs/developing_charts/#automatically-roll-deployments-when-configmaps-or-secrets-change

    【讨论】:

      【解决方案3】:

      你可以运行

      helm upgrade --recreate-pods

      这样做。

      【讨论】:

      • 如果您需要零停机部署,我不推荐这种方法。 --recreate-pods 标志会立即终止部署的所有正在运行的 Pod。
      【解决方案4】:

      @Oliver 解决方案对我不起作用,因为没有通过更新部署注释重新创建 pod。

      解决方案是根据您的 values.yaml 文件使用动态配置映射名称。

      在 values.yaml 中:

      configVersion: # Change those numbers to force recreating pods
        myApp: 1
      

      在您的配置映射中:

      metadata:
        name: {{ .Release.Name }}-my-config-v{{ .Values.configVersion.myApp}}
      

      在您的部署中:

      - configMapRef:
        name: {{ .Release.Name }}-my-config-v{{ .Values.configVersion.myApp}}
      

      【讨论】:

      • 可能你犯了和我一样的错误,我不小心把注解放在了部署(spec.metadata.annotations)上,pod没有重启。他们告诉您将注释放在模板上(spec.template.metadata.annotations),当我将注释移到那里时它就起作用了。
      猜你喜欢
      • 2019-06-22
      • 1970-01-01
      • 2020-04-01
      • 2019-08-23
      • 2018-08-02
      • 1970-01-01
      • 2021-01-30
      • 2018-10-21
      • 1970-01-01
      相关资源
      最近更新 更多