Jaki jest najlepszy sposób udostępniania / montowania jednego pliku w kapsule?

110

Rozważałem użycie sekretów do zamontowania pojedynczego pliku, ale wydaje się, że możesz zamontować tylko katalog, który nadpisze całą pozostałą zawartość. Jak mogę udostępnić pojedynczy plik konfiguracyjny bez montowania katalogu?

Smana
źródło

Odpowiedzi:

163

Na przykład masz mapę konfiguracyjną, która zawiera 2 pliki konfiguracyjne:

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

Możesz użyć subPath w ten sposób, aby zamontować pojedynczy plik w istniejącym katalogu:

---
        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"
---

Pełny przykład tutaj

Tommy Nguyen
źródło
5
zdezorientowany, dlaczego to pokazuje przykład dla 2 plików, gdy OP potrzebuje tylko 1, zakładam, że to samo dotyczy przypadku pojedynczego pliku.
Randy L
7
@ the0ther yea tylko po to, aby wyjaśnić, jak to działa z wieloma plikami
Tommy Nguyen
@TommyNguyen, czy jest jakiś sposób, jeśli chcę zamontować tylko moją główną ścieżkę, a nie ścieżkę podrzędną, taką jak ./abc.txt, gdzie abc.txt znajduje się w kontenerze w folderze głównym, a nie podfolderze.
PrinceT,
3
Co się stanie, jeśli plik nie jest mapą ConfigMap lub nie znajduje się w mapie ConfigMap? Czy można zamontować dowolny plik z dysku lokalnego?
LondonRob
3
@LondonRob w twoim przypadku powinieneś użyć hostPath, patrz kubernetes.io/docs/concepts/storage/volumes/#hostpath
Masupilami
48

Zacząłbym od tego roboczego przykładu stąd . Upewnij się, że używasz przynajmniej Kubernetes 1.3.

Po prostu utwórz ConfigMap w następujący sposób:

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

A następnie utwórz kapsułę taką jak ta:

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
Joel B.
źródło
1
Spowoduje to niepożądane nadpisanie całego katalogu, takiego jak wspomniany już OP.
davegallant
5
Nie zgadzam się. Przetestowano podejście, w tym „subPath” i tylko pliki zostały zamontowane, a nie cały katalog. Testowane z Kubernetes 1.5.
dmorlock
@dmorlock Pytanie zostało sformułowane niejednoznacznie. Spowoduje to, ponieważ tytuł mówi „udostępnij / zamontuj jeden plik w kapsule” i tak jak w pytaniu „udostępnij plik konfiguracyjny bez montowania katalogu”
Joel B
1
Musiałem zadać to pytanie trzy razy, ponieważ słowo „podścieżka” nie jest nigdzie wymienione w dokumentach na kubernetes.io/docs/tasks/configure-pod-container/… . Wydaje mi się, że to przyjazny PR dokumentacyjny, który trzeba stworzyć i przesłać.
Todd Lyons
@JoelB, czy istnieje sposób, jeśli chcę zamontować tylko moją główną ścieżkę, a nie ścieżkę podrzędną, taką jak ./abc.txt, gdzie abc.txt znajduje się w kontenerze w folderze głównym, a nie podfolderze.
PrinceT,
7

Obecnie (v1.0, v1.1) nie ma możliwości zamontowania pojedynczego pliku konfiguracyjnego na woluminie. Struktura Secret jest naturalnie zdolna do reprezentowania wielu sekretów, co oznacza, że ​​musi to być katalog.

Kiedy otrzymamy obiekty konfiguracyjne, powinny być obsługiwane pojedyncze pliki.

W międzyczasie możesz zamontować katalog i dowiązanie do niego ze swojego obrazu?

Tim Hockin
źródło
1
Czy to nadal prawda?
neu242
7
Możesz teraz użyć funkcji subPath opcji volumeMounts, aby uzyskać pojedynczy plik
Tim Hockin
1
W tej chwili jest to możliwe. Sprawdź odpowiedź powyżej: stackoverflow.com/a/43404857/5091346
Andrii Abramov
0

Powiedzmy, że chcesz zamontować nowy plik log4j2.xml w działającym wdrożeniu, aby usprawnić rejestrowanie

# 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"}]}]}}}}'

Uchylony
źródło