Helm子图表场景下Deployment模板的语法实现问询
基于Helm子图表实现多微服务容器配置渲染
背景
之前提问《Use one Helm chart for ALL microservices?》并采纳子图表方案,已搭建如下目录结构:
my-deployment-repo/ |- base-microservice/ |- templates/ |- deployment.yml |- service.yml |- Chart.yaml |- values.yaml |- myapp/ |- Chart.yaml |- values.yaml
base-microservice/values.yaml定义镜像、服务等基础配置,myapp/Chart.yaml通过别名引入两个base-microservice子图表,myapp/values.yaml仅覆盖各子服务的镜像名和版本。需要在base-microservice/templates/deployment.yml中编写模板语法,实现:
- 容器名渲染为对应子服务的镜像名称(如foo)
- 镜像地址渲染为「基础仓库+镜像名称+版本」的完整路径
配置示例与模板实现
1. 基础子图表的默认配置
先看base-microservice/values.yaml的基础设置:
# base-microservice/values.yaml image: repository: 01234567890.dkr.ecr.us-east-1.amazonaws.com name: default-microservice tag: latest
2. 父图表的子服务引用
myapp/Chart.yaml中通过别名引入两个子服务:
# myapp/Chart.yaml apiVersion: v2 name: myapp version: 0.1.0 dependencies: - name: base-microservice alias: foo-service version: 0.1.0 path: ../base-microservice - name: base-microservice alias: bar-service version: 0.1.0 path: ../base-microservice
3. 父图表的子服务配置覆盖
myapp/values.yaml中为每个子服务单独设置镜像名和版本:
# myapp/values.yaml foo-service: image: name: foo tag: 1.2.3 bar-service: image: name: bar tag: 4.5.6
4. 核心模板代码
base-microservice/templates/deployment.yml中编写如下模板,即可实现需求:
apiVersion: apps/v1 kind: Deployment metadata: name: {{ .Release.Name }}-{{ .Chart.Name }} spec: replicas: 1 selector: matchLabels: app: {{ .Release.Name }}-{{ .Chart.Name }} template: metadata: labels: app: {{ .Release.Name }}-{{ .Chart.Name }} spec: containers: - name: {{ .Values.image.name }} image: "{{ .Values.image.repository }}/{{ .Values.image.name }}:{{ .Values.image.tag }}" # 可添加其他容器配置,如端口、环境变量等 ports: - containerPort: 8080
模板逻辑说明
- 容器名渲染:
{{ .Values.image.name }}会读取当前子图表对应的values配置。因为每个子服务通过别名引入,各自的values会覆盖base子图表的默认值,所以foo-service的容器名就是foo,bar-service就是bar。 - 镜像地址拼接:
"{{ .Values.image.repository }}/{{ .Values.image.name }}:{{ .Values.image.tag }}"将基础仓库地址、镜像名、版本号拼接成完整镜像路径。其中仓库地址从base子图表的默认配置继承,镜像名和版本由父图表中对应子服务的配置覆盖。
内容的提问来源于stack exchange,提问作者Chris F
相关产品推荐
相关产品推荐

