微信公众号:运维开发故事,作者: 姜总

为什么需要helm?

  • k8s上的应用对象都有特定的资源描述组成,包括deployment、service等。都保存各自文件中或者集中写到一个配置文件,然后执行kubectl apply -f 进行部署。

  • 如果应用只由一个或几个这样的服务组成,上面部署方式足够了。

对于一个复杂的应用,会有很多类似上面的资源描述文件,例如微服务架构应用,组成应用的服务可能多达十个,几十个。如果有更新或回滚应用的需求,可能要修改和维护所涉及的大量资源文件,而这种组织和管理应用的方式就显得力不从心了。因此在这里我们线上的资源都是采用helm模板去进行管理。

但是最近线上环境使用helm的时候遇到了一个问题记录如下:

通过GitLab CICD发布了一个服务到k8s环境正常,这时候会生成一个Chart包并且会推送到自己的私有Chart仓库中,然后更新了模板再次发布该服务到k8s环境,会提示 helm语法问题如下:

Error: UPGRADE FAILED: template: allenjol-service/templates/virtualservice.yaml:18:13: executing "allenjol-service-service/templates/virtualservice.yaml" at <eq .appType "internal">: error calling eq: incompatible types for comparison

关于相关报错部分的模板内容如下:

...
domains:
  {{- if eq .Values.config.appType "allenjol" }}
  {{- range .domainPrefixes }}
  - {{ . }}.ayunw.cn
  {{- end }}
  {{- end }}
...

一开始根据报错一度以为是我自己写错了语法,反复反复的对自己写的模板产生怀疑。于是查看了官网的语法。

官方的if/else流程语法例子如下:

{{ if PIPELINE }}
  # Do something
{{ else if OTHER PIPELINE }}
  # Do something else
{{ else }}
  # Default case
{{ end }}


官方关于对if中使用条件判断的例子如下:

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  myvalue: "Hello World"
  drink: {{ .Values.favorite.drink | default "tea" | quote }}
  food: {{ .Values.favorite.food | upper | quote }}
  {{ if eq .Values.favorite.drink "coffee" }}mug: true{{ end }}

发现我似乎并没有写错什么。

到这里好像头绪断掉了,于是重新理了一下思路头绪。

发布到k8s环境中是通过GitLab CICD进行的。我将该allenjol-service服务相关的deployment和svc全部删除掉,然后重新用GitLab进行发布。发现似乎发布正常没任何的问题,也没有报错。

此处发布的命令为:

helm upgrade install allenjol-service ./allenjol-service-113-46a63a26.tgz -f values.yaml --namespace=allenjol

看上去这个命令没啥问题啊。是的,其实没啥问题,但是实际上在我这边的环境中遇到了这么个问题。也许是我自己对helm这个包管理工具不够熟悉导致吧。

问题分析如下:

1、首先通过GitLab CICD发布了一个allenjol-service的服务到k8s的sit环境中
2、然后由于需求改动,我更新了模板然后再次通过GitLab CICD发布服务
3、这时候之前的Release没有删除掉,更新了模板以后使用这个helm命令去install服务就报错了

经过这三个步骤以后,我尝试用helm uninstall命令将这个Release删除掉,然后用更新后的模板再次使用helm upgrade install命令发布服务。谁知道这个时候居然是没问题的。

所以本次的问题原因已经找到:用模板发布了服务之后,服务正常。但是此时更新了模板,用老模板发布的服务Release依然存在,这时候用helm upgrade install命令再去发布的话就会报错。解决的方法目前就是将老的Release删除掉,然后重新发布。

注意: 生产中不应该三天两头的去更改模板。

公众号:运维开发故事

github:https://github.com/orgs/sunsharing-note/dashboard

爱生活,爱运维 https://www.ayunw.cn

如果你觉得文章还不错,就请点击右上角选择发送给朋友或者转发到朋友圈。您的支持和鼓励是我最大的动力。喜欢就请关注我吧~

图片

扫码二维码

关注我,不定期维护优质内容

温馨提示

如果你喜欢本文,请分享到朋友圈,想要获得更多信息,请关注我。

                                          ........................
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐