如何从集群中找到或获取原始Helm chart

63次阅读
没有评论

问题描述

连接到一个集群,该集群有一个来自chart的发布,但是它是由其他人安装的,我认为他们使用了一个调整过的、存储在本地的chart。我无法访问他们的原始chart/repo。有没有办法从集群中检索它,以便我可以进行调整/修改并重新安装它?或者,我能找到使用的原始repo的URL吗?chart的名称是wordpress-0.6.0,但这对我没有用,因为它与”official”/原始的chart相同。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

你可以使用helm get manifest <RELEASE_NAME>命令从Kubernetes集群中获取kubernetes manifests,你可以使用helm get values <RELEASE_NAME>命令从集群中获取values.yaml。但是我不认为有任何方法可以获取回chart文件。抱歉。
请将<RELEASE_NAME>替换为您的发布名称。

方案2

使用helm fetch命令从helm kubernetes集群获取包,该命令将从存储库中下载chart,并(可选)在本地目录中解压缩它。
使用helm fetch --help命令查看格式选项。
使用helm --help命令查看可用命令。
以下是一个示例bash脚本,可以在容器A启动后启动容器B:

#!/bin/bash
# 启动容器A
docker run -d --name container_a your_image_a
# 等待容器A完全启动
while ! docker exec container_a echo "Container A is ready"; do
  sleep 1
done
# 启动容器B
docker run -d --name container_b your_image_b

在这个示例中,我们首先使用docker run命令启动容器A,并将其命名为container_a。然后,使用一个循环来等待容器A完全启动(这里是通过在容器内运行echo命令来测试)。一旦容器A就绪,我们再使用docker run命令启动容器B,并将其命名为container_b

方案3

你可以从helm repo下载最新的稳定或不稳定版本。首先,你需要验证远程helm repo URL,使用以下命令:

helm repo list

对于稳定的repo URL,你将得到如下输出:

NAME            URL
stable          https://kubernetes-charts.storage.googleapis.com

它指的是https://github.com/helm/charts/tree/master/stable
现在我将告诉你如何从repo URL下载chart:

helm fetch stable/wordpress --version 0.6.0

对于chart的提取副本:

helm fetch stable/wordpress --version 0.6.0 --untar

上述命令将在当前目录中下载chart。

方案4

以下在helm-3中适用:
1. 使用helm list命令获取要获取chart的发布名称。
2. 运行helm get manifest [release name]命令。
你可以将其写入文本文件而不是标准输出,并分离chart。注意:你需要创建persistedVolumes和PVC。这些不会使用上述命令导出。

方案5

我知道这是一个旧问题,但由于还没有正确的答案,未来可能会有更多的人面临这个问题,所以这是我的建议:
你无法从Kubernetes集群中下载原始chart,但你可以获取与原始chart中的所有信息相同的信息。
Helm会创建一个发布的secret(或在Helm v2中为configMap),其中包含原始chart中的几乎所有信息。这是编码的,但我们可以使其可读。
首先,进入你的安装所在的命名空间,运行以下命令:

kubectl get secrets

会有一个类似于这样的secret:

sh.helm.release.v1.<chart name>.v1

如果你有足够的访问权限,你可以访问此secret的内容。但是,内容已经进行了两次Base64编码,并且还进行了gzip压缩。因此,为了创建一个可读的文件,其中包含您需要的所有信息,您可以运行以下命令:

kubectl get secret sh.helm.release.v1.<chart name>.v1 -o json | jq .data.release | tr -d '"' | base64 --decode | base64 --decode | gzip -d > output.json

让我们稍微解释一下。
kubectl get secret从集群中获取secret。
sh.helm.release.v1.<chart name>.v1是我们之前运行kubectl get secrets时得到的secret名称。
-o json确保我们获得json输出。
jq .data.release选择我们实际想要的json输出的部分。
tr -d '"'删除进一步处理的不必要的"字符。
base64 --decode解码base64编码的数据。我们运行了两次。
gzip -d解压缩生成的文件。
>output.json确保我们将生成的数据写入名为output.json的文件中,以便更容易阅读(否则,您将在终端上看到几十到几百行的输出)。
这将生成一个类似于以下内容的json文件:

{
    "name": "chartName",
    "info": {
        "first_deployed": "2023-04-04T12:53:46.750501771Z",
        "last_deployed": "2023-04-04T13:16:24.683772+02:00",
        "deleted": "",
        "description": "Upgrade complete",
        "status": "deployed",
        "notes": "this is a beautiful app for beautiful people"
    },
    "chart": {
        "metadata": {
            "name": "chartname",
            "home": "link-to-homepage.com",
            "sources": [
                "https://github.com/link/to/source"
            ],
            "version": "1.0.0",
            "description": "this beautiful chart deploys a beautiful app for beautiful people",
            "maintainers": [
                {
                    "name": "john doe",
                    "email": "john.doe@company.com"
                },
                {
                    "name": "jane doe",
                    "email": "jane.doe@company.com"
                }
            ],
            "icon": "link-to-icon.png",
            "apiVersion": "v2",
            "appVersion": "v1.0.0",
            "annotations": {
                "artifacthub.io/license": "Apache-2.0",
            }
            "dependencies": [
                {
                    "name": "foo",
                    "version": "1.0.2",
                    "repository": "link-to-repo"
                },
            "type": "application"
        },
        "lock": null,
        "templates": [
            {
                "name": "templates/configmap.yaml",
                "data": "abc123"
            },
            {
                "name": "templates/ingress.yaml",
                "data": "abc123="
            }
        ],
        "values": {
            "foo": "bar"
            "boolean": false
        }
    }
}

dependencies指的是你正在查看的发布所依赖的Helm charts。
templates指定了Helm chart的templates文件夹中原始文件的名称,data部分是它们的内容(再次进行了base64编码)。
values部分指定了Helm chart的values.yaml文件中的内容。
你可以使用这些依赖项、模板和值来重新创建原始的Helm chart。
请注意,这是一种相当费力的方式来检索信息,它将花费相当多的时间。但是,据我所知,如果原始Helm Chart完全丢失,这是从集群中检索此信息的唯一方法。

正文完