使用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 -}}