前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >k8s 中的卷

k8s 中的卷

作者头像
阿兵云原生
发布2023-09-01 08:43:44
1430
发布2023-09-01 08:43:44
举报
文章被收录于专栏:golang云原生new

前面的文章我们分享了 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

代码语言:javascript
复制
#~/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

代码语言:javascript
复制
FROM ubuntu:latest
ADD echo_uuid.sh /bin/echo_uuid.sh
ENTRYPOINT /bin/echo_uuid.sh

制作镜像 echo_uuid

此处的 DockerHub 的账号,可以修改成读者你自己的,记得需要在环境中登录 docker 账号

代码语言:javascript
复制
docker build -t xiaomotong888/echo_uuid .
docker push xiaomotong888/echo_uuid

query_uuid.sh

代码语言:javascript
复制
#~/bin/bash

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

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

Dockerfile

代码语言:javascript
复制
FROM ubuntu:latest
ADD query_uuid.sh /bin/query_uuid.sh
ENTRYPOINT /bin/query_uuid.sh

制作镜像 query_uuid

代码语言:javascript
复制
docker build -t xiaomotong888/query_uuid .
docker push xiaomotong888/query_uuid

编写 yaml 文件:emptyDir_test.yaml

代码语言:javascript
复制
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 里面有多个容器的时候,查看日志的方式是

代码语言:javascript
复制
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 仓库我们可以简单说一下:

代码语言:javascript
复制
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-20220123212842696

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-07-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 阿兵云原生 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 举个例子
  • 卷是什么呢?
  • 卷的多种类型
  • emptyDir ,gitRepo
    • emptyDir
      • 小案例
        • gitRepo
        相关产品与服务
        容器服务
        腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档