k8s ConfigMap 中 subPath 字段和 items 字段

news/2024/12/12 20:26:25/

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: configmapnamespace: dev
data:info: |username:adminpassword:123456info2: zhangssssssssssssssssssssssssss

pod1.yaml

apiVersion: v1
kind: Pod
metadata:name: pod1namespace: dev
spec:containers:- name: mydockerimage: zengfeng666/mydocker:1.0command: ["/bin/sh", "-c", "while true; do sleep 2; done;"]volumeMounts:- name: configmountPath: /workspacevolumes:- name: configconfigMap:name: configmap

pod2.yaml

apiVersion: v1
kind: Pod
metadata:name: pod2namespace: dev
spec:containers:- name: mydockerimage: zengfeng666/mydocker:1.0command: ["/bin/sh", "-c", "while true; do sleep 2; done;"]volumeMounts:- name: configmountPath: /workspace/infosubPath: info- name: configmountPath: /workspace/info2subPath: info2volumes:- name: configconfigMap: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: configconfigMap:name: configmapitems:- key: info         # 原文件名(key的名称)path: userinfo    # 修改之后的文件名(key的名称)- key: info2path: userinfo2

items还有一个作用,就是只有items下的key对应的文件会被挂载到容器中。

比如pod1.yaml中不想把info和info2都挂载到workspace目录下,而只需要挂载info到workspace目录下,则可以将pod1.yaml的volumes字段修改为:

     volumes:- name: configconfigMap:name: configmapitems:- key: info         path: info         

http://www.ppmy.cn/news/29058.html

相关文章

STM32开发(17)----CubeMX配置CRC

CubeMX配置CRC前言一、什么是CRC?二、实验过程1.STM32CubeMX配置2.代码实现重载printf3.实验结果总结前言 本章介绍使用STM32CubeMX对CRC进行配置的方法,CRC的目的是保证数据的完整性,所有的STM32芯片都内置了一个硬件的CRC计算模块&#xf…

Python进阶-----高阶函数map() 简介和使用

目录 简介: ​编辑 示例: 示例(1):输出map()函数返回值(迭代器)结果 示例(2):与循环对比 示例(3):字符串转列表 示…

【蓝桥杯入门到入土】最基础的数组你真的掌握了吗?

文章目录一:数组理论基础二:数组知识点总结三:数组这种数据结构的优点和缺点是什么?四:实战解题1. 移除元素暴力解法双指针法2.有序数组的平方暴力解法双指针法最后说一句一:数组理论基础 首先要知道数组在…

单目标应用:蜣螂优化算法DBO优化RBF神经网络实现数据预测(提供MATLAB代码)

一、RBF神经网络 1988年,Broomhead和Lowc根据生物神经元具有局部响应这一特点,将RBF引入神经网络设计中,产生了RBF(Radical Basis Function)。1989年,Jackson论证了RBF神经网络对非线性连续函数的一致逼近性能。 RBF的基本思想是…

如何使用C2concealer生成随机化的C2 Malleable配置文件

关于C2concealer C2concealer是一款功能强大的命令行工具,在该工具的帮助下,广大研究人员可以轻松生成随机化的C2 Malleable配置文件,以便在Cobalt Strike中使用。 工具运行机制 开发人员对Cobalt Strike文档进行了详细的研究,…

Elasticsearch:以 “Painless” 方式保护你的映射

Elasticsearch 是一个很棒的工具,可以从各种来源收集日志和指标。 它为我们提供了许多默认处理,以便提供最佳用户体验。 但是,在某些情况下,默认处理可能不是最佳的(尤其是在生产环境中); 因此&…

MySQL基础(一)SQL分类、导入、SELECT语句,运算符

目录 MySQL安装以及相关工具 SQL分类 导入数据 最基本的SELECT语句 SELECT FROM 列的别名 去除重复行 着重号 查询常数 描述表结构 过滤数据(重要) 运算符 算数运算符 比较运算符 符号运算符 非符号运算符 逻辑运算符 位运算符 MySQL安…

SSM SpringBoot vue 在线教学质量评价系统

SSM SpringBoot vue 在线教学质量评价系统 SSM 在线教学质量评价系统 功能介绍 首页 图片轮播展示 登录 学生注册 教师注册 督导注册 教师展示 教师详情 学生评价 课程信息 课程详情 提交选修该课 学生选课 学生留言 个人中心 后台管理 管理员或学生或教师或督导登录 个人中…