You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Kubernetes Deployment YAML中使用变量配置字段?

问题解答

原生kubectl本身不支持直接像docker-compose的.env或Helm的values.yaml那样,在Deployment YAML文件中对名称、标签、主机名这类顶层字段做变量替换,也没有--values这类参数来加载外部变量文件。不过可以通过以下几种工具实现类似需求:

1. 使用envsubst工具

这是最简单的轻量方案,利用系统自带的环境变量替换工具处理模板文件:

  • 先编写带变量的Deployment模板文件(比如deployment.tpl.yaml):
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: $deploy_name
      labels:
        app: $app
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: $app
      template:
        metadata:
          labels:
            app: $app
        spec:
          containers:
          - name: $app-container
            image: nginx:$image_tag
            ports:
            - containerPort: 80
    
  • 创建变量文件(比如kube.env):
    deploy_name=my-nginx-deploy
    app=my-nginx
    image_tag=1.25
    
  • 执行命令完成替换并应用:
    export $(cat kube.env | xargs) && envsubst < deployment.tpl.yaml | kubectl apply -f -
    
  • 注意:如果YAML中存在需要保留的$符号(比如容器环境变量里的),可以用\$转义,或者指定仅替换特定变量:
    envsubst '$deploy_name $app $image_tag' < deployment.tpl.yaml | kubectl apply -f -
    

2. 使用Kustomize

Kustomize是kubectl内置的配置管理工具,无需额外安装,适合纯Kubernetes生态的场景:

  • 编写基础的deployment.yaml:
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deploy
      labels:
        app: nginx
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx-container
            image: nginx:1.24
            ports:
            - containerPort: 80
    
  • 创建kustomization.yaml,通过replacements和ConfigMap定义变量替换规则:
    apiVersion: kustomize.config.k8s.io/v1beta1
    kind: Kustomization
    resources:
    - deployment.yaml
    replacements:
    - source:
        kind: ConfigMap
        name: app-vars
        fieldPath: data.deploy_name
      targets:
      - select:
          kind: Deployment
          name: nginx-deploy
        fieldPaths:
        - metadata.name
    - source:
        kind: ConfigMap
        name: app-vars
        fieldPath: data.app
      targets:
      - select:
          kind: Deployment
          name: nginx-deploy
        fieldPaths:
        - metadata.labels.app
        - spec.selector.matchLabels.app
        - spec.template.metadata.labels.app
    configMapGenerator:
    - name: app-vars
      literals:
      - deploy_name=my-nginx-deploy
      - app=my-nginx
      - image_tag=1.25
    images:
    - name: nginx
      newTag: $(image_tag)
    
  • 执行命令应用配置:
    kubectl apply -k .
    

3. 使用Helm

如果你的场景允许引入Helm,它是最成熟的Kubernetes应用变量管理方案:

  • 初始化Helm chart,编写values.yaml定义变量:
    deployName: my-nginx-deploy
    appName: my-nginx
    image:
      repository: nginx
      tag: 1.25
    
  • 在templates/deployment.yaml中使用模板变量:
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: {{ .Values.deployName }}
      labels:
        app: {{ .Values.appName }}
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: {{ .Values.appName }}
      template:
        metadata:
          labels:
            app: {{ .Values.appName }}
        spec:
          containers:
          - name: {{ .Values.appName }}-container
            image: {{ .Values.image.repository }}:{{ .Values.image.tag }}
            ports:
            - containerPort: 80
    
  • 安装chart(可指定自定义变量文件):
    helm install my-nginx ./my-chart --values custom-values.yaml
    

内容的提问来源于stack exchange,提问作者JRU

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 21:22:22