从 Kubernetes 部署迁移到 Helm

从 Kubernetes 部署迁移到 Helm

我们最近已将我们的一个应用程序从纯 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"

另外,您可能会发现这篇文章很有用:

相关内容