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?

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


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

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?


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"}]}]}}}}'
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.