Как избежать повторения GUID в определении развертывания - PullRequest
0 голосов
/ 02 мая 2018
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: нашел, что можно передать в , не помогает ...

Я должен повторить 4 раза, есть ли способ сделать меньше повторений в определении стручка, чтобы упростить управление? Согласно этому вы можете передать что-то, но это не говорит о том, что.

пс. Мне действительно нужен такой же guid в spec.template и spec.selector? Без этого не работает

1 Ответ

0 голосов
/ 02 мая 2018

Вам не обязательно использовать здесь руководства, это просто ярлыки и имена ... Во-вторых, они относятся к разным вещам (хотя некоторые из них должны быть одинаковыми в некоторых случаях):

  • имя метаданных - это имя рассматриваемого развертывания. Вы будете использовать его для ссылки и манипулирования этим конкретным Развертыванием в течение его жизненного цикла.
  • метки и метки должны быть одинаковыми, если вы хотите, чтобы они совпали друг с другом, что в данном случае вам нужно. Kubernetes является сильным и достаточно гибким, когда дело доходит до маркировки, и разные ресурсы могут иметь несколько меток (скажем, у модуля может быть метка: 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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...