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

How to update the ConfigMap for the workloads running on GKE cluster using Helm?

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

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

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

我还建议您使用 helm 来管理您的服务,但您根本不需要使用 helm 就可以更新 configMap。

首先,您可以使用 apply.

更改 confiMap 中的数据
kubectl apply -f fileName.yaml

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

选项 1

手动操作。

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

kubectl delete pod <pod-name>

在该解决方案中,您将逐一删除 pods。

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

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 值时,部署都会执行滚动更新,创建新的 pods 并加载新的 confirMap

选项 3

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

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

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

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