Який найкращий спосіб поділитися / змонтувати один файл у підсистемі?


102

Я розглядав можливість використання секретів для монтування одного файлу, але, схоже, ви можете монтувати лише каталог, який замінить весь інший вміст. Як я можу поділитися одним конфігураційним файлом без монтажу каталогу?

Відповіді:


154

Наприклад, у вас є конфігураційна карта, яка містить 2 конфігураційні файли:

kubectl create configmap config --from-file <file1> --from-file <file2>

Ви можете скористатися таким способом subPath, щоб підключити один файл до існуючого каталогу:

---
        volumeMounts:
        - name: "config"
          mountPath: "/<existing folder>/<file1>"
          subPath: "<file1>"
        - name: "config"
          mountPath: "/<existing folder>/<file2>"
          subPath: "<file2>"
      restartPolicy: Always
      volumes:
        - name: "config"
          configMap:
            name: "config"
---

Повний приклад тут


5
плутано, чому це показує приклад для 2 файлів, коли ОП потрібен лише 1, я припускаю, що те саме стосується і випадку одного файлу.
Randy L

6
@ the0ther так, просто щоб було зрозуміло, як це працює з декількома файлами
Tommy Nguyen

@TommyNguyen, чи є якийсь спосіб, якщо я хочу змонтувати лише мій основний шлях, а не допоміжний шлях, як ./abc.txt, де abc.txt знаходиться всередині контейнера в головній папці, а не в підпапці.
PrinceT

2
Що робити, якщо файл не є ConfigMap або не в ConfigMap? Чи можна змонтувати довільний файл з локального диска?
LondonRob

3
@LondonRob у вашому випадку ви повинні використовувати hostPath, див. Kubernetes.io/docs/concepts/storage/volumes/#hostpath
Masupilami

46

Я б почав з цього робочого прикладу звідси . Переконайтеся, що ви використовуєте принаймні Kubernetes 1.3.

Просто створіть ConfigMap таким чином:

apiVersion: v1
kind: ConfigMap
metadata:
  name: test-pd-plus-cfgmap
data:
  file-from-cfgmap: file data

А потім створіть такий стручок:

apiVersion: v1
kind: Pod
metadata:
  name: test-pd-plus-cfgmap
spec:
  containers:
  - image: ubuntu
    name: bash
    stdin: true
    stdinOnce: true
    tty: true
    volumeMounts:
    - mountPath: /mnt
      name: pd
    - mountPath: /mnt/file-from-cfgmap
      name: cfgmap
      subPath: file-from-cfgmap
  volumes:
  - name: pd
    gcePersistentDisk:
      pdName: testdisk
  - name: cfgmap
    configMap:
      name: test-pd-plus-cfgmap

1
Це небажано замінить весь каталог, як уже згаданий OP.
davegallant

5
Я не згоден. Перевірив підхід, включаючи "subPath", і лише файли були змонтовані, а не весь каталог. Перевірено за допомогою Kubernetes 1.5.
dmorlock

@dmorlock Питання було сформульовано неоднозначно. Це буде, оскільки в заголовку зазначено "надати спільний доступ / змонтувати один файл у стручок" і подібно до запитання "поділитися конфігураційним файлом без монтажу каталогу"
Джоель Б,

1
Мені довелося тричі приходити до цього питання, оскільки слово "підпуть" ніде не згадується в документації на kubernetes.io/docs/tasks/configure-pod-container/… . Думаю, це дружній PR-документ, який потрібно створити та подати.
Тодд Лайон,

@JoelB, чи є якийсь спосіб, якщо я хочу змонтувати лише мій основний шлях, а не допоміжний шлях, як ./abc.txt, де abc.txt знаходиться всередині контейнера в головній папці, а не в підпапці.
PrinceT

7

Наразі (v1.0, v1.1) немає способу монтувати один конфігураційний файл. Структура Secret, природно, здатна представляти безліч секретів, а це означає, що вона повинна бути каталогом.

Коли ми отримуємо конфігураційні об’єкти, слід підтримувати окремі файли.

Тим часом ви можете змонтувати каталог і, можливо, символічне посилання на нього зі свого зображення?


1
Це все ще правда?
neu242

7
Ви можете використовувати функцію subPath VolumeMounts, щоб отримати один файл зараз
Тім Хокін

1
Наразі це можливо. Перевірте відповідь вище: stackoverflow.com/a/43404857/5091346
Андрій Абрамов

0

Скажімо, ви хочете підключити новий log4j2.xml до запущеного розгортання для покращення ведення журналу

# Variables
k8s_namespace=xcs
deployment_name=orders-service
container_name=orders-service
container_working_dir=/opt/orders-service

# Create config map and patch deployment
kubectl -n ${k8s_namespace} create cm log4j \
 --from-file=log4j2.xml=./log4j2.xml

kubectl -n ${k8s_namespace} patch deployment ${deployment_name} \
 -p '{"spec":{"template":{"spec":{"volumes":[{"configMap":{"defaultMode": 420,"name": "log4j"},"name": "log4j"}]}}}}'

kubectl -n ${k8s_namespace} patch deployment ${deployment_name} \
 -p '{"spec":{"template":{"spec":{"containers":[{"name": "'${container_name}'","volumeMounts": [{  "mountPath": "'${container_working_dir}'/log4j2.xml","name": "log4j","subPath": "log4j2.xml"}]}]}}}}'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.