详解k8s ConfigMap 中 subPath 字段和 items 字段
Kubernetes中什么是subPath
有时,在单个 Pod 中共享卷以供多方使用是很有用的。volumeMounts.subPath 属性可用于指定所引用的卷内的
子路径,而不是其根路径。
这句话理解了,基本就懂subPath怎么用了,比如我们要替换nginx.cnf, 挂载的ConfigMap是一个文件夹,如果没有subPath,那
/etc/nginx/nginx.cnf
将变成一个文件夹,subPath是用来指定卷内子路径的! 按照逻辑subPath应该在volumes下进行设置会比较合理,这可能就是它不好理解的根本原因。
什么时候应该使用 subPath
- 场景一: 一个共享卷, 挂载多个路径.
- 场景二: ConfigMap或Secret挂载到特定目录的特定路径, 而该目录下已经有其他文件且不希望被覆盖掉
1. subPath字段的作用
在Linux中,将目录A挂载到目录B,则目录B原有的文件都会被目录A下的文件覆盖。
那么在k8s中,如何将configmap挂载到容器中某个目录的文件中呢?答案是使用subPath
。
subPath可以将configMap和secret作为文件挂载到容器中而不覆盖挂载目录下的文件。
话不多说,直接看一个例子。
制作案例镜像:
dockerfile:
FROM busybox WORKDIR /workspace RUN touch a.txt b.txt c.txt
切换到dockerfile目录下执行:
docker build -t mydocker:latest . docker tag mydocker:latest zengfeng666/mydocker:1.0 docker push zengfeng666/mydocker:1.0
configmap.yaml
apiVersion: v1 kind: ConfigMap metadata: name: configmap namespace: dev data: info: | username:admin password:123456 info2: zhangssssssssssssssssssssssssss
pod1.yaml
apiVersion: v1 kind: Pod metadata: name: pod1 namespace: dev spec: containers: - name: mydocker image: zengfeng666/mydocker:1.0 command: ["/bin/sh", "-c", "while true; do sleep 2; done;"] volumeMounts: - name: config mountPath: /workspace volumes: - name: config configMap: name: configmap
pod2.yaml
apiVersion: v1 kind: Pod metadata: name: pod2 namespace: dev spec: containers: - name: mydocker image: zengfeng666/mydocker:1.0 command: ["/bin/sh", "-c", "while true; do sleep 2; done;"] volumeMounts: - name: config mountPath: /workspace/info subPath: info - name: config mountPath: /workspace/info2 subPath: info2 volumes: - name: config configMap: name: configmap
$ kubectl create -f pod1.yaml $ kubectl create -f pod2.yaml $ kubectl get pods -n dev NAME READY STATUS RESTARTS AGE pod1 1/1 Running 0 2m20s pod2 1/1 Running 0 14s
可以看到,因为pod1中是将configmap直接挂载到了容器的workspace目录,由于Linux的目录挂载特性(可以看这篇:什么是挂载,Linux挂载详解),原来的workspace目录下的文件将会被挂载过来的目录下(可以将configmap看成一个目录,因为每个key都是一个文件)的文件所覆盖,因此workspace中只有configmap中的info和info2文件。如果不想被覆盖,则要以文件的方式进行挂载,如pod2.yaml中所示,注意mountPath和subPath的写法,subPath此时指的就是configMap中的key,也就是文件名。
2. items字段的作用
假如不想以key名作为配置文件名可以引入items 字段,在其中逐个指定要用相对路径path替换的key:
volumes: - name: config configMap: name: configmap items: - key: info # 原文件名(key的名称) path: userinfo # 修改之后的文件名(key的名称) - key: info2 path: userinfo2
items还有一个作用,就是只有items下的key对应的文件会被挂载到容器中。
比如pod1.yaml中不想把info和info2都挂载到workspace目录下,而只需要挂载info到workspace目录下,则可以将pod1.yaml的volumes字段修改为:
volumes: - name: config configMap: name: configmap items: - key: info path: info
到此这篇关于详解k8s ConfigMap 中 subPath 字段和 items 字段的文章就介绍到这了,更多相关k8s subPath和 items内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
CentOS 7.9 升级内核 kernel-ml-5.6.14版本的方法
这篇文章主要介绍了CentOS 7.9 升级内核 kernel-ml-5.6.14版本,默认内核版本为3.10.0,现升级到 5.6.14 版本,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2022-10-10Kubernetes Dashboard 配置用户名密码方式登录操作流程
为了K8s集群安全,默认情况下Dashboard以Token的形式登录的,那如果我们想以用户名/密码的方式登录该怎么操作呢?其实只需要我们创建用户并进行 ClusterRoleBinding绑定即可,下面给大家分享Kubernetes Dashboard 配置用户名密码方式登录操作流程,感兴趣的朋友一起看看吧2024-06-06Istio 自动注入 sidecar 失败导致无法访问webhook服务的解决方法
最近工作中在部署Istio环境的过程中发现官方示例启动的pod不能访问不到Istio的webhook,这个问题也是困扰了我一天,我把他归类到sidecar注入失败的情况下,本文给大家分享问题解决方法,感兴趣的朋友跟随小编一起看看吧2023-10-10
最新评论