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

时间:2021-05-19 05:35:46

标签: kubernetes environment-variables

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

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)

3 个答案:

答案 0 :(得分:2)

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

    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 函数允许您引入另一个模板并将结果传递给其他模板函数。

答案 1 :(得分:1)

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

使用以下命令将其替换并通过管道传输到 kubectl。

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

虽然我建议使用 Helm

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

答案 2 :(得分:1)

在单个 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 等其他工具更好地满足了这一需求;有关示例,请参阅 @thomas's answer