我正在考虑使用机密挂载一个单一的文件,但似乎你只能挂载目录,将覆盖所有其他内容。如何在不挂载目录的情况下共享单个配置文件?
目前(v1.0,v1.1)没有办法卷装一个配置文件。Secret 结构自然能够表示多个机密,这意味着它必须是一个目录。
当我们得到配置对象时,应该支持单个文件。
与此同时,您可以挂载一个目录,并从您的映像符号链接到它,也许?
我将从 给你中的这个工作示例开始,确保您至少使用了 Kubernetes 1.3。
像这样简单地创建一个 ConfigMap:
apiVersion: v1 kind: ConfigMap metadata: name: test-pd-plus-cfgmap data: file-from-cfgmap: file data
然后创建一个像这样的豆荚:
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
例如,您有一个包含2个配置文件的配置图:
kubectl create configmap config --from-file <file1> --from-file <file2>
您可以像下面这样使用 subPath 将单个文件挂载到现有目录:
--- 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" ---
全例 给你
假设您希望将一个新的 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"}]}]}}}}'
关于已被接受的答案,还有一个有用的补充信息:
假设您的原始文件名为 Environment. js,并且您希望目标文件名为 destin_ Environment。Js,那么,yaml 文件应该是这样的:
--- volumeMounts: - name: "config" mountPath: "/<existing folder>/destination_environment.js" subPath: "environment.js" volumes: - name: "config" configMap: name: "config" ---
我没有投票或回复帖子的名声,所以我在这里发帖。最受欢迎的答案并不像它所说的那样有效(至少在 k8s 1.21.1中是这样的) :
volumeMounts: - mountPath: /opt/project/config.override.json name: config-override subPath: config.override.json command: - ls - -l - /opt/project/config.override.json
/opt/project/config.override.json
我也试过这个:
volumeMounts: - mountPath: /opt/project/ name: config-override subPath: config.override.json command: - ls - -l - /opt/project
很明显,当它试图挂载一个 json 文件时,它将 /opt/project列为空 dir。在这种情况下不会创建名为 config.override.json的文件。
/opt/project
config.override.json
附言: 挂载到文件的唯一方法是:
volumeMounts: - mountPath: /opt/project/override name: config-override command: - ls - -l - /opt/project/override
它创建一个目录 /opt/project/override,并将 configMap 创建中使用的原始文件名符号链接到所需的内容:
/opt/project/override
lrwxrwxrwx 1 root root 27 Jun 27 14:37 config.override.json -> ..data/config.override.json