问题描述
连接到一个集群,该集群有一个来自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完全丢失,这是从集群中检索此信息的唯一方法。