美文网首页
k8s 中的卷

k8s 中的卷

作者: 阿兵云原生 | 来源:发表于2023-07-11 21:23 被阅读0次

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

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

对于一个 pod ,他有自己的 CPU,RAM,网络接口等资源都是可以被 pod 里面的容器共享的,但是每一个容器是有自己独立的文件系统的,那么在我们平时使用需要使用给到文件系统的时候就会出现这个问题

举个例子

当前 pod1 运行着,产生了一些数据,由于某种原因,该 pod 被重启了(删除该 pod1 ,重新启动一个 pod2),新的 pod2 若期望继续使用前一个 pod1 产生的数据,那么这种情况是不行的

因此,卷就有了用处

卷是什么呢?

[图片上传失败...(image-18b971-1689168155062)]

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

我们知道,一个 pod 里面可以定义多个容器,pod 里面的卷也可以被这这里面的多个容器共享对于 pod 里面的卷,也并不是每一个容器都要使用,这些都是可以按照自己的需求进行配置的

看图说话:

[图片上传失败...(image-8fd689-1689168155062)]

一个 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 之后我们可以看到效果:

[图片上传失败...(image-7477bb-1689168155062)]

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

kubectl logs -f podName containerName

[图片上传失败...(image-39f4e9-1689168155062)]

查看 query-uuid 容器的日志

[图片上传失败...(image-2a76a4-1689168155062)]

通过上述例子我们就明确了,一个 pod 里面的多个容器可以共享挂载的内容

gitRepo

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

简单来说就是:

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

[图片上传失败...(image-67b6c6-1689168155062)]

  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 处 的区别

[图片上传失败...(image-90dff9-1689168155062)]

上面这俩都是比较简单,比较基础的卷,下一篇我们分享一下持久化的存储涉及的卷

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

欢迎点赞,关注,收藏

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

[图片上传失败...(image-d3a574-1689168155062)]

好了,本次就到这里

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

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

相关文章

  • 4 存储与资源管理

    k8s卷管理 k8s和docker默认使用本地的主机磁盘 容器卷生命周期 在资源短缺下,k8s可能会停止容器,在相...

  • ES集群存储扩容及在线调整配置

    环境信息 ELK日志系统,运行在 K8S 集群中 ,存储使用StorageClass 动态存储卷 故障现象 Kib...

  • k8s volume

    volume是k8s数据卷,常见的数据卷有4种类型,即EmptyDir,HostDir,NFS,Secret Em...

  • 4. docker存储卷

    docker存储卷 本文基于马哥的docker和k8s视频总结, 在此致谢马哥. 分层构建, 联合挂载 绑定挂载卷...

  • K8S环境中NAS卷添加noresvport方法

    通过K8S使用NAS卷,请区分以下场景: 静态存储卷: 使用阿里云ACK,PV、PVC方式,nfs驱动; 使用阿里...

  • Kubernetes 学习笔记(七)--- K8S存储卷、Con

    目录 存储卷是属于Pod,不属于容器。但是可以在容器中去挂载存储卷来使用。 K8S上可用的存储卷类型: empty...

  • mac k8s挂载自带的nfs服务

    版本k8s版本:1.19.3macos版本:10.15.2目标:使用StorageClass资源自动创建pv挂载卷...

  • replication controller

    rc 副本控制器,在k8s中,确保k8s的高可用性,确保任何时间都有pod在k8s中运行。特性支持滚动升级和升级回...

  • 自从上了K8S,项目更新都不带停机的!

    其实K8S中还有一些高级特性也很值得学习,比如弹性扩缩应用、滚动更新、配置管理、存储卷、网关路由等。今天我们就来了...

  • 手动创建k8s local-pv

    k8s 使用local-pv 基本概念 kubernetes从1.10版本开始支持local volume(本地卷...

网友评论

      本文标题:k8s 中的卷

      本文链接:https://www.haomeiwen.com/subject/xqsuudtx.html