首页 > 其他分享 >k8s 中的卷

k8s 中的卷

时间:2023-07-12 21:34:42浏览次数:60  
标签:容器 uuid echo gitRepo query pod 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 里面的卷,也并不是每一个容器都要使用,这些都是可以按照自己的需求进行配置的

看图说话:

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

image-20220123212842696

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

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

欢迎点赞,关注,收藏

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

好了,本次就到这里

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

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

标签:容器,uuid,echo,gitRepo,query,pod,k8s
From: https://www.cnblogs.com/xiaomotong/p/17548908.html

相关文章

  • Jenkins远程管理K8S集群实现自动POD部署
    Jenkins远程管理K8S集群实现自动POD部署大致思路修改.kube/config文件,增加新集群的context建立隧道将集群控制端口映射到Jenkins服务器本地端口测试jenkin切换到新context是否能控制该集群新集群配置对接Harbor仓库测试helm部署podJenkins测试配置流水线自动发版1.......
  • k8s集群node NotReady处理流程-->kubelet状态error,并伴有报错:kubelet.service has mor
    k8s集群nodeNotReady处理流程-->kubelet状态error//20230712集群有节点NotReadykubelet状态error,并伴有报错:kubelet.servicehasmorethanoneExecStart=setting,whichisonlyallowedforType=oneshotservices.Refusing在此记录一下解决流程解决流程问题定位:使......
  • DHorse v1.2.1 发布,基于k8s的发布平台
    综述DHorse是一个简单易用、以应用为中心的云原生DevOps系统,具有持续集成、持续部署、微服务治理等功能,无需安装依赖Docker、Maven、Node等环境即可发布Java、Vue、React应用,主要特点:部署简单、操作简洁、功能快速。优化内容优化jvm指标收集时dhorse接口地址错误的问题;首次配......
  • K8s概念
    k8s特点自动修复弹性伸缩自动部署和回滚服务发现和负载均衡pod的IP地址会在创建或销毁后变化,故IP地址不固定。就需要一个统一的出口暴露到外部进行访问。service作为统一的出入口,承接外部和内部pod之间的访问。提供服务发现及负载均衡到内部pod的功能......
  • 记一次openSUSE Tumbleweed下安装 k8s
    因为没有K8s基础的坑kubeadmkubelet最好指定版本安装,因为kubelet的版本需要小于等于kubeadm的版本,否则就会报错。运行kubeadminit,不用手动systemctlstartkubelet,因为会报错不满足某某条件。openSUSE的官方的kubernetes-kubelet包安装后,/usr/bin/kubelet只是一个shell脚......
  • Hadoop on k8s 快速部署进阶精简篇
    目录一、概述二、快速部署步骤如下1)安装git2)部署mysql3)创建存储目录(所有节点)4)下载hadoop-on-k8s部署包5)修改hadoopconfigmap6)修改hiveconfigmap(MySQL配置)7)安装helm8)开始部署9)测试验证一、概述前面一篇文章已经很详细的介绍了Hadooponk8s部署了,这里主要针对部署时可......
  • K8S简介
    Kubernetes(K8S)是什么它是一个为容器化应用提供集群部署和管理的开源工具,由GoogleDocs开发。kubernetes这个名字源于希腊语,意为“舵手”或“飞行员”。k8s这个缩写就是因为k和s之间有8个字符的关系。GoogleDocs在2014年开源了Kubernetes项目。主要特性高可用,不宕机,自动......
  • Hadoop on k8s 编排部署进阶篇
    目录一、概述二、k8s部署部署三、开始编排部署Hadoop1)构建镜像Dockerfile2)values.yaml文件配置3)hadoopconfigmapyaml4)hiveconfigmapyaml5)开始安装6)测试验证一、概述Hadoop是一个开源的分布式计算框架,用于处理大规模数据集的存储和处理。它使用了Hadoop分布式文件系统......
  • 安装k8s-1.27.0(二)
    安装软件包[root@k8smaster2~]#yuminstall-ykubelet-1.27.0kubeadm-1.27.0kubectl-1.27.0生成初始化配置文件[root@k8smaster1~]#kubeadmconfigprintinit-defaults>kubeadm.yaml修改初始化文件添加ipvs启动插件apiVersion:kubeproxy.config.k8s.io/v1alpha1kind:......
  • k8s 深入篇———— Job与CronJob[十]
    开篇简要演练一下job和cronjob正文实际上,它们主要编排的对象,都是“在线业务”,即:LongRunningTask(长作业)。比如,我在前面举例时常用的Nginx、Tomcat,以及MySQL等等。这些应用一旦运行起来,除非出错或者停止,它的容器进程会一直保持在Running状态。但是,有一类作业显然不满足......