使用Helm的经验和知识

这是我亲自使用helm后得到的见解。

每个manifest文件只能写一个资源。

将ServiceAccount的模板创建以循环的方式进行。通过使用”—“将yaml文件分割,可以进行多个描述。

当执行 `helm upgrade –install` 时,请尝试以下:

在从生manifest管理过渡时,确保名称不会发生冲突。

我曾以原始方式直接管理RBAC系列的清单文件,但现在决定将其转化为chart模式。一开始,我尝试将yaml文件直接移动并进行发布,但由于与现有资源发生名称冲突,导致发布失败。

可以通过在发布名称前添加前缀等方式来避免冲突。如果正在使用serviceaccount token进行API认证,由于令牌会发生变化,因此将这些内容移至现有的图表中是一种选择。

metadata:
  name: {{ .Release.Name }}-clusterrole

缩小发布

通过在名为infra的chart的requirements.yaml文件中写入依赖项并进行综合发布,然后根据下文中的helm upgrade –install规范,不得不执行helm delete –purge操作,导致prometheus、grafana和namerd的数据丢失。

dependencies:
  - name: l5d
    version: 0.7.0-dev
    condition: l5d.enabled
  - name: prometheus
    version: 4.6.12
    condition: prometheus.enabled
  - name: grafana
    version: 0.4.4-b.0
    condition: grafana.enabled
  - name: nginx-ingress
    version: 0.11.1-b.0
    condition: nginx-ingress.enabled
  - name: mysql
    version: 0.3.0-b.1
    alias: grafana-mysql
    condition: grafana.enabled
  - name: stackdriver-trace
    version: 0.1.1
    condition: stackdriver-trace.enabled
  - name: fluentd-gcp
    version: 0.3.0-dev
    condition: fluentd-gcp.enabled

以适当的单位进行发布。上述图表可以按以下方式进行拆分发布。

    • namerd

 

    • prometheus

 

    • linkerd

 

    • grafana

 

    • stackdriver-trace

 

    fluentd-gcp

我认为在进行这种发布时,可以使用一个方便的工具叫Helmfile来进行管理。

翻译:「TILLER_HISTORY_MAX取值应设置较大」

(截至helm v2.8.2目前。未来可能会进行修正。)

我从Helm 2.6.2升级到了2.8.2。在此过程中,我对大量存在的history的configmap感到担忧。Helm会将发布历史存储为configmap,并保存在kube-system中。在2.6版本中,它可能是无限制的。

从2.7或2.8版本开始,可以使用tiller init –max-history来指定保存历史记录的时间。在迁移时,使用tiller init –upgrade来升级tiller的版本,但不能同时使用–max-history选项,因此需要手动将env注入tiller-deploy configmap中。

暂时只需要管理大约五代就可以了。我设定了这个数字之后,如下问题所示,如果失败的发布超过这个数量,所有的发布都会失败。于是,helm upgrade –install 就变得无法使用了。为了解除这种状态,只能使用 helm delete –purge {release}。

由于将许多图表装入一个发布中,导致了致命的结果。请确保 TILLER_HISTORY_MAX 设置得足够大。

当发生错误时,可以通过`helm template`命令来检查生成的yaml文件。

完成

在划分Kubernetes API版本时,我们应该使用semverCompare而不是gt。

为了支持不同版本的Kubernetes,我们在_helper.yaml中进行了以下定义以进行切割。当在Kubernetes v1.10.0上运行时,出现了将batch/v2alpha1设置为无法部署的情况。

{{/*
Return the appropriate apiVersion for Curactor cron job.
*/}}
{{- define "curator.cronJob.apiVersion" -}}
{{- if ge .Capabilities.KubeVersion.Minor "8" -}}
"batch/v1beta1"
{{- else -}}
"batch/v2alpha1"
{{- end -}}
{{- end -}}

如”Issue所述,.Capabilities.KuberVersion.Minor”返回的值是字符串类型,并呈现了这种行为。

当比较版本号(semver)时,使用下面的 semverCompare 函数似乎是最合适的。

{{/*
Return the appropriate apiVersion for Curactor cron job.
*/}}
{{- define "curator.cronJob.apiVersion" -}}
{{- if semverCompare ">=1.8.0" .Capabilities.KubeVersion.GitVersion -}}
"batch/v1beta1"
{{- else -}}
"batch/v2alpha1"
{{- end -}}
{{- end -}}
bannerAds