如何避免在部署定义中重复GUID

时间:2018-05-02 19:03:06

标签: docker configuration kubernetes containers

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吗?没有那个

它不起作用

1 个答案:

答案 0 :(得分:2)

你不一定需要在这里使用guids,这些只是标签和名字...... 其次,它们指的是不同的东西(虽然在某些情况下它们中的一些必须相同):

  • 元数据名称是有问题的部署名称。您将使用它在其生命周期中引用和操纵此特定部署。
  • 标签和匹配标签如果您希望它们匹配在一起,则需要相同,在这种情况下您需要。 Kubernetes在标签方面非常强大且非常灵活,不同的资产可以有多个标签(比如pod可以有标签:app:Postfix,tier:backend,layer:mysql,env:dev)。按理说,您想要匹配的标签和要匹配的标签必须相同才能匹配。

至于部署中的标签自动化以避免重复,根据您的实际需要,可能是掌舵图表或其他一些“自动化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版本)。