Qual è il modo migliore per condividere / montare un file in un pod?


102

Stavo pensando di utilizzare i segreti per montare un singolo file, ma sembra che sia possibile montare solo una directory che sovrascriverà tutti gli altri contenuti. Come posso condividere un singolo file di configurazione senza montare una directory?

Risposte:


154

Ad esempio, hai una mappa di configurazione che contiene 2 file di configurazione:

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

Puoi usare subPath come questo per montare un singolo file nella directory esistente:

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

Esempio completo qui


5
confuso perché questo mostra un esempio per 2 file quando OP ne ha bisogno solo 1, presumo che lo stesso si applichi anche al caso di un singolo file.
Randy L

6
@ the0ther sì solo per chiarire come funziona con più file
Tommy Nguyen

@TommyNguyen, c'è un modo se voglio solo montare il mio percorso principale e non il percorso secondario come ./abc.txt dove abc.txt si trova all'interno del contenitore nella cartella principale e non nella sottocartella.
PrinceT

2
Cosa succede se il file non è una ConfigMap o non è in una ConfigMap? È possibile montare un file arbitrario dal disco locale?
LondonRob

3
@LondonRob nel tuo caso dovresti usare hostPath, vedi kubernetes.io/docs/concepts/storage/volumes/#hostpath
Masupilami

46

Comincerei con questo esempio funzionante da qui . Assicurati di utilizzare almeno Kubernetes 1.3.

Crea semplicemente una ConfigMap come questa:

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

E poi crea un pod come questo:

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
Ciò sovrascriverà indesiderabilmente l'intera directory come l'OP menzionato già.
davegallant

5
Non sono d'accordo Testato l'approccio includendo "subPath" e solo i file sono stati montati non l'intera directory. Testato con Kubernetes 1.5.
dmorlock

@dmorlock La domanda era formulata in modo ambiguo. Questo come dice il titolo "condividi / monta un file in un pod" e come la domanda chiede "condividi un file di configurazione senza montare una directory"
Joel B

1
Sono dovuto arrivare a questa domanda tre volte perché la parola "sottopercorso" non è menzionata da nessuna parte nei documenti su kubernetes.io/docs/tasks/configure-pod-container/… . Immagino che sia una documentazione amichevole PR che deve essere creata e inviata.
Todd Lyons dal

@ JoelB, c'è un modo se voglio solo montare il mio percorso principale e non il percorso secondario come ./abc.txt dove abc.txt si trova all'interno del contenitore nella cartella principale e non nella sottocartella.
PrinceT

7

Attualmente (v1.0, v1.1) non è possibile montare a volume un singolo file di configurazione. La struttura Secret è naturalmente in grado di rappresentare più segreti, il che significa che deve essere una directory.

Quando otteniamo oggetti di configurazione, dovrebbero essere supportati singoli file.

Nel frattempo puoi montare una directory e creare un link simbolico dalla tua immagine, forse?


1
È ancora vero?
neu242

7
Puoi utilizzare la funzione subPath di volumeMounts per ottenere un singolo file ora
Tim Hockin

1
Questo è possibile al momento. Controlla la risposta sopra: stackoverflow.com/a/43404857/5091346
Andrii Abramov

0

Supponiamo che tu voglia montare un nuovo log4j2.xml in una distribuzione in esecuzione per migliorare la registrazione

# 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"}]}]}}}}'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.