如何使用 Helm 更新 GKE 集群上运行的工作负载的 ConfigMap?

Posted

技术标签:

【中文标题】如何使用 Helm 更新 GKE 集群上运行的工作负载的 ConfigMap?【英文标题】:How to update the ConfigMap for the workloads running on GKE cluster using Helm? 【发布时间】:2019-12-09 11:04:57 【问题描述】:

我有一个使用 Prometheus 和 Prometheus 警报管理器作为有状态集运行的 GKE 集群。每个有状态集都在运行收集指标的 pod。 Prometheus 有两个 ConfigMap(具有 alerts.yaml、rules.yaml 和 premoetheus.yaml),警报管理器有(alertmanager.yml)。

现在我有一项新任务,将警报发送到 Slack。我已经分别更新了 alerts.yaml、rules.yaml 和 alertmanager.yml,以便将警报发送到 Slack。

我需要使用 Helm 在运行 GKE 中的工作负载和 Pod 的集群上更新 Prometheus 和警报管理器的所有 .yaml 文件。有人可以告诉我如何使用 Helm 实现这一目标吗?

【问题讨论】:

你有 prometheus 和 alert manager 的舵图吗? 不,我应该如何使用所有这些配置文件创建 Helm Chart? 我的有状态集已经在 GKE 集群上运行。现在,我在 prometheus 和 alertmanager.yml 中添加了警报。我现在如何使用 Helm 使用我在所有 .yaml 文件中的最新更改来更新 steteful set configmaps? 是的,您需要为此创建 helm chart,然后通过 helm 发布您可以更新 configmaps。 helm.sh/docs/chart_template_guide 【参考方案1】:

我还建议您使用 helm 来管理您的服务,但您可以在完全不需要使用 helm 的情况下更新 configMap。

首先,您可以使用apply 更改confiMap 中的数据。

kubectl apply -f fileName.yaml

但这并没有更新您的 pod 中加载的 configMap 信息,您需要重新启动您的 pod 以查看更改,因为您有一些不同的选择:

选项 1

手动操作。

删除 Pod,这会使部署控制器强制创建新的 Pod,以使您在部署定义中拥有副本计数,并且 Pod 在启动时采用新的 configMap。

kubectl delete pod <pod-name>

在该解决方案中,您将逐个删除 pod。

缩小/放大部署,您可以手动将部署缩小到 0,然后再次放大以创建使用新 confirmMap 的新 pod。

kubectl scale deployment <deployment-name> --replicas=0 && kubectl scale deployment <deployment-name> --replicas=2

有了这个解决方案,你就不用一一删除了。

选项 2

您可以在部署中使用 env var 定义来强制滚动更新,该变量不会在 pod 内部使用,但您可以通过编辑部署来使用 ti 来强制滚动更新。

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    run: helloworld
  name: helloworld
spec:
  replicas: 1
  selector:
    matchLabels:
      run: helloworld
  strategy: 
  template:
    metadata:
      creationTimestamp: null
      labels:
        run: helloworld
    spec:
      containers:
      - image: helloworld
        name: helloworld
        env:
        - name: RELOAD_VAR
          value: TAG_VAR0

每次更改 RELOAD_VAR 值时,部署都会执行滚动更新,创建新的 pod 并加载新的确认地图

选项 3

通过一种更自动化的方式,您可以使用一种特殊类型的控制器,该控制器使用注释来监视 configMap 上的更改,并重新加载具有与该 confirmMap 关联的正确注释的 pod。

您可以查看https://github.com/stakater/Reloader,您只需将其部署在您的集群上并将注释放在您的部署中。

kind: Deployment
metadata:
  annotations:
    configmap.reloader.stakater.com/reload: "foo-configmap"
spec:
  template:
    metadata:

每次您更改 configMap 时,无论您如何操作,控制器都会检测到更改并自动重新加载您的 pod。

【讨论】:

感谢您的信息。我可以不使用以下命令直接创建/替换 configmaps kubectl create configmap foo --from-file foo.properties -o yaml --dry-run | kubectl 替换 -f - 是的,您可以,但您也有同样的问题,除非您重新创建您的 pod,否则 configMap 中包含的信息不会在 pod 上更新。根据您的问题,我了解 yaml 文件包含部署和 configMap 在这种情况下,请确保每次运行该命令时都会重新创建 pod。 是的,我希望 pod 自动获取更新的 ConfigMap,而不是手动重新创建。您建议的选项 3 似乎是最好的,可以让 pod 自动适应新的 ConfigMap。但是如何编辑已经运行的有状态集以添加注解以供重新加载器使用?此外,在 Google Kubernetes Engine 上部署此重新加载器是否安全? 是的,部署它是安全的,我已经在生产服务中使用它,没有问题。要编辑实际的有状态集,您只需编辑 yaml 文件并运行 kubectl apply -f &lt;yaml-file&gt; 好的,谢谢,还有一个问题,对于有状态集,我是否也可以使用 here 所述的滚动更新策略来自动更新 pod?在这种情况下,我不必删除和重新创建 pod。一旦这样的命令是kubectl patch statefulset web -p '"spec":"updateStrategy":"type":"RollingUpdate"

以上是关于如何使用 Helm 更新 GKE 集群上运行的工作负载的 ConfigMap?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 prometheusOperator.admissionWebhooks.enabled=false 在 GKE 上安装 helm chart prometheus-operator?

K8s集群上使用Helm部署2.4.6版本Rancher集群

尝试使用 TFX 运行非常简单的 Kubeflow 管道时,为啥 GKE 集群上的 pod 会 OOMkilled?

如何在 GKE 上调试节点健康错误?

GKE 自动驾驶仪根本没有扩展

在具有私有 GKE 集群的 Terraform 上使用 Kubernetes 提供程序