我当时正在考虑使用机密文件来挂载单个文件,但看来您只能挂载将覆盖所有其他内容的目录。如何在不挂载目录的情况下共享单个配置文件?
Answers:
例如,您有一个configmap,其中包含2个配置文件:
kubectl create configmap config --from-file <file1> --from-file <file2>
您可以使用如下子路径将单个文件装入现有目录:
---
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"
---
完整的例子在这里
我将从这里开始这个工作示例。确保您至少使用Kubernetes 1.3。
只需像这样创建一个ConfigMap:
apiVersion: v1
kind: ConfigMap
metadata:
name: test-pd-plus-cfgmap
data:
file-from-cfgmap: file data
然后创建一个像这样的pod:
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
当前(v1.0,v1.1)无法卷安装单个配置文件。Secret结构自然可以表示多个秘密,这意味着它必须是一个目录。
当我们得到配置对象时,应该支持单个文件。
同时,您可以挂载目录并从映像中对其进行符号链接,也许吗?
假设您要将新的log4j2.xml挂载到正在运行的部署中以增强日志记录
# 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"}]}]}}}}'