¿Cuál es la mejor manera de compartir / montar un archivo en un pod?

102

Estaba considerando usar secretos para montar un solo archivo, pero parece que solo puede montar el directorio que sobrescribirá todo el resto del contenido. ¿Cómo puedo compartir un solo archivo de configuración sin montar un directorio?

Smana
fuente

Respuestas:

154

Por ejemplo, tiene un mapa de configuración que contiene 2 archivos de configuración:

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

Puede usar subPath como este para montar un solo archivo en un directorio existente:

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

Ejemplo completo aquí

Tommy Nguyen
fuente
5
confundido por qué esto muestra un ejemplo para 2 archivos cuando OP solo necesita 1, supongo que lo mismo se aplica para el caso de un solo archivo.
Randy L
6
@ the0ther sí solo para dejar en claro cómo funciona con varios archivos
Tommy Nguyen
@TommyNguyen, ¿hay alguna forma si solo quiero montar mi ruta principal y no la ruta secundaria como ./abc.txt donde abc.txt se encuentra dentro del contenedor en la carpeta principal y no en la subcarpeta?
PrinceT
2
¿Qué sucede si el archivo no es un ConfigMap o no está en un ConfigMap? ¿Es posible montar un archivo arbitrario desde su disco local?
LondonRob
3
@LondonRob en su caso, debe usar hostPath, consulte kubernetes.io/docs/concepts/storage/volumes/#hostpath
Masupilami
46

Comenzaría con este ejemplo de trabajo desde aquí . Asegúrese de que está utilizando al menos Kubernetes 1.3.

Simplemente cree un ConfigMap como este:

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

Y luego crea un pod como este:

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
fuente
1
Esto sobreescribirá indeseablemente todo el directorio como el OP ya mencionado.
davegallant
5
No estoy de acuerdo Probé el enfoque que incluía "subPath" y solo se montaron los archivos, no el directorio completo. Probado con Kubernetes 1.5.
dmorlock
@dmorlock La pregunta estaba redactada de forma ambigua. Esto, como dice el título, "compartir / montar un archivo en un pod" y como la pregunta pregunta "compartir un archivo de configuración sin montar un directorio"
Joel B
1
He tenido que abordar esta pregunta tres veces porque la palabra "subruta" no se menciona en ningún lugar de los documentos en kubernetes.io/docs/tasks/configure-pod-container/… . Supongo que es un PR de documentación amigable que debe crearse y enviarse.
Todd Lyons
@JoelB, ¿hay alguna forma si solo quiero montar mi ruta principal y no la ruta secundaria como ./abc.txt donde abc.txt se encuentra dentro del contenedor en la carpeta principal y no en la subcarpeta?
PrinceT
7

Actualmente (v1.0, v1.1) no hay forma de montar un solo archivo de configuración por volumen. La estructura Secreta es naturalmente capaz de representar múltiples secretos, lo que significa que debe ser un directorio.

Cuando obtenemos objetos de configuración, se deben admitir archivos individuales.

Mientras tanto, puede montar un directorio y un enlace simbólico a él desde su imagen, ¿tal vez?

Tim Hockin
fuente
1
¿Sigue siendo cierto esto?
neu242
7
Puede usar la función subPath de volumeMounts para obtener un solo archivo ahora
Tim Hockin
1
Esto es posible por el momento. Verifique la respuesta anterior: stackoverflow.com/a/43404857/5091346
Andrii Abramov
0

Supongamos que desea montar un nuevo log4j2.xml en una implementación en ejecución para mejorar el registro

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