【k8s 系列】k8s 学习二十一,k8s 中的卷

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 前面的文章我们分享了 pod ,RC,RS,DaemonSet,CJ,Service 等各种资源

【k8s 系列】k8s 学习二十一,k8s 中的卷

前面的文章我们分享了 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 里面的卷,也并不是每一个容器都要使用,这些都是可以按照自己的需求进行配置的

看图说话:

image.png

一个 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.png

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

kubectl logs -f podName containerName

image.png

查看 query-uuid 容器的日志

image.png

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

gitRepo

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

简单来说就是:

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

image.png

  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.png

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

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

欢迎点赞,关注,收藏

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

image.png

好了,本次就到这里

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

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

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
4月前
|
Kubernetes Cloud Native 容器
完全免费的K8S学习平台:在线集群环境助力你的云原生之路!
完全免费的K8S学习平台:在线集群环境助力你的云原生之路!
542 1
|
4月前
|
Kubernetes 容器
k8s学习-CKS真题-日志审计 log audit
k8s学习-CKS真题-日志审计 log audit
145 0
|
4月前
|
Kubernetes 应用服务中间件 Docker
Kubernetes学习-集群搭建篇(二) 部署Node服务,启动JNI网络插件
Kubernetes学习-集群搭建篇(二) 部署Node服务,启动JNI网络插件
|
4月前
|
Kubernetes 安全 API
Kubernetes学习-集群搭建篇(三) Node配置完善和API概述
Kubernetes学习-集群搭建篇(三) Node配置完善和API概述
Kubernetes学习-集群搭建篇(三) Node配置完善和API概述
|
4月前
|
存储 Kubernetes API
Kubernetes学习-核心概念篇(三) 核心概念和专业术语
Kubernetes学习-核心概念篇(三) 核心概念和专业术语
Kubernetes学习-核心概念篇(三) 核心概念和专业术语
|
3月前
|
存储 Kubernetes Cloud Native
云原生 - Kubernetes基础知识学习
云原生 - Kubernetes基础知识学习
45 0
|
4月前
|
Kubernetes API 调度
|
4月前
|
Kubernetes API 调度
Kubernetes学习-核心概念篇(二) 集群架构与组件
Kubernetes学习-核心概念篇(二) 集群架构与组件
|
4月前
|
Kubernetes 调度 虚拟化
Kubernetes学习-核心概念篇(一) 初识Kubernetes
Kubernetes学习-核心概念篇(一) 初识Kubernetes
|
4月前
|
Kubernetes 应用服务中间件 nginx
Kubernetes学习-深入Pod篇(一) 创建Pod,Pod配置文件详解
Kubernetes学习-深入Pod篇(一) 创建Pod,Pod配置文件详解