如何通过Helm复用deployment模板创建不同配置的同应用Pod
核心逻辑:不用新增重复的Deployment模板文件,通过Helm模板的循环能力,遍历values中定义的多组实例配置,一次性渲染出多份独立的Deployment资源。
1. 修正目录结构与补全必要文件
你当前的目录结构不符合Helm Chart的标准规范,首先做两处调整:
- 把
kubernetes/templates/myApp/下的deployment.yaml直接移到kubernetes/templates/目录下,Helm只会识别templates根目录下的模板文件 - 在
kubernetes/目录下新增最简Chart.yaml文件,否则Helm无法识别该目录为合法Chart,文件内容如下:
apiVersion: v2 name: my-app version: 0.1.0
调整完成后的标准目录结构:
myApp/ ├── Dockerfile ├── skaffold.yaml └── kubernetes/ ├── Chart.yaml ├── templates/ │ └── deployment.yaml └── values.yaml
2. 改造deployment.yaml模板
把原来硬编码蓝组配置的模板,改成循环遍历实例配置的通用模板,补全K8s要求的必填字段(selector、标签等,原模板缺失这些字段会直接部署报错):
{{- range .Values.instances }} apiVersion: apps/v1 kind: Deployment metadata: namespace: {{ $.Values.namespace }} name: {{ $.Values.name }}-{{ .name }} labels: app: {{ $.Values.name }} color: {{ .name }} spec: replicas: {{ .replicas }} selector: matchLabels: app: {{ $.Values.name }} color: {{ .name }} template: metadata: labels: app: {{ $.Values.name }} color: {{ .name }} spec: containers: - name: {{ .name }} image: {{ .image }} env: {{- toYaml .env | nindent 12 }} --- {{- end }}
模板说明:循环内通过
$.Values引用根级values配置,通过.引用当前遍历到的单实例配置,每遍历一个实例就生成一份独立的Deployment清单,实例之间完全隔离。
3. 调整values.yaml配置
把原来分拆的蓝、绿部署配置合并为统一的实例列表,后续新增实例(比如灰度版本)只需要在列表里加配置项,不需要修改模板:
namespace: my-app name: app instances: - name: blue image: my-image replicas: 1 env: - name: COLOR value: 'blue' - name: green image: my-image replicas: 1 env: - name: COLOR value: 'green'
如果你坚持保留原来blue-deployment、green-deployment的分块写法,只需要把模板里的{{- range .Values.instances }}改成{{- range list .Values.blue-deployment .Values.green-deployment }}即可,但这种写法扩展性差,新增实例必须修改模板,不推荐。
4. 修正skaffold.yaml配置
原配置存在版本号不全、Helm部署结构错误、镜像配置不匹配的问题,修改后内容如下:
apiVersion: skaffold/v2beta29 kind: Config build: artifacts: # 蓝绿实例使用同一个镜像,只需要构建一次 - image: my-image context: './' deploy: helm: releases: - name: my-application chartPath: kubernetes valuesFiles: - kubernetes/values.yaml namespace: my-app # 自动替换Skaffold构建的本地镜像标签,适配本地开发流程 imageStrategy: helm: {}
验证方式
所有配置修改完成后,在项目根目录执行skaffold dev,等待部署完成后执行kubectl get deploy -n my-app,即可看到app-blue、app-green两个独立的Deployment,对应的Pod除了注入的COLOR环境变量不同,其余配置完全一致,没有重复编写Deployment模板文件。
内容的提问来源于stack exchange,提问作者SkinnyBetas

