k8s使用volume将ConfigMap作为文件或目录直接挂载_NET Core + Kubernetes:Volume
和 Docker 类似,Kubernetes 中也提供了 Volume 来实现数据卷挂载,但 Kubernetes 中 Volume 是基于 Pod,而不是容器,它可被 Pod 中多个容器共享,另外 Kubernetes 中提供比较丰富的 Volume 类型,如:emptyDir、hostPath、nfs、persistentVolumeClaim、downwardAPI、secret、configMap 等,每种类型都有其特点及使用场景。
下面将介绍几种常用 Volume 类型的使用方式,在这之前先在 k8sdemo .NET Core 服务中添加以下两个接口(镜像版本升级为 1.2.0),以方便后面效果演示。
[HttpGet]public string GetConfig([FromQuery]string key){ // ......}[HttpGet]public string GetVolumeData(){ // ......}复制代码
GetConfig:通过传入配置文件 appsettings.json 的 key 获取对应值; GetVolumeData:获取容器内 /Data/data.txt 的文件内容;
emptyDir
emptyDir 的初始状态是一个没有任何内容的 Volume,其生命周期与 Pod 一致,当 Pod 中的容器挂掉时,emptyDir Volume 中的内容不会被清除,容器重启后数据依然可见。只有当整个 Pod 从集群中被删除,emptyDir Volume 中的内容才会被清除。如下:emptyDir Volume 位于 Pod 内。
通过以下配置文件创建的 Pod 中将包含 k8sdemo 和 busybox 两个 container,busybox 是一个集成了一些常用 linux 命令的镜像,这里将使用它在 Pod 内进行文件内容修改。k8sdemo 容器的 /app/Data/ 目录文件与 busybox 容器的 /data/ 目录文件将通过 emptyDir Volume 进行共享。
apiVersion: apps/v1kind: Deploymentmetadata: name: emptydir-demospec: replicas: 1 selector: matchLabels: name: emptydir-demo template: metadata: labels: name: emptydir-demo spec: containers: - name: k8sdemo image: beckjin/k8sdemo:1.2.0 volumeMounts: - mountPath: /app/Data/ name: share ports: - containerPort: 80 - name: busybox image: busybox command: - "/bin/sh" - "-c" - "sleep 3600" volumeMounts: - mountPath: /data/ name: share volumes: - name: share emptyDir: {}---apiVersion: v1kind: Servicemetadata: name: emptydir-demo-servicespec: selector: name: emptydir-demo type: NodePort ports: - port: 80 targetPort: 80复制代码
执行命令 kubectl exec -it emptydir-demo-746f49b55b-p6pzz -c busybox -- /bin/sh 进入 busybox 容器,然后执行 echo 'emptyDir Volume' > /data/data.txt,最后访问 k8sdemo 服务的 GetVolumeData 接口获取文件内容:
hostPath
hostPath 类型是挂载宿主机上的文件或目录到 Pod 中,与 Pod 所在的 Node 是强关联的,所以当 Pod 因重启被重新调度时,一定要确保所在主机的相关文件或目录的正确性,如下:
如下配置中 replicas 字段设置为 2 ,正常情况下 Pod 将会在 node1 和 node2 上分别被创建,另外 hostPath 字段中的 path 指定了 /data/k8sdemo/ 目录挂载到容器内的 /app/Data/,所以分别在 node1 和 node2 创建 /data/k8sdemo/data.txt ,内容为 node1 hostPath Volume 和 node2 hostPath Volume。
kind: Deploymentmetadata: name: hostpath-demospec: replicas: 2 selector: matchLabels: name: hostpath-demo template: metadata: labels: name: hostpath-demo spec: containers: - name: k8sdemo image: beckjin/k8sdemo:1.2.0 volumeMounts: - mountPath: /app/Data/ name: share ports: - containerPort: 80 volumes: - name: share hostPath: path: /data/k8sdemo type: Directory---apiVersion: v1kind: Servicemetadata: name: hostpath-demo-servicespec: selector: name: hostpath-demo type: NodePort ports: - port: 81 targetPort: 80复制代码
访问 k8sdemo 服务的 GetVolumeData 接口获取文件内容,当路由到不同 Pod(即不同的 node) 返回内容将不一样,如下:
nfs
NFS(network file system) 网络文件系统,类似 Windows 中的文件夹共享。首先在 Kubernetes 集群外搭建一个 NFS Server,然后指定文件目录进行共享,最终与 Pod 内的容器关联,实现数据卷挂载,如下:
NFS Server 搭建
- 在机器上安装依赖组件(集群外的机器 192.168.1.13,并关闭防火墙)yum install -y nfs-utils rpcbind 复制代码
- 将主机上的 /share 目录作为共享目录,如果多个目录可以添加多行[root@localhost ~]# vim /etc/exports /share 192.168.1.0/24(insecure,rw,no_root_squash) 复制代码
- 启动 NFSsystemctl start rpcbind.service systemctl enable rpcbind.service systemctl start nfs.service systemctl enable nfs.service 复制代码
- Kubernetes 集群内各节点安装 nfs-utils,方便使用 showmountyum install -y nfs-utils 复制代码
完成以上步骤后,在 Kubernetes 集群中任意节点执行 showmount -e 192.168.1.13 验证是否正常:
如下配置中 volumes 指定了 nfs 字段配置,即将 NFS Server 中的 /share 目录挂载到容器内的 /app/Data/,与 hostPath Volume 类型的主要区别是依赖单独的 NFS Server,和 node 本身并不耦合。
apiVersion: apps/v1kind: Deploymentmetadata: name: nfs-demospec: replicas: 2 selector: matchLabels: name: nfs-demo template: metadata: labels: name: nfs-demo spec: containers: - name: k8sdemo image: beckjin/k8sdemo:1.2.0 volumeMounts: - mountPath: /app/Data name: share ports: - containerPort: 80 volumes: - name: share nfs: server: 192.168.1.13 path: /share---apiVersion: v1kind: Servicemetadata: name: nfs-demo-servicespec: selector: name: nfs-demo type: NodePort ports: - port: 82 targetPort: 80复制代码
在 NFS Server 中执行 echo 'nfs Volume' > /share/data.txt,然后访问 k8sdemo 服务的 GetVolumeData 接口获取文件内容,如下:
persistentVolumeClaim
PersistentVolumeClaim(PVC) 与 PersistentVolume(PV) 在使用上是一对密不可分的组合,PV 主要是资源对象定义,PVC 主要是对应资源对象的引用,PV 支持 多种插件类型 进行实现,以下将继续使用 NFS 来作为 PV 插件。
如下图:首先基于 PV 插件在 Kubernetes 集群中创建各种资源规格的 PV,根据 Pod 需要存储卷资源创建 PVC,Kubernetes 将符合资源规格要求且消耗资源最小的 PV 绑定到 PVC,PV 和 PVC 是一对一的关系,如果找不到符合条件的 PV,PVC 会一直处于未绑定状态,PVC 绑定成功后可被 Pod 内的容器引用。
NFS Server 添加 mount 目录
修改 NFS Server /etc/exports 并生效 ,在 Kubernetes 集群中任意节点执行 showmount -e 192.168.1.13 验证是否正常:
创建 PV
以下配置将会创建3个 PV,storage 分别为 500M、1G、2G。
apiVersion: v1kind: PersistentVolumemetadata: name: pv-share-aspec: nfs: path: /share_a server: 192.168.1.13 accessModes: - ReadWriteMany capacity: storage: 500Mi---apiVersion: v1kind: PersistentVolumemetadata: name: pv-share-bspec: nfs: path: /share_b server: 192.168.1.13 accessModes: - ReadWriteMany capacity: storage: 1Gi---apiVersion: v1kind: PersistentVolumemetadata: name: pv-share-cspec: nfs: path: /share_c server: 192.168.1.13 accessModes: - ReadWriteMany capacity: storage: 2Gi复制代码
创建 PVC
apiVersion: v1kind: PersistentVolumeClaimmetadata: name: pvc-k8sdemospec: accessModes: - ReadWriteMany resources: requests: storage: 1Gi复制代码
PVC 创建成功后,pv-share-b 的 STATUS 会变为 Bound,同时 CLAIM 属性会显示相关的 PVC,从上图也可以看出使用的是最小符合资源规格的 PV,并不会将 pv-share-c 绑定到当前 PVC。更多关于 PV 和 PVC 属性说明可参考:persistent-volumes。
创建 Pod
如下配置中 volumes 指定了 persistentVolumeClaim 字段配置,这里只需要设置 claimName 为前面创建的 PVC 名称 pvc-k8sdemo 即可,使用上比较简单。
apiVersion: apps/v1kind: Deploymentmetadata: name: pvc-demospec: replicas: 2 selector: matchLabels: name: pvc-demo template: metadata: labels: name: pvc-demo spec: containers: - name: k8sdemo image: beckjin/k8sdemo:1.2.0 volumeMounts: - mountPath: /app/Data name: share ports: - containerPort: 80 volumes: - name: share persistentVolumeClaim: claimName: pvc-k8sdemo---apiVersion: v1kind: Servicemetadata: name: pvc-demo-servicespec: selector: name: pvc-demo type: NodePort ports: - port: 83 targetPort: 80复制代码
在 NFS Server 中执行 echo 'pvc Volume share_a' > /share_a/data.txt,share_b、share_c 类似,然后访问 k8sdemo 服务的 GetVolumeData 接口获取文件内容,如下:
configMap
configMap 主要使镜像和配置文件解耦,以便实现镜像的可移植性和可复用性,configMap 是配置信息的集合,可直接注入到 Pod 的容器中使用,扮演着配置中心的角色。configMap 可以以数据卷的形式挂载,也可以基于环境变量的形式注入到 Pod 容器中使用。另外 secret 是一种相对安全的 configMap,它默认会将配置信息进行 base64 编码,使配置不是明文直接存储在 configMap 中,起到一定的保护作用。
下面主要介绍 configMap 以数据卷挂载方式的使用,如下图,在 Kubernetes 集群中创建一个 configMap 资源类型,然后供 Pod 内的容器使用。
如下,创建一个数据卷形式的 ConfigMap,appsettings.json 是 .NET Core 程序内使用的配置文件。
apiVersion: v1kind: ConfigMapmetadata: name: configmap-k8sdemodata: appsettings.json: |- { "ServiceName": "k8sdemo" }复制代码
如下配置中 volumes 指定了 configMap 资源的名称为以上创建的 configMap 对象:configmap-k8sdemo。
apiVersion: apps/v1kind: Deploymentmetadata: name: configmap-demospec: replicas: 2 selector: matchLabels: name: configmap-demo template: metadata: labels: name: configmap-demo spec: containers: - name: k8sdemo image: beckjin/k8sdemo:1.2.0 volumeMounts: - name: configfile mountPath: /app/appsettings.json subPath: appsettings.json ports: - containerPort: 80 volumes: - name: configfile configMap: name: configmap-k8sdemo items: - key: appsettings.json path: appsettings.json---apiVersion: v1kind: Servicemetadata: name: configmap-demo-servicespec: selector: name: configmap-demo type: NodePort ports: - port: 84 targetPort: 80复制代码
通过访问 k8sdemo 服务的 GetConfig 接口获取指定 key 的值:
作者:BeckJin
链接:https://juejin.im/post/6844904198572605453
k8s使用volume将ConfigMap作为文件或目录直接挂载_NET Core + Kubernetes:Volume相关推荐
- k8s使用volume将ConfigMap作为文件或目录直接挂载_Kubernetes in Action 06. 卷:将磁盘挂载到容器...
简介 P161 pod 中的每个容器都有自己独立的文件系统,因为文件系统来自容器镜像. P161 Kubernetes 中的卷是 pod 的一部分,并和 pod 共享相同的生命周期.这意味着 pod ...
- k8s使用volume将ConfigMap作为文件或目录直接挂载_【大强哥-k8s从入门到放弃06】Secret详解...
1.secret介绍 secret用来保存小片敏感数据的k8s资源,例如密码,token,或者秘钥.这类数据当然也可以存放在Pod或者镜像中,但是放在Secret中是为了更方便的控制如何使用数据,并减 ...
- k8s使用volume将ConfigMap作为文件或目录直接挂载_从零开始入门 K8s | 如何实现应用配置管理?...
作者 | 何淋波(新胜) 阿里云容器服务技术专家 需求来源 背景问题 首先一起来看一下需求来源.大家应该都有过这样的经验,就是用一个容器镜像来启动一个 container.要启动这个容器,其实有很多需 ...
- k8s使用volume将ConfigMap作为文件或目录直接挂载_从应用开发角度认识 K8S
简介:刘晨 Lorraine 坐标Fintech,精通持续集成与发布,曾具有全平台100+应用持续部署持续发布实战经验,现在立志于成为K8S玩家. 云原生应用 我们正经历从单体应用转向分布式微服务架构 ...
- system volume information是什么文件_如何扩展Unity URP的后处理Volume组件
Unity在更新到Unity2019.4之后,大家或许已经发现,在使用URP(通用渲染管线)的情况下,Unity原来的Post Processing插件好像不起效了.原来Unity在Unity2019 ...
- @kubernetes(k8s) 应用配置管理(ConfigMap、subPath、Secret)
k8s 应用配置管理 ConfigMap 文章目录 k8s 应用配置管理 ConfigMap 一. ConfigMap 1.configmap的介绍 2.congfigmap的创建方式(四种) [指定 ...
- Linux命令工具基础02 文件及目录管理
文件及目录管理 文件管理不外乎文件或目录的创建.删除.查询.移动,有mkdir/rm/mv 文件查询是重点,用find来进行查询:find的参数丰富,也非常强大: 查看文件内容是个大的话题,文本的处理 ...
- K8s 集群使用 ConfigMap 优雅加载 Spring Boot 配置文件
文章目录 1.Spring Boot 加载配置介绍 2.环境.软件准备 3.Spring Boot 示例工程 Demo 4.K8s ConfigMap 加载工程配置文件 4.1.直接加载环境的配置文件 ...
- U盘中毒了?教你如何删除System Volume Information这个顽固文件夹
不得不说cmd命令很好用呢.最近我的U盘中毒了,格式化都删除不了System Volume Information这个顽固的文件夹,真心伤不起哇!还好现在解决了问题.看来以后得好好对待U盘,不能乱用了 ...
最新文章
- 修改windows cmd f2快捷_第三课——win10常用快捷键的使用
- 设计模式之享元模式、例子分析
- python3爬虫基础学习
- heidiSQL使用简介
- 点击连接后不刷新就不显示页面的bug修复
- zh-cn en-uk、zh-tw表示语言(文化)代码与国家地区对照表(最全的各国地区对照表)...
- java上传音频的方法_将音频文件从文档目录上传到 iCloud
- 大神u盘工具(win10PE)UEFI纯净版启动盘制作工具
- 【电磁】Matlab模拟电机内电磁场的分布附GUI界面
- 服务器常见高可用方案
- 将图片上传到FTP服务器
- 【题解】Luogu P5405 [CTS2019]氪金手游
- Method breakpoint reached日志问题
- ubuntu 外接显示器设置 鼠标指针闪烁 屏幕缩放 相对位置设置 分辨率设置 -xrandr
- scanner 获取控制台信息_关于java.util.scanner:如何使用Java中的Scanner类从控制台读取输入?...
- 线性表-顺序表的基本操作
- 【2019-游记】中山纪念中学暑期游Day3
- W308R南昌星空极速软件
- 武大计算机保研北大,17名北大毕业生保研到武大?网友说亏大了,其实这些学生赚大了!...
- Google Earth Engine(GEE)—— 快速进行农田作物土地分类和面积统计