Was ist der beste Weg, um eine Datei in einem Pod freizugeben / zu mounten?

96

Ich habe überlegt, Geheimnisse zum Mounten einer einzelnen Datei zu verwenden, aber es scheint, dass Sie nur ein Verzeichnis mounten können, das den gesamten anderen Inhalt überschreibt. Wie kann ich eine einzelne Konfigurationsdatei freigeben, ohne ein Verzeichnis bereitzustellen?

Smana
quelle

Antworten:

145

Zum Beispiel haben Sie eine Konfigurationskarte, die 2 Konfigurationsdateien enthält:

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

Sie können subPath wie folgt verwenden, um eine einzelne Datei in ein vorhandenes Verzeichnis einzubinden:

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

Vollständiges Beispiel hier

Tommy Nguyen
quelle
5
verwirrt, warum dies ein Beispiel für 2 Dateien zeigt, wenn OP nur 1 benötigt, gehe ich davon aus, dass dies auch für den Fall einer einzelnen Datei gilt.
Randy L
4
@ the0ther yea nur um klar zu machen, wie es mit mehreren Dateien funktioniert
Tommy Nguyen
@TommyNguyen, gibt es eine Möglichkeit, wenn ich nur meinen Hauptpfad und nicht meinen Unterpfad wie ./abc.txt mounten möchte, wobei sich abc.txt im Container im Hauptordner und nicht im Unterordner befindet.
PrinceT
1
Was ist, wenn die Datei keine ConfigMap oder keine ConfigMap ist? Ist es möglich, eine beliebige Datei von Ihrer lokalen Festplatte zu mounten?
LondonRob
3
@LondonRob in Ihrem Fall sollten Sie hostPath verwenden, siehe kubernetes.io/docs/concepts/storage/volumes/#hostpath
Masupilami
44

Ich würde von hier aus mit diesem Arbeitsbeispiel beginnen . Stellen Sie sicher, dass Sie mindestens Kubernetes 1.3 verwenden.

Erstellen Sie einfach eine ConfigMap wie folgt:

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

Und dann erstellen Sie einen Pod wie folgt:

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.
quelle
1
Dadurch wird unerwünscht das gesamte Verzeichnis wie das bereits erwähnte OP überschrieben.
Davegallant
5
Ich stimme nicht zu Testete den Ansatz einschließlich "subPath" und nur die Dateien wurden gemountet, nicht das gesamte Verzeichnis. Getestet mit Kubernetes 1.5.
Dmorlock
@dmorlock Die Frage war mehrdeutig formuliert. Dies wird, wie der Titel sagt "Teilen / Mounten einer Datei in einem Pod" und wie die Frage fragt "Teilen einer Konfigurationsdatei ohne Mounten eines Verzeichnisses"
Joel B
1
Ich musste jetzt dreimal auf diese Frage eingehen, da das Wort "Unterpfad" in den Dokumenten unter kubernetes.io/docs/tasks/configure-pod-container/… nirgends erwähnt wird . Ich denke, das ist eine freundliche Dokumentations-PR, die erstellt und eingereicht werden muss.
Todd Lyons
@JoelB, gibt es eine Möglichkeit, wenn ich nur meinen Hauptpfad und nicht meinen Unterpfad wie ./abc.txt mounten möchte, wobei sich abc.txt im Container im Hauptordner und nicht im Unterordner befindet.
PrinceT
7

Derzeit (v1.0, v1.1) gibt es keine Möglichkeit, eine einzelne Konfigurationsdatei auf einem Volume bereitzustellen. Die geheime Struktur kann natürlich mehrere Geheimnisse darstellen, was bedeutet, dass es sich um ein Verzeichnis handeln muss.

Wenn wir Konfigurationsobjekte erhalten, sollten einzelne Dateien unterstützt werden.

In der Zwischenzeit können Sie vielleicht ein Verzeichnis mounten und von Ihrem Image aus einen Symlink dazu erstellen?

Tim Hockin
quelle
1
Ist das noch wahr?
Neu242
7
Sie können die subPath-Funktion von volumeMounts verwenden, um jetzt eine einzelne Datei zu erhalten
Tim Hockin
Dies ist derzeit möglich. Überprüfen Sie die Antwort oben: stackoverflow.com/a/43404857/5091346
Andrii Abramov
0

Angenommen, Sie möchten eine neue log4j2.xml in eine laufende Bereitstellung einbinden , um die Protokollierung zu verbessern

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