如何通过Helm动态读取values.yaml中URI的匹配类型
解决Helm模板动态生成Virtual Service的HTTP Match URI配置问题
问题背景
需要通过Helm模板生成Istio Virtual Service,支持单个或多个match块,核心难点是动态解析values.yaml中paths.uri的两种配置格式:
- 字符串数组形式(批量前缀匹配)
- 带
exact/prefix/regex键的映射形式(精确匹配、前缀匹配、正则匹配)
当前模板无法正确识别uri下的匹配类型键,导致生成的配置不符合预期。
修正后的Helm模板代码
{{- range $path := .Values.paths }} - match: {{- if kindIs "slice" $path.uri }} {{- range $uri := $path.uri }} - uri: prefix: "{{ $uri }}" {{- with $path.method }} method: "{{ . }}" {{- end }} {{- end }} {{- else if kindIs "map" $path.uri }} - uri: {{- toYaml $path.uri | nindent 12 }} {{- with $path.method }} method: "{{ . }}" {{- end }} {{- end }} {{- with $path.rewrite }} rewrite: uri: "{{ . }}" {{- end }} route: - destination: port: number: {{ $path.servicePort }} host: "{{ .Values.service.name }}" # 替换为你的服务名称变量 {{- end }}
关键解析
- 类型判断:用
kindIs函数判断$path.uri是数组(slice)还是映射(map),分别适配两种配置格式 - 数组格式处理:遍历数组中的每个URI值,默认生成
prefix类型的匹配规则(可根据需求调整为regex等) - 映射格式处理:直接用
toYaml渲染uri下的键值对,完美支持exact/prefix/regex三种匹配类型 - 可选字段渲染:用
with关键字处理可选的method和rewrite字段,仅在配置存在时生成对应内容 - 正确循环逻辑:外层循环遍历
paths数组中的每个配置项,修正了原模板错误的遍历逻辑
生成结果示例
对应你提供的values.yaml配置,模板会生成如下Virtual Service片段:
- match: - uri: prefix: "/process-devlopment/projects" method: "POST" - uri: prefix: "/process-devlopment/modules" method: "POST" rewrite: uri: "/process-devlopment/projects" route: - destination: port: number: 80 host: "your-service-name" - match: - uri: exact: "/process-devlopment/projects" rewrite: uri: "/process-devlopment/modules" route: - destination: port: number: 80 host: "your-service-name"
内容的提问来源于stack exchange,提问作者amey kambli
相关产品推荐
相关产品推荐

