和 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 搭建

  1. 在机器上安装依赖组件(集群外的机器 192.168.1.13,并关闭防火墙)yum install -y nfs-utils rpcbind 复制代码
  2. 将主机上的 /share 目录作为共享目录,如果多个目录可以添加多行[root@localhost ~]# vim /etc/exports /share 192.168.1.0/24(insecure,rw,no_root_squash) 复制代码
  3. 启动 NFSsystemctl start rpcbind.service systemctl enable rpcbind.service systemctl start nfs.service systemctl enable nfs.service 复制代码
  4. 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相关推荐

  1. k8s使用volume将ConfigMap作为文件或目录直接挂载_Kubernetes in Action 06. 卷:将磁盘挂载到容器...

    简介 P161 pod 中的每个容器都有自己独立的文件系统,因为文件系统来自容器镜像. P161 Kubernetes 中的卷是 pod 的一部分,并和 pod 共享相同的生命周期.这意味着 pod ...

  2. k8s使用volume将ConfigMap作为文件或目录直接挂载_【大强哥-k8s从入门到放弃06】Secret详解...

    1.secret介绍 secret用来保存小片敏感数据的k8s资源,例如密码,token,或者秘钥.这类数据当然也可以存放在Pod或者镜像中,但是放在Secret中是为了更方便的控制如何使用数据,并减 ...

  3. k8s使用volume将ConfigMap作为文件或目录直接挂载_从零开始入门 K8s | 如何实现应用配置管理?...

    作者 | 何淋波(新胜) 阿里云容器服务技术专家 需求来源 背景问题 首先一起来看一下需求来源.大家应该都有过这样的经验,就是用一个容器镜像来启动一个 container.要启动这个容器,其实有很多需 ...

  4. k8s使用volume将ConfigMap作为文件或目录直接挂载_从应用开发角度认识 K8S

    简介:刘晨 Lorraine 坐标Fintech,精通持续集成与发布,曾具有全平台100+应用持续部署持续发布实战经验,现在立志于成为K8S玩家. 云原生应用 我们正经历从单体应用转向分布式微服务架构 ...

  5. system volume information是什么文件_如何扩展Unity URP的后处理Volume组件

    Unity在更新到Unity2019.4之后,大家或许已经发现,在使用URP(通用渲染管线)的情况下,Unity原来的Post Processing插件好像不起效了.原来Unity在Unity2019 ...

  6. @kubernetes(k8s) 应用配置管理(ConfigMap、subPath、Secret)

    k8s 应用配置管理 ConfigMap 文章目录 k8s 应用配置管理 ConfigMap 一. ConfigMap 1.configmap的介绍 2.congfigmap的创建方式(四种) [指定 ...

  7. Linux命令工具基础02 文件及目录管理

    文件及目录管理 文件管理不外乎文件或目录的创建.删除.查询.移动,有mkdir/rm/mv 文件查询是重点,用find来进行查询:find的参数丰富,也非常强大: 查看文件内容是个大的话题,文本的处理 ...

  8. K8s 集群使用 ConfigMap 优雅加载 Spring Boot 配置文件

    文章目录 1.Spring Boot 加载配置介绍 2.环境.软件准备 3.Spring Boot 示例工程 Demo 4.K8s ConfigMap 加载工程配置文件 4.1.直接加载环境的配置文件 ...

  9. U盘中毒了?教你如何删除System Volume Information这个顽固文件夹

    不得不说cmd命令很好用呢.最近我的U盘中毒了,格式化都删除不了System Volume Information这个顽固的文件夹,真心伤不起哇!还好现在解决了问题.看来以后得好好对待U盘,不能乱用了 ...

最新文章

  1. 修改windows cmd f2快捷_第三课——win10常用快捷键的使用
  2. 设计模式之享元模式、例子分析
  3. python3爬虫基础学习
  4. heidiSQL使用简介
  5. 点击连接后不刷新就不显示页面的bug修复
  6. zh-cn en-uk、zh-tw表示语言(文化)代码与国家地区对照表(最全的各国地区对照表)...
  7. java上传音频的方法_将音频文件从文档目录上传到 iCloud
  8. 大神u盘工具(win10PE)UEFI纯净版启动盘制作工具
  9. 【电磁】Matlab模拟电机内电磁场的分布附GUI界面
  10. 服务器常见高可用方案
  11. 将图片上传到FTP服务器
  12. 【题解】Luogu P5405 [CTS2019]氪金手游
  13. Method breakpoint reached日志问题
  14. ubuntu 外接显示器设置 鼠标指针闪烁 屏幕缩放 相对位置设置 分辨率设置 -xrandr
  15. scanner 获取控制台信息_关于java.util.scanner:如何使用Java中的Scanner类从控制台读取输入?...
  16. 线性表-顺序表的基本操作
  17. 【2019-游记】中山纪念中学暑期游Day3
  18. W308R南昌星空极速软件
  19. 武大计算机保研北大,17名北大毕业生保研到武大?网友说亏大了,其实这些学生赚大了!...
  20. Google Earth Engine(GEE)—— 快速进行农田作物土地分类和面积统计

热门文章

  1. Java GUI编程最全笔记以及贪吃蛇案例分享
  2. 最全整理!37 个 Python Web 开发框架总结
  3. 【数论】本原勾股数组(PPT)的性质
  4. 【Vulkan】Sparse Resources(一)【Basic】
  5. Linux基础入门和帮助
  6. paddle实现线性回归
  7. mac电脑之间大文件传输
  8. 华硕新款 Vivobook Go 15 OLED 评测
  9. 与目前主流的消费返利平台对比,共享购模式有什么优势呢?
  10. 以数字技术赋能产业金融生态能力建设,破解银行的场景焦虑