对于一个复杂的应用,会有很多类似上面的资源描述文件,例如微服务架构应用,组成应用的服务可能多达十个,几十个。如果有更新或回滚应用的需求,可能要修改和维护所涉及的大量资源文件,而这种组织和管理应用的方式就显得力不从心了。因此在这里我们线上的资源都是采用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
如果你觉得文章还不错,就请点击右上角选择发送给朋友或者转发到朋友圈。您的支持和鼓励是我最大的动力。喜欢就请关注我吧~