k8s 持久化存储

我们继续来查看 k8s 的卷,上一次我们分享了将磁盘挂载到容器中,empyDir 和 gitRepo 都是会随着 pod 的启动而创建,随着 pod 的删除而销毁

那么我们或许会有这样的需求,期望在 pod 上面读取节点的文件或者使用节点的文件系统来访问节点的设备

这个时候,我们就可以让 hostPath 出马了

hostPath

咱们来看图说话

k8s 持久化存储_第1张图片

hostPath 卷会指向节点文件系统上的特定文件或者目录,我们同时在一个节点上运行并在 hostPath 卷中使用相同的路径的 pod ,就可以看到相同的文件了

使用 hostPath 卷的时候,哪怕我们删除 pod ,hostPath 卷的内容也不会被删除,若现在启动了一个 pod,也会发现之前被删除 pod 留下来的数据(这里必须是在同一个工作节点上的 pod

发现问题

通过上面的 hostPath 的介绍,我们知道 hostPath 卷的数据是放在工作节点上的,若是节点 A 上的 pod 被重启,重启后的 pod 跑到 节点 B 去了,那么新的 pod 是没有版本访问到之前 pod 产生或者是挂载的数据的

因此,我们使用 hostPath 卷的时候,要慎重考虑,因此 hostPath 卷对节点真的是非常敏感的。

一般 hostPath卷使用的都是一些系统级别的 Pod ,例如在 kube-system 命名空间下面 被 DaemonSet 管控的一些系统级别的 pod,会使用 hostPath

这些 pod 被 DaemonSet 管控,每一个节点只会有 1 个副本,若节点上的副本发生异常,那么会马上在当前节点立刻创建一个 新的 pod ,因此,新的 pod ,自然就能够正常的访问到 上一个 pod 留下来的数据了,自然就可以接着上一个 pod 的运行状态运行下去了

持久化存储

就上面的这个问题,如果我们的 pod 无论跑到那个节点上的时候,都需要每个节点都有相同的数据可以使用,这个时候我们可以如何处理呢?

我们可以创建一个 pod,里面跑一个带有持久卷 hostPath 的数据库,可以是 mongodb

mongodb-pod-hostpath.yaml

apiVersion: v1
kind: Pod
metadata:
  name: xmt-mongodb
spec:
  volumes:
  - name: mongodb-data
    hostPath:
      path: /tmp/mongodb
  containers:
  - image: mongo
    name: mongodb
    volumeMounts:
    - name: mongodb-data
      mountPath: /data/db
    ports:
    - containerPort: 27017
      protocol: TCP

  • 写一个 pod 的清单,hostPath 卷设置 /tmp/mongodb
  • 创建的容器,使用 mongo, 容器挂载的路径是 /data/db
  • 容器端口设置 mongodb 的默认端口 27017

kubectl create -f mongodb-pod-hostpath.yaml 创建 pod 后查看效果

k8s 持久化存储_第2张图片

我们的思路是,进入到 mongodb Pod 中 ,完成如下 2 步骤

第一步骤:

  • 创建一个数据库,mytest
  • 创建一张表命名为 test
  • 插入一条数据,数据为 name:’xiaomotong888’

第二步骤:

然后删除这个 mongodb Pod 后,重新启动一个一模一样的 mongodb Pod

  • 查看刚才插入的数据是否还在,若在,说明 hostPath 的卷的内容不会随着 pod 的删除而被销毁掉

第一步:

k8s 持久化存储_第3张图片

> use mytest
switched to db mytest
> db.test.insert({name:'xiaomotong888'})
WriteResult({ "nInserted" : 1 })
> db.test.find()
{ "_id" : ObjectId("61ed74f43c34bef84d2f5a4c"), "name" : "xiaomotong888" }

第二步:

k8s 持久化存储_第4张图片

k8s 持久化存储_第5张图片

通过上图已经证实了我们上述的想法,这是符合预期的,哪怕 pod 被删除后重建,持久化存储的磁盘中仍然有 pod 实例中持久化的数据

另外一个持久化存储卷

还记得之前我们列的一堆卷类型,emptyDir,gitRepo,hostPath 都说了,现在就差 NFS 卷

NFS 卷

NFS 卷是啥呢?

顾名思义,网络文件系统的卷,这个卷用起来就比较方便了,写清单的时候也是非常容易的,我们只需要指定 NFS 的 server 地址 和路径即可

例如可以这样:

。。。
volumes:
  - name: mongodbxxxx
    nfs:
      server: x.x.x.x
      path: /xx/xx/xx/xx
。。。

这个用起来就没有那么多幺蛾子,数据挂载了别的地方,这些数据都是持久化的,跟 pod 的启动,删除,就没有什么关系了

今天就到这里,学习所得,若有偏差,还请斧正

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

k8s 持久化存储_第6张图片

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是阿兵云原生,欢迎点赞关注收藏,下次见~

更多的可以查看 零声每晚八点直播:https://ke.qq.com/course/417774

你可能感兴趣的:(kubernetes,容器,云原生)