首页 > 解决方案 > 获取helm回滚镜像版本

问题描述

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

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

标签: kuberneteskubernetes-helm

解决方案


环境

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

helm使用 v3.7.0。

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

回滚逻辑

如果revision设置为 no,则将在 previous 上执行回滚revision。如果在没有 的情况下再次rollback运行revision,将再次使用前一个。

$ 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. 从应用的清单(最精确的方法):

    $ 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 获取清单 --help

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

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

  2. (并不总是有效,取决于图表和/或图像详细信息是否位于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中的方式更加复杂,但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
    

有用的链接:


推荐阅读