传递给容器的环境变量可以由已经存在的环境变量组成吗?类似的东西:
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)
答案 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。