我们最近已将我们的一个应用程序从纯 kubernetes 部署转移到 helm chart 部署。
我正在尝试找到一种方法来迁移当前运行旧部署的集群以使用新的 Helm 图表。
我遇到了一个问题,因为当集群上存在与要安装的资源相同的现有资源时,helm chart 无法干净地安装。例如,我有一项如下所示的服务
$ kubectl get service elasticsearch -oyaml
apiVersion: v1
kind: Service
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"creationTimestamp":"2018-01-26T01:39:20Z","labels":{"app":"elasticsearch"},"name":"elasticsearch","namespace":"default","resourceVersion":"18650241","selfLink":"/api/v1/namespaces/default/services/elasticsearch","uid":"bac30dfa-0239-11e8-b7a8-0015b2aa5ea6"},"spec":{"externalName":"100.64.0.100","sessionAffinity":"None","type":"ExternalName"},"status":{"loadBalancer":{}}}
creationTimestamp: 2018-10-04T21:22:06Z
labels:
app: elasticsearch
name: elasticsearch
namespace: default
resourceVersion: "31430"
selfLink: /api/v1/namespaces/default/services/elasticsearch
uid: 8b82157e-c81b-11e8-a0d8-94c69116956d
spec:
externalName: 127.0.0.1
sessionAffinity: None
type: ExternalName
status:
loadBalancer: {}
我的 helm chart 有一个类似这样的模板
$ cat elasticsearch.yaml
apiVersion: v1
kind: Service
metadata:
labels:
app: elasticsearch
name: elasticsearch
spec:
type: ExternalName
externalName: 127.0.0.1
status:
load_balancer: {}
如果我尝试使用以下方式应用我的图表
$ helm install /path/to/chart --name=chart-name
将会因此错误而失败
Error: release chart-name failed: services "elasticsearch" already exists
更糟糕的是,即使安装失败,图表也会在 Helm 中显示为“FAILED”状态。如果我删除图表,它将删除一些正在运行的部署。
我有两个问题。
1)如何安装我的图表并让它控制现有服务。
2)是否可以从 helm 中删除失败的图表而不删除正在运行的部署?
答案1
如果您将 Helm 图表部署到另一个命名空间,并确保一切按预期工作后,将客户端流量重定向到该命名空间,那么您就不会遇到这个问题。
Helm 使用 ConfigMaps 来存储有关已安装版本的信息,因此可能有一种方法可以安装部分图表,然后通过添加该命名空间中存在的错过的资源来更改 ConfigMap,并更改 helm 图表以同时将这些资源包含在图表模板中。
我能想到的另一种方法是将完整的图表部署到另一个命名空间,然后在图表安装期间 tiller 创建的 ConfigMap 中更改命名空间。
这两种方式都很复杂,需要精确的操作,如果您犯了一个错误,最终可能会导致环境被破坏,因此最好先使用测试环境和简单图表尝试一下。
为了让 Helm 忘记特定的版本,您可以从 Tiller 命名空间中删除相应的 ConfigMap。
您可以使用以下命令检查现有 Helm ConfigMaps 的内容:
kubectl get configmap -n <tiller-namespace-name> -l "OWNER=TILLER"
另外,您可能会发现这篇文章很有用: