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:
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
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
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?
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"}]}]}}}}'