Quelle est la meilleure façon de partager / monter un fichier dans un pod?

102

J'envisageais d'utiliser des secrets pour monter un seul fichier mais il semble que vous ne pouvez monter que le répertoire qui écrasera tout le reste du contenu. Comment puis-je partager un seul fichier de configuration sans monter un répertoire?

Smana
la source

Réponses:

154

Par exemple, vous avez un configmap qui contient 2 fichiers de configuration:

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

Vous pouvez utiliser subPath comme celui-ci pour monter un seul fichier dans un répertoire existant:

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

Exemple complet ici

Tommy Nguyen
la source
5
confus pourquoi cela montre un exemple pour 2 fichiers alors que OP n'a besoin que de 1, je suppose que la même chose s'applique au cas d'un seul fichier.
Randy L
6
@ the0ther oui juste pour préciser comment cela fonctionne avec plusieurs fichiers
Tommy Nguyen
@TommyNguyen, y a-t-il un moyen si je veux seulement monter mon chemin principal et non un sous-chemin comme ./abc.txt où abc.txt est situé dans le conteneur dans le dossier principal et non dans le sous-dossier.
PrinceT
2
Que faire si le fichier n'est pas un ConfigMap, ou pas dans un ConfigMap? Est-il possible de monter un fichier arbitraire à partir de votre disque local?
LondonRob le
3
@LondonRob dans votre cas, vous devriez utiliser hostPath, voir kubernetes.io/docs/concepts/storage/volumes/#hostpath
Masupilami
46

Je commencerais par cet exemple de travail à partir d' ici . Assurez-vous d'utiliser au moins Kubernetes 1.3.

Créez simplement un ConfigMap comme celui-ci:

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

Et puis créez un pod comme celui-ci:

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
Joël B
la source
1
Cela écrasera de manière indésirable tout le répertoire comme l'OP déjà mentionné.
davegallant
5
Je ne suis pas d'accord. Testé l'approche incluant "subPath" et seuls les fichiers ont été montés et non le répertoire entier. Testé avec Kubernetes 1.5.
dmorlock le
@dmorlock La question était formulée de manière ambiguë. Ce sera comme le titre indique "partager / monter un fichier dans un pod" et comme la question demande "partager un fichier de configuration sans monter un répertoire"
Joel B
1
J'ai dû revenir à cette question trois fois maintenant parce que le mot "sous-chemin" n'est mentionné nulle part dans la documentation sur kubernetes.io/docs/tasks/configure-pod-container/… . Je suppose que c'est un PR de documentation convivial qui doit être créé et soumis.
Todd Lyons
@JoelB, y a-t-il un moyen si je veux uniquement monter mon chemin principal et non un sous-chemin comme ./abc.txt où abc.txt est situé à l'intérieur du conteneur dans le dossier principal et non dans le sous-dossier.
PrinceT
7

Il n'y a actuellement (v1.0, v1.1) aucun moyen de monter en volume un seul fichier de configuration. La structure Secret est naturellement capable de représenter plusieurs secrets, ce qui signifie qu'elle doit être un répertoire.

Lorsque nous obtenons des objets de configuration, des fichiers uniques doivent être pris en charge.

En attendant, vous pouvez monter un répertoire et y créer un lien symbolique à partir de votre image, peut-être?

Tim Hockin
la source
1
Est-ce toujours vrai?
neu242
7
Vous pouvez utiliser la fonctionnalité subPath de volumeMounts pour obtenir un seul fichier maintenant
Tim Hockin
1
C'est possible pour le moment. Vérifiez la réponse ci-dessus: stackoverflow.com/a/43404857/5091346
Andrii Abramov
0

Supposons que vous souhaitiez monter un nouveau log4j2.xml dans un déploiement en cours pour améliorer la journalisation

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