前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >helm upgrade install 提示语法报错问题解决

helm upgrade install 提示语法报错问题解决

作者头像
没有故事的陈师傅
发布2021-01-04 10:09:09
1.5K0
发布2021-01-04 10:09:09
举报
文章被收录于专栏:运维开发故事

为什么需要helm?

  • k8s上的应用对象都有特定的资源描述组成,包括deployment、service等。都保存各自文件中或者集中写到一个配置文件,然后执行kubectl apply -f 进行部署。
  • 如果应用只由一个或几个这样的服务组成,上面部署方式足够了。

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

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

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

代码语言:javascript
复制
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

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

代码语言:javascript
复制
...
domains:
  {{- if eq .Values.config.appType "allenjol" }}
  {{- range .domainPrefixes }}
  - {{ . }}.ayunw.cn
  {{- end }}
  {{- end }}
...

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

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

代码语言:javascript
复制
{{ if PIPELINE }}
  # Do something
{{ else if OTHER PIPELINE }}
  # Do something else
{{ else }}
  # Default case
{{ end }}

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

代码语言:javascript
复制
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进行发布。发现似乎发布正常没任何的问题,也没有报错。

此处发布的命令为:

代码语言:javascript
复制
helm upgrade install allenjol-service ./allenjol-service-113-46a63a26.tgz -f values.yaml --namespace=allenjol

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

问题分析如下:

代码语言:javascript
复制
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

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-12-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 运维开发故事 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 为什么需要helm?
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档