关于后端:k8s-中的卷

51次阅读

共计 3142 个字符,预计需要花费 8 分钟才能阅读完成。

后面的文章咱们分享了 pod,RC,RS,DaemonSet,CJ,Service 等各种资源

明天咱们来分享一波如何将磁盘挂载到容器中,在 docker 外面这种技术叫做 数据卷,感兴趣的小伙伴能够查看一下文章:【Docker 系列】docker 学习六,探索一下数据卷容器

对于一个 pod,他有本人的 CPU,RAM,网络接口等资源 都是能够被 pod 外面的容器共享的,然而每一个容器是有本人独立的文件系统的,那么在咱们平时应用须要应用给到文件系统的时候就会呈现这个问题

举个例子

以后 pod1 运行着,产生了一些数据,因为某种原因,该 pod 被重启了(删除该 pod1,重新启动一个 pod2),新的 pod2 若期望持续应用前一个 pod1 产生的数据,那么这种状况是不行的

因而,卷就有了用途

卷是什么呢?

这里的 就是指的数据卷,他并不是 k8s 外面的一类资源,他只是被定义为 pod 的一部分,他在 k8s 中也不是独立的对象,他是 pod 的一个组成部分,咱们在写 pod 清单的时候,就能够应用关键字 volume 来指定卷

咱们晓得,一个 pod 外面能够定义多个容器,pod 外面的卷也能够被这这外面的多个容器共享 对于 pod 外面的卷,也并不是每一个容器都要应用,这些都是能够依照本人的需要进行配置的

看图谈话:

一个 pod 外面有 3 个容器,2 个卷,能够依照本人的需要去配置

卷的多种类型

卷的类型多种多样,不同的需要会用到不同的卷,有如下这些类型

  • emptyDIr
  • gitRepo
  • hostPath
  • nfs
  • 云服务商特定的存储类型等等
  • 非凡类型的卷

此处说的非凡类型的卷,指的是 configMap,secret,downloadApi 等类型的卷

本次分享次要是前 4 种类型的利用场景和应用形式

emptyDir,gitRepo

emptyDir

emptyDir,依据名称咱们大略晓得这是一个空目录,也就是卷是从一个空的目录开始的,咱们 pod 外面的多个容器都能够对他进行写入数据,写入一下长期的大量数据也是可行的

然而有一点咱们须要留神:

emptyDir 类型的卷,会随着 pod 的启动而生成,随着 pod 的删除而隐没

小案例

咱们能够来模仿一下 pod 中,多个容器共享一个挂载的小案例

创立一个在卷中写数据的镜像,和创立一个从卷中读取数据的镜像

echo_uuid.sh

#~/bin/bash
mkdir /var/testuuid

while :
do
  STR=`cat /proc/sys/kernel/random/uuid`
  echo ${STR} > /var/testuuid/info.txt
  echo uuid - ${STR}
  sleep 5
done

次要性能是每隔 5 秒钟在就会输出一个 uuid 到 文件/var/testuuid/info.txt

Dockerfile

FROM ubuntu:latest
ADD echo_uuid.sh /bin/echo_uuid.sh
ENTRYPOINT /bin/echo_uuid.sh

制作镜像 echo_uuid

此处的 DockerHub 的账号,能够批改成读者你本人的,记得须要在环境中登录 docker 账号

docker build -t xiaomotong888/echo_uuid .
docker push xiaomotong888/echo_uuid

query_uuid.sh

#~/bin/bash

while :
do
  echo queryuuid:
  cat /var/testuuid/info.txt
  sleep 5
done

次要性能就是每隔 5 秒钟就会读取一下文件 /var/testuuid/info.txt 的内容

Dockerfile

FROM ubuntu:latest
ADD query_uuid.sh /bin/query_uuid.sh
ENTRYPOINT /bin/query_uuid.sh

制作镜像 query_uuid

docker build -t xiaomotong888/query_uuid .
docker push xiaomotong888/query_uuid

编写 yaml 文件:emptyDir_test.yaml

apiVersion: v1
kind: Pod
metadata:
  name: testuuiddemo
spec:
  containers:
  - image: xiaomotong888/echo_uuid
    name: echo-uuid
    volumeMounts:
    - name: uuid
      mountPath: /var/testuuid
  - image: xiaomotong888/query_uuid
    name: query-uuid
    volumeMounts:
    - name: uuid
      mountPath: /var/testuuid
      readOnly: true
  volumes:
  - name: uuid
    emptyDir: {}

上述编写一个 Pod 的清单,外面有 2 个容器,拉取的镜像别离是 xiaomotong888/echo_uuid , xiaomotong888/query_uuid,且都挂载到 名为 uuid,挂载门路为 /var/testuuid

这里还须要留神一点的是,query-uuid 容器 对于上述挂载门路是 只读的

通过 kubectl create -f emptyDir_test.yaml 之后咱们能够看到成果:

查看 echo-uuid 容器的日志,在 pod 外面有多个容器的时候,查看日志的形式是

kubectl logs -f podName containerName

查看 query-uuid 容器的日志

通过上述例子咱们就明确了,一个 pod 外面的多个容器能够共享挂载的内容

gitRepo

gitRepo 卷,其实和 emptyDir 相似 ,只不过 gitRepo 卷 会克隆 Git 仓库并在 pod 启用的时候检出特定的版本来填充数据,就多了这么一个步骤

简略来说就是:

下面的例子是,咱们本人在指定的卷下面输入数据,而 gitRepo 就是在 pod 启动的时候,去 git 仓库拉取最新的 master 分支的最新版本,放到咱们挂载的目录下,如下图所示:

  1. 用户会先创立一个带有 gitRepo 卷的 Pod
  2. k8s 会创立一个空目录,而后立刻从 git 仓库中拉取最新的 master 版本的数据 ,通过这一点, 咱们就晓得,gitRepo 其实 和 emptyDir 没啥区别
  3. 拉取 git 版本后,容器便启动结束,这是卷曾经挂在挂载门路上了

通过上述步骤,仔细的敌人就能够看到,gitRepo 卷从 git 仓库拉取的动作,是在 pod 启动的时候,那么 pod 在运行状态的时候,若批改了 git 仓库外面的内容,那么 pod 外面的容器是不会同步数据的

必须是一个新的 pod 才会去拉取最新的 git 最新版本内容

对于创立 pod,配置上 gitRepo 仓库咱们能够简略说一下:

apiVersion: v1
kind: Pod
metadata:
  name: testuuiddemo
spec:
  containers:
  - image: xiaomotong888/echo_uuid
    name: echo-uuid
    volumeMounts:
    - name: uuid
      mountPath: /var/testuuid
  volumes:
  - name: uuid
    gitRepo:
      repository: https://xxxxxxx.git
      revision: master
      directory: .

通过清单查看到,清单定义的前半部分内容都是统一的,次要是前面 volumes 处 的区别

下面这俩都是比较简单,比拟根底的卷,下一篇咱们分享一下长久化的存储波及的卷

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

欢送点赞,关注,珍藏

敌人们,你的反对和激励,是我保持分享,提高质量的能源

好了,本次就到这里

技术是凋谢的,咱们的心态,更应是凋谢的。拥抱变动,背阴而生,致力向前行。

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

正文完
 0