在 k8s 容器中将环境变量与其他环境变量组合在一起

Composing environment variables with other environment variables in k8s containers

传递给容器的环境变量可以由已经存在的环境变量组成吗?类似于:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
        env:
        - name: URL
          value: $(HOST):$(PORT)

这些清单是完整的文件。在其中使用变量不是一个好方法。虽然你可以。

使用下面的命令替换并通过管道传输到 kubectl。

sed -i -e "s#%%HOST%%#http://whatever#" file.yml;

尽管我建议使用 Helm

阅读更多: https://kubernetes.io/docs/tasks/inject-data-application/define-environment-variable-container/

Helm 及其 variables 似乎是处理此类用例的更好方法。 在下面的示例中,您有一个包含值和变量的部署片段:

    spec:
      containers:
        - name: {{ .Chart.Name }}
          image: "image/thomas:{{ .Values.image.tag }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
          env:
            - name: URL
              value: {{ .Values.host }}:{{ .Values.port }}

这是使用一些自定义变量部署它的方法之一:

helm upgrade --install  myChart . \
  --set image.tag=v2.5.4 \
  --set host=example.com \
  --set-string port=12345 \

Helm 还允许您使用模板函数。你可以有 default 函数,如果它们没有被填充,这将进入默认值。在上面的示例中,您可以看到 required 显示消息,如果您不指定值,则无法进一步安装图表。还有 include 函数,允许您引入另一个模板并将结果传递给其他模板函数。

在单个 Pod 规范中,这完全符合您描述的语法,但环境变量必须在相同的 Pod 规范中定义(更早)。请参阅 Kubernetes 文档中的 Define Dependent Environment Variables

env:
  - name: HOST
    value: host.example.com
  - name: PORT
    value: '80'
  - name: URL
    value: '$(HOST):$(PORT)'

除此之外,Kubernetes YAML 文件需要完全独立,并且您不能在系统上使用环境变量 运行 kubectl 来影响文件内容。 Helm 等其他工具可以更好地满足这一需求;有关示例,请参阅