详解k8s ConfigMap 中 subPath 字段和 items 字段

 更新时间:2023年03月02日 15:23:44   作者:椰汁菠萝  
volumeMounts.subPath 属性可用于指定所引用的卷内的子路径,而不是其根路径,这篇文章主要介绍了详解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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • IPVS下CoreDNS滚动更新解析失败原理探究

    IPVS下CoreDNS滚动更新解析失败原理探究

    这篇文章主要为大家介绍了IPVS下CoreDNS滚动更新解析失败原理探究,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • k8s自身原理service及实现图文示例解析

    k8s自身原理service及实现图文示例解析

    这篇文章主要为大家介绍了k8s自身原理service图文示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • k8s自动化安装脚本(二进制)的操作步骤

    k8s自动化安装脚本(二进制)的操作步骤

    Kubernetes k8s安装脚本,非常好用,下面这篇文章主要给大家介绍了关于k8s自动化安装脚本(二进制)的操作步骤,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-09-09
  • K8S部署Kafka界面管理工具(kafkamanager)方法详解

    K8S部署Kafka界面管理工具(kafkamanager)方法详解

    这篇文章主要介绍了K8S部署Kafka界面管理工具(kafkamanager)方法详解,需要的朋友可以参考下
    2022-01-01
  • helmfile声明式部署Helm Chart使用详解

    helmfile声明式部署Helm Chart使用详解

    这篇文章主要为大家介绍了helmfile声明式部署Helm Chart使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • 详解kubernetes pod的编排和生命周期

    详解kubernetes pod的编排和生命周期

    这篇文章主要介绍了kubernetes pod的编排和生命周期的相关资料,帮助大家更好的理解和学习使用K8S,感兴趣的朋友可以了解下
    2021-04-04
  • K8S之StatefulSet有状态服务详解

    K8S之StatefulSet有状态服务详解

    本文主要介绍了K8S之StatefulSet有状态服务详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • 最新青龙面板2.10.2搭建+XDD-PLUS的保姆级教程

    最新青龙面板2.10.2搭建+XDD-PLUS的保姆级教程

    这篇文章主要介绍了最新青龙面板2.10.2搭建+XDD-PLUS的保姆级教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • 一篇文章读懂K8S的PV和PVC以及实践攻略

    一篇文章读懂K8S的PV和PVC以及实践攻略

    本文详细介绍了Kubernetes中的存储卷(Volume)机制,包括PersistentVolume(PV)、PersistentVolumeClaim(PVC)及其与后端存储的关系,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-10-10
  • Kubernetes中crictl的详细用法教程与应用实战记录

    Kubernetes中crictl的详细用法教程与应用实战记录

    crictl作为Kubernetes的容器运行时接口(CRI)的命令行工具,为Kubernetes的调试和管理提供了强大的支持,通过本文的详细介绍,你应该已经掌握了crictl的基本安装、配置、常用命令以及高级用法,需要的朋友可以参考下
    2024-07-07

最新评论