【问题标题】:Get helm rollback image version获取helm回滚镜像版本
【发布时间】:2021-11-29 22:11:24
【问题描述】:

我正在使用 C# 代码运行命令 helm rollback <ImageName> 以回滚到以前的版本(通过使用 helm 创建 new Proccess())。

有没有办法知道命令回滚到的图像的标签?

【问题讨论】:

  • helm rollback 适用于已发布的修订号。您是说如何获取已发布的图像标签?
  • @gohm'c 你不必提供版本然后它回滚到以前的版本,所以我想知道如果我没有找到它回滚到的版本提供特定版本。如果我能以某种方式获得一般发布的标签,你所说的也可以工作,但我也不知道该怎么做
  • 是的,但是你在那里写了 helm rollback <ImageName> ... 所以你实际上是指修订号,隐式或显式。此外,Is there a way to know the tag of the image the command rolled back to? 真正的意思是再次发布版本号,而不是发布图表本身中的 image:tag。
  • 您对问题的理解正确吗?
  • 可见的helm history 或类似的元数据中没有任何内容记录特定部署可能使用的标签。 helm get values --revision ?? 可能包含您需要的信息,但它将是特定于图表的(如果标记在 YAML 文件中已修复,则它也不会在那里可见)。

标签: kubernetes kubernetes-helm


【解决方案1】:

环境

部署了 2 个 helm 图表的小型集群:

使用helm v3.7.0。

还安装了 yq 以使用 yaml 中的输出,就像 jq 使用 json 一样。

回滚逻辑

如果没有设置revision,则回滚之前的revision。如果在没有revision 的情况下再次运行rollback,则会再次使用前一个。

$ helm history traefik
REVISION        UPDATED                         STATUS          CHART           APP VERSION     DESCRIPTION     
1               Tue Oct 12 11:28:22 2021        superseded      traefik-10.3.5  2.5.3           Install complete
2               Tue Oct 12 11:42:47 2021        superseded      traefik-10.3.6  2.5.3           Upgrade complete
3               Tue Oct 12 11:44:32 2021        superseded      traefik-10.3.2  2.5.1           Upgrade complete
4               Tue Oct 12 12:03:26 2021        superseded      traefik-10.3.6  2.5.3           Rollback to 2   
5               Tue Oct 12 13:26:02 2021        deployed        traefik-10.3.2  2.5.1           Rollback to 3
6               Tue Oct 12 13:26:53 2021        deployed        traefik-10.3.6  2.5.3           Rollback to 4

所以要弄清楚回滚修订的细节,我们可以使用当前修订。

与从其他revisions中查找详细信息的方式相同,例如将使用标志--revision XX

$ helm get manifest traefik --revision 3

回答

经过一些研究,我发现至少有 3 个选项可以检索此信息:

  1. 来自manifest 已应用(最精确的方法):

    $ helm get manifest ingress-nginx -n ingress-nginx | yq eval '.spec.template.spec.containers[].image' - | grep -oE '[v]?[0-9]\.[0-9]\.[0-9]'
    v1.0.0
    
    $ helm get manifest traefik | yq eval '.spec.template.spec.containers[].image' - | grep -oE '[v]?[0-9]\.[0-9]\.[0-9]'
    2.5.3
    

    在本例中使用yq,因为helm manifest 仅在yaml 中提供输出:

    $ helm get manifest --help

    此命令获取为给定版本生成的清单。

    清单是 Kubernetes 的 YAML 编码表示 从此版本的图表生成的资源。如果一个图表 依赖于其他图表,这些资源也将包含在 清单。

  2. 来自values(并非总是有效,取决于图表和/或图像详细信息是否位于values.yaml 或使用--set 标志设置):

    $ helm get values ingress-nginx --all -n ingress-nginx -o json | jq '.controller.image.tag' 
    "v1.0.0"
    
    $ helm get values traefik --all -o json | jq '.controller.image.tag'
    null
    
  3. 来自 kubernetes 的秘密(最难):

    所有revisions 都作为secrets 存储在部署chart 的同一命名空间中,例如:

    $ kubectl get secrets
    NAME                            TYPE                                  DATA   AGE
    sh.helm.release.v1.traefik.v1   helm.sh/release.v1                    1      134m
    sh.helm.release.v1.traefik.v2   helm.sh/release.v1                    1      119m
    sh.helm.release.v1.traefik.v3   helm.sh/release.v1                    1      118m
    sh.helm.release.v1.traefik.v4   helm.sh/release.v1                    1      99m
    sh.helm.release.v1.traefik.v5   helm.sh/release.v1                    1      16m
    sh.helm.release.v1.traefik.v6   helm.sh/release.v1                    1      15m
    

    这些secrets 中存储数据的方式是even more complicated,但是也可以从中检索image tag。提供的链接包含有关如何从这些secrets 中提取数据的详细信息。

    以下是解码其中一个秘密的命令引用:

    kubectl get secrets sh.helm.release.v1.wordpress.v1 -o json | jq .data.release | tr -d '"' | base64 -d | base64 -d | gzip -d
    

有用的链接:

【讨论】:

  • @WytrzymałyWiktor 我最终最终使用了一个我们已经拥有的数据库来保存版本而不是从 helm 命令获取它。我不知道这个解决方案是否有效,如果有的话会接受它其他 cmets 说它有效
猜你喜欢
  • 1970-01-01
  • 2019-01-24
  • 2020-09-24
  • 2019-02-28
  • 1970-01-01
  • 2018-09-23
  • 2019-10-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多