Использование переменной в пути в Kubernetes

У меня есть простой StatefulSet с двумя контейнерами. Я просто хочу поделиться путем с томом emptyDir:

volumes:
 - name: shared-folder
 emptyDir: {}

Первый контейнер - это занято:

  - image: busybox
    name: test
    command:
      - sleep
      - "3600"
    volumeMounts:
    - mountPath: /cache
      name: shared-folder

Второй контейнер создает файл в / cache / ‹POD_NAME›. Я хочу смонтировать оба пути в томе emptyDir, чтобы иметь возможность обмениваться файлами между контейнерами.

  volumeMounts:
    - name: shared-folder
      mountPath: /cache/$(HOSTNAME)

Проблема. Второй контейнер не разрешает / cache / $ (HOSTNAME), поэтому вместо монтирования / cache / pod-0 он монтирует / cache / $ (HOSTNAME). Я также попытался получить POD_NAME и установить его как переменную env, но это тоже не решает.

Кто-нибудь знает, можно ли использовать такой путь (с переменными env) в атрибуте mountPath?


person Diego    schedule 28.10.2020    source источник


Ответы (3)


Чтобы использовать путь монтирования с переменной env, вы можете использовать subPath с расширенной средой переменные (k8s v1.17 +).

В вашем случае это будет выглядеть так:

containers:
- env:
  - name: MY_POD_NAME
    valueFrom:
      fieldRef:
        fieldPath: metadata.name
  volumeMounts:
  - mountPath: /cache
    name: shared-folder
    subPathExpr: $(MY_POD_NAME)
person Matt    schedule 29.10.2020
comment
Я этого не знал. Я здесь тестировал и отлично работал. Хороший ответ. - person Daniel Marques; 29.10.2020

Я тестировал здесь, и просто использование Kubernetes (k8s ‹1.16) с переменными env невозможно для достижения того, что вы хотите, в основном происходит то, что переменная будет доступна только после развертывания модуля, и вы ссылаетесь на нее до того, как это произойдет .

Вы можете использовать Helm, чтобы определить свой mounthPath и statefulset с одним и тем же значением в файле values.yaml, затем получить это же значение и установить в качестве значения для поля mounthPath и имени statefulset. Вы можете узнать об этом здесь.

Изменить: следуйте ответу Мэтта, если вы используете k8s 1.17 или выше.

person Daniel Marques    schedule 28.10.2020

Проблема в том, что файлы конфигурации YAML отправляются в Kubernetes точно в том виде, в котором они написаны. Это означает, что вам необходимо создать шаблонный файл YAML, в котором вы сможете заменить указанные переменные среды ti значениями, привязанными к переменным среды.

Поскольку это известная причуда Kubernetes, уже существуют инструменты для обхода этой проблемы. Helm - один из тех инструментов, которыми очень приятно пользоваться.

person TheCoolDrop    schedule 28.10.2020