apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: app-2993d9d2-5cb4-4f4c-a9f3-ec630036f5d0
spec:
selector:
matchLabels:
client: 2993d9d2-5cb4-4f4c-a9f3-ec630036f5d0
template:
metadata:
labels:
client: 2993d9d2-5cb4-4f4c-a9f3-ec630036f5d0
spec:
containers:
- name: xxx
image: xxx
env:
- name: GUID
valueFrom:
fieldRef:
fieldPath: spec.template.metadata.labels.client
我尝试使用不同的表达式将现有值从定义传递给env变量,并且所有这些都不起作用:
error converting fieldPath: field label not supported: spec.template.metadata.labels.client
upd:找到了什么you can pass in,没有帮助...
我必须基本上重复自己4次,有没有办法减少pod定义中的重复以简化管理?根据{{3}}你可以传递一些东西,虽然它没有说明。
PS。我在spec.template和spec.selector中真的需要相同的guid吗?没有那个
它不起作用答案 0 :(得分:2)
你不一定需要在这里使用guids,这些只是标签和名字...... 其次,它们指的是不同的东西(虽然在某些情况下它们中的一些必须相同):
至于部署中的标签自动化以避免重复,根据您的实际需要,可能是掌舵图表或其他一些“自动化kubernetes”方法会更好吗?
附加说明:将标签传递给env变量后,可以从kubernetes 1.9开始使用
...
template:
metadata:
labels:
label_name: label-value
...
env:
- name: ENV_NAME
valueFrom:
fieldRef:
fieldPath: metadata.labels['label_name']
下面是完整的模拟代码来演示这个(客户端1.9.3,服务器1.9.0):
# cat d.yaml:
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: app-guidhere
spec:
selector:
matchLabels:
client: guidhere
template:
metadata:
labels:
client: guidhere
spec:
containers:
- name: some-name
image: nginx
env:
- name: GUIDENV
valueFrom:
fieldRef:
fieldPath: metadata.labels['client']
# after: kubectl create -f d.yaml and connecting to container
# echo $GUIDENV responds with "guidhere"
我刚试过这个并且正常工作(请注意k8s版本)。