Qual é a melhor maneira de compartilhar / montar um arquivo em um pod?

102

Eu estava pensando em usar segredos para montar um único arquivo, mas parece que você só pode montar um diretório que substituirá todo o outro conteúdo. Como posso compartilhar um único arquivo de configuração sem montar um diretório?

Smana
fonte

Respostas:

154

Por exemplo, você tem um configmap que contém 2 arquivos de configuração:

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

Você pode usar subPath como este para montar um único arquivo no diretório 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"
---

Exemplo completo aqui

Tommy Nguyen
fonte
5
confuso porque isso mostra um exemplo para 2 arquivos quando o OP precisa apenas de 1, presumo que o mesmo se aplica para o caso de um único arquivo.
Randy L
6
@ the0ther sim apenas para deixar claro como funciona com vários arquivos
Tommy Nguyen
@TommyNguyen, há alguma maneira se eu só quiser montar meu caminho principal e não um sub-caminho como ./abc.txt, onde abc.txt está localizado dentro do contêiner na pasta principal e não na subpasta.
PrinceT 05 de
2
E se o arquivo não for um ConfigMap ou não estiver em um ConfigMap? É possível montar um arquivo arbitrário de seu disco local?
LondonRob
3
@LondonRob no seu caso, você deve usar hostPath, consulte kubernetes.io/docs/concepts/storage/volumes/#hostpath
Masupilami
46

Eu começaria com este exemplo de trabalho a partir daqui . Certifique-se de usar pelo menos o Kubernetes 1.3.

Basta criar um ConfigMap como este:

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

Em seguida, crie um 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
fonte
1
Isso irá sobrescrever indesejavelmente todo o diretório, como o OP já mencionado.
davegallant
5
Eu não concordo. Testou a abordagem incluindo "subPath" e apenas os arquivos foram montados, não o diretório inteiro. Testado com Kubernetes 1.5.
dmorlock
@dmorlock A pergunta foi formulada de forma ambígua. Isso será conforme o título diz "compartilhe / monte um arquivo em um pod" e como a pergunta "compartilhe um arquivo de configuração sem montar um diretório"
Joel B
1
Já tive que fazer essa pergunta três vezes porque a palavra "subcaminho" não é mencionada em nenhum lugar nos documentos em kubernetes.io/docs/tasks/configure-pod-container/… . Acho que é um PR de documentação amigável que precisa ser criado e enviado.
Todd Lyons
@JoelB, existe alguma maneira se eu só quiser montar meu caminho principal e não um subcaminho como ./abc.txt onde abc.txt está localizado dentro do contêiner na pasta principal e não na subpasta.
PrinceT 05 de
7

Atualmente (v1.0, v1.1) não há como montar o volume de um único arquivo de configuração. A estrutura do Secret é naturalmente capaz de representar vários segredos, o que significa que deve ser um diretório.

Quando obtemos objetos de configuração, arquivos únicos devem ser suportados.

Enquanto isso, você pode montar um diretório e um link simbólico para ele a partir de sua imagem, talvez?

Tim Hockin
fonte
1
Isso ainda é verdade?
neu242
7
Você pode usar o recurso subPath de volumeMounts para obter um único arquivo agora
Tim Hockin
1
Isso é possível no momento. Verifique a resposta acima: stackoverflow.com/a/43404857/5091346
Andrii Abramov
0

Digamos que você queira montar um novo log4j2.xml em uma implantação em execução para aprimorar o 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"}]}]}}}}'
Entreaberta
fonte