当前位置: 首页 > news >正文

k8s之挂载本地磁盘到POD中

写在前面

本文一起看下如何挂载本地的磁盘到POD中。

1:都需要哪些API对象

现实世界中的存储设备有非常非常多的种类,如本文要分析的计算机磁盘,还包括NFS(一种网络磁盘存储协议),Ceph(一种分布式的文件存储系统),不管是哪种方式,最终都是通过将数据存储到硬盘来实现持久化,但是不同种类写入数据的方式是不相同的,k8s针对这些不同的存储目标进行抽象定义了PersistentValume API对象,如下:

dongyunqi@mongodaddy:~/k8s$ kubectl api-resources|egrep -w 'PersistentVolume|KIND'
NAME                              SHORTNAMES   APIVERSION                             NAMESPACED   KIND
persistentvolumes                 pv           v1                                     false        PersistentVolume

现在不同存储系统的抽象已经有了,那么具体该怎么使用办呢?能不能让pv拥有这种能力呢?自然是可以的,但是这又不符合单一职责的原则了,所以对于这些存储系统的具体使用k8s又定义了一个新的API对象,Persistent Volume Claim,如下:

dongyunqi@mongodaddy:~/k8s$ kubectl api-resources|egrep -w 'PersistentVolumeClaim|KIND'
NAME                              SHORTNAMES   APIVERSION                             NAMESPACED   KIND
persistentvolumeclaims            pvc          v1                                     true         PersistentVolumeClaim

最后,这么多的存储系统,当多了之后,混杂在一起,势必造成混乱,为此k8s又定义了StorageClass来进行分类维护,如下:

dongyunqi@mongodaddy:~/k8s$ kubectl api-resources|egrep -w 'StorageClass|KIND'
NAME                              SHORTNAMES   APIVERSION                             NAMESPACED   KIND
storageclasses                    sc           storage.k8s.io/v1                      false        StorageClass

这样,需要用到的3个API对象我们就介绍完毕了,三者的关系我们可以参考下图:

在这里插入图片描述

下面我们看一个实际的例子。

2:挂载磁盘到POD中

毫无疑问,我们需要先定义磁盘的抽象PV,yaml如下:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: host-10m-pv

spec:
  storageClassName: host-test
  accessModes:
  - ReadWriteOnce
  capacity:
    storage: 10Mi
  hostPath:
    path: /tmp/host-10m-pv/

主要属性介绍如下:

name: host-10m-pv
    名字,见名知意,基于host的10m的pv
storageClassName: host-test
    存储class,进行分类,根据具体业务即可
- ReadWriteOnce
    读写策略,完整如下:
        ReadWriteOnce:存储卷可读可写,但只能被一个节点上的Pod挂载。
        ReadOnlyMany:存储卷只读不可写,可以被任意节点上的Pod多次挂载。
        ReadWriteMany:存储卷可读可写,也可以被任意节点上的Pod多次挂载。
    这里是本地磁盘,自然是只能被一个节点上的POD挂载
storage: 10Mi
    大小10MB,但这里使用的是国际标准,不同于我们用的KB(1024 byte),MB(1024*1024 byte),一定不要写错
path: /tmp/host-10m-pv/
    要挂载的本地磁盘目录,没有的话需要手动创建该目录

接着我们应用PV,如下:

kubectl apply -f host-path-pv.yml

在这里插入图片描述

接着我们就要来使用已经定义的PV了,方式自然是定义persistent volume claim,如下:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: host-5m-pvc

spec:
  storageClassName: host-test
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Mi

storage: 5Mi代表要求的大小是5MB,然后我们应用:

kubectl apply -f host-path-pv.yml

操作完成后k8s就会寻找存储class类型为host-test,大小满足5M的PV,最终找到了pv host-10m-pv,就将其给pvc host-5m-pvc使用,这个使用和被使用确定的过程,我们叫做绑定 bound,如下就显示二者就处于Bound状态了:

需要的是5m但有10m,此时怎么办呢?剩余5m就免费赠送了,因为没有更合适的了。

dongyunqi@mongodaddy:~/k8s$ kubectl get pv
NAME          CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                 STORAGECLASS   REASON   AGE
host-10m-pv   10Mi       RWO            Retain           Bound    default/host-5m-pvc   host-test               3h27m
dongyunqi@mongodaddy:~/k8s$ kubectl get pvc
NAME          STATUS   VOLUME        CAPACITY   ACCESS MODES   STORAGECLASS   AGE
host-5m-pvc   Bound    host-10m-pv   10Mi       RWO            host-test      3h33m

此时PVC已经绑定了PV,接下来我们就该将PVC挂载到POD中了,定义POD如下:

apiVersion: v1
kind: Pod
metadata:
  name: host-pvc-pod

spec:
  volumes:
  - name: host-pvc-vol
    persistentVolumeClaim:
      claimName: host-5m-pvc

  containers:
    - name: ngx-pvc-pod
      image: nginx:alpine
      ports:
      - containerPort: 80
      volumeMounts:
      - name: host-pvc-vol
        mountPath: /tmp

通过claimName: host-5m-pvc声明pvc host-5m-pvc为卷volume,然后在volumeMounts挂载卷到mountPath: /tmp目录中,如果一切顺利的话,我们在POD中的/tmp目录更新文件的内容都会同步写到宿主机Node的/tmp/host-10m-pv/目录,应用后,我们进入POD中验证,如下:

dongyunqi@mongodaddy:~/k8s$ kubectl exec -it host-pvc-pod -- sh
/ # ls /tmp
/ # cd /tmp/
/tmp # ls
/tmp # touch a.txt
/tmp # echo "content writed by pod" > a.txt 
/tmp # cat a.txt 
content writed by pod
/tmp # 

查看POD所在Node(注意这里一定要是POD所在的Node,不确定POD在哪里可通过-o wide确定)

dongyunqi@mongomummy:~/k8s/images$ cd /tmp/host-10m-pv/
dongyunqi@mongomummy:/tmp/host-10m-pv$ ls
a.txt
dongyunqi@mongomummy:/tmp/host-10m-pv$ cat a.txt 
content writed by pod

这样就算POD销毁重建,新建的文件也依然在,也就实现了持久化,如下测试:

dongyunqi@mongodaddy:~/k8s$ kubectl delete pod host-pvc-pod
pod "host-pvc-pod" deleted
dongyunqi@mongodaddy:~/k8s$ kubectl apply -f host-path-pod.yml 
pod/host-pvc-pod created
dongyunqi@mongodaddy:~/k8s$ kubectl get pod
NAME           READY   STATUS    RESTARTS   AGE
host-pvc-pod   1/1     Running   0          11s
dongyunqi@mongodaddy:~/k8s$ kubectl exec -it host-pvc-pod -- sh
/ # cat /tmp/a.txt 
content writed by pod
/ # exit
dongyunqi@mongodaddy:~/k8s$ 

写在后面

小结

本文分析了实现磁盘挂载到POD中需要用到的PV persistent volume,PVC persistent volume claim,Storage Class这三个API对象,并一起看了一个实际的例子,实现了POD中数据的持久化。希望本文能够帮助到你。

参考文章列表

相关文章:

  • 做微信用什么网站/直接下载app
  • 网站开发需要的人员/长沙营销推广
  • 61源码网/武汉seo优
  • 免费网站建设模板下载/品牌运营策划
  • 企业seo指的是/seo sem推广
  • 做期货在哪个网站看消息/长沙网站seo收费标准
  • Spring国际化详解,Spring国家化实例及源码详解
  • 解决Windows Server远程断开后自动锁屏问题
  • 系分 - 案例分析 - 系统设计
  • 基于有向图的邻接矩阵计算其割点、割边、压缩图,并用networkx可视化绘制
  • 【进阶】Spring更简单的读取和存储对象
  • C++内存分配方法new与placement new使用方法详解
  • [ACTF2020 新生赛]BackupFile
  • 自动化测试 | 这些常用测试平台,你们公司在用的是哪些呢?
  • Android大厂面试100题,涵盖测试技术、环境搭建、人力资源
  • 【QT5 实现“上图下文”,带图标的按键样式-toolbutton-学习笔记-记录-基础样例】实现方式之一
  • Android 9.0系统源码_SystemUI(八)PhoneWindow更新状态栏和导航栏背景颜色的流程解析
  • ElementUI中树形表格下拉卡死的问题解决