关于挂载存储的这个小细节,值得你关注一下

c39192367f7a7d3fb0ec0a00ec3b60f9.gif

作者 | 江小南

来源 | 江小南和他的小伙伴们

引言

前两天,公司有个同事跑过来问我一件事:我在制作镜像的时候明明把文件已经放到镜像里面去了,为什么kubernetes部署应用的时候文件没有了?听完这话,我看了看Dockerfile是这么写的(不是原文内容,但是意思一样)。

FROM nginx
MAINTAINER jiangxiaonan<xxc113206@163.com>
ENV MYPATH /usr/local
ADD test.tar /nfs/data/01
WORKDIR $MYPATH
EXPOSE 80
CMD /bin/bash

通过Dockerfile可以看出,它是把本地的test.tar包复制并解压到了容器的/nfs/data/01。确实写的没毛病,本地也有相应的tar包。

[root@k8s-master test]# pwd
/root/test
[root@k8s-master test]# ll
total 28
-rw-r--r-- 1 root root   587 Jul  9 18:06 deployment.yaml
-rw-r--r-- 1 root root   142 Jul  9 17:41 Dockerfile
-rw-r--r-- 1 root root     0 Jul  9 16:25 file1.txt
-rw-r--r-- 1 root root     0 Jul  9 16:25 file2.txt
-rw-r--r-- 1 root root   184 Jul  9 16:54 pvc.yaml
-rw-r--r-- 1 root root   212 Jul  9 16:53 pv.yaml
-rw-r--r-- 1 root root 10240 Jul  9 16:26 test.tar
[root@k8s-master test]#

那问题出在了哪里呢?看了一眼yaml,我说你把挂载去掉吧。他去掉挂载重新测试,文件有了。给他讲解了一番,同事连连拍手叫好。

为什么挂载了存储,文件就没有了,而去掉挂载文件又有了?今天就将关于挂载存储的这个小细节讲解给大家。

环境准备

首先我们需要有kubernetes集群。

[root@k8s-master ~]# kubectl get node
NAME          STATUS   ROLES                  AGE     VERSION
k8s-master    Ready    control-plane,master   3m52s   v1.20.9
k8s-worker1   Ready    <none>                 2m8s    v1.20.9
k8s-worker2   Ready    <none>                 2m3s    v1.20.9
[root@k8s-master ~]#

并且安装了存储,我这里使用NFS文件系统。

[root@k8s-master ~]# exportfs
/nfs/data      <world>
[root@k8s-master ~]#

使用上面的Dockerfile制作好镜像。(有Harbor仓库的话也可以使用,如果没有,需要在每个节点制作镜像,防止拉取镜像失败的情况。)

docker build -f ./Dockerfile -t mynginx:1.0 .

由于我们使用的是PV&PVC,所以这里也进行了创建。

# pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:name: pv01-10m
spec:capacity:storage: 1GiaccessModes:- ReadWriteManystorageClassName: nfsnfs:path: /nfs/data/01server: 172.31.0.2
# pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: nginx-pvc
spec:accessModes:- ReadWriteManyresources:requests:storage: 500MistorageClassName: nfs
[root@k8s-master test]# kubectl get pv,pvc
NAME                        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM               STORAGECLASS   REASON   AGE
persistentvolume/pv01-10m   1Gi        RWX            Retain           Bound    default/nginx-pvc   nfs                     13sNAME                              STATUS   VOLUME     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
persistentvolumeclaim/nginx-pvc   Bound    pv01-10m   1Gi        RWX            nfs            7s
[root@k8s-master test]#

测试

  1. 有挂载的情况

# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: nginx-deployname: nginx-deploy
spec:replicas: 2selector:matchLabels:app: nginx-deploytemplate:metadata:labels:app: nginx-deployspec:containers:- image: mynginx:1.0imagePullPolicy: Nevercommand: [ "/bin/bash", "-ce", "tail -f /dev/null" ]name: mynginxvolumeMounts:- name: testmountPath: /nfs/data/01volumes:- name: testpersistentVolumeClaim:claimName: nginx-pvc

通过yaml可以看出,将容器的/nfs/data/01目录进行了挂载。

[root@k8s-master test]# kubectl apply -f deployment.yaml 
deployment.apps/nginx-deploy created
[root@k8s-master test]# kubectl get pod
NAME                            READY   STATUS    RESTARTS   AGE
nginx-deploy-86477c464b-x5jkd   1/1     Running   0          4s
nginx-deploy-86477c464b-xzqsx   1/1     Running   0          4s
[root@k8s-master test]#
# 成功部署了2个pod,我们进入到pod中一探究竟。
[root@k8s-master test]# kubectl exec -it nginx-deploy-86477c464b-x5jkd -c mynginx -- /bin/bash
root@nginx-deploy-86477c464b-x5jkd:/usr/local# cd /nfs/data/01
root@nginx-deploy-86477c464b-x5jkd:/nfs/data/01# ls
root@nginx-deploy-86477c464b-x5jkd:/nfs/data/01#

按照Dockerfile的编写,/nfs/data/01下应该会有file1.txt和file2.txt两个文件才对,现在并没有。

why?

  1. 没有挂载的情况。

修改我们的yaml,将挂载去掉。

# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: nginx-deployname: nginx-deploy
spec:replicas: 2selector:matchLabels:app: nginx-deploytemplate:metadata:labels:app: nginx-deployspec:containers:- image: mynginx:1.0imagePullPolicy: Nevercommand: [ "/bin/bash", "-ce", "tail -f /dev/null" ]name: mynginx
[root@k8s-master test]# kubectl apply -f deployment.yaml 
deployment.apps/nginx-deploy created
[root@k8s-master test]# kubectl get pod
NAME                            READY   STATUS        RESTARTS   AGE
nginx-deploy-67cd67ff86-dbdbp   1/1     Running       0          5s
nginx-deploy-67cd67ff86-w4wgx   1/1     Running       0          5s
[root@k8s-master test]#
# 成功部署了2个pod,我们进入到pod中一探究竟。
[root@k8s-master test]# kubectl exec -it nginx-deploy-67cd67ff86-dbdbp -c mynginx -- /bin/bash
root@nginx-deploy-67cd67ff86-dbdbp:/usr/local# cd /nfs/data/01
root@nginx-deploy-67cd67ff86-dbdbp:/nfs/data/01# ls
file1.txt  file2.txt
root@nginx-deploy-67cd67ff86-dbdbp:/nfs/data/01#

确实在没有挂载的情况下有了file1.txt和file2.txt。

探究

为了搞清楚这个问题,我们去NFS文件系统中寻找答案。

[root@k8s-master 01]# pwd
/nfs/data/01
[root@k8s-master 01]# ls
[root@k8s-master 01]#

发现文件系统的/nfs/data/01也是空的。这时我们创建文件nfs.txt。

[root@k8s-master 01]# touch nfs.txt
[root@k8s-master 01]# ls
nfs.txt
[root@k8s-master 01]#

然后使用有挂载的deployment.yaml进行测试。

[root@k8s-master test]# kubectl get pod
NAME                            READY   STATUS        RESTARTS   AGE
nginx-deploy-86477c464b-5mhw4   1/1     Running       0          23s
nginx-deploy-86477c464b-wxc8q   1/1     Running       0          21s
[root@k8s-master test]#
# 成功部署了2个pod,我们进入到pod中一探究竟。
[root@k8s-master test]# kubectl exec -it nginx-deploy-86477c464b-5mhw4 -c mynginx -- /bin/bash
root@nginx-deploy-86477c464b-5mhw4:/usr/local# cd /nfs/data/01
root@nginx-deploy-86477c464b-5mhw4:/nfs/data/01# ls
nfs.txt
root@nginx-deploy-86477c464b-5mhw4:/nfs/data/01#

发现我们在NFS中创建的文件被同步到了pod中。而file1.txt和file2.txt并没有出现。

分析总结

我们知道NFS作为持久化的存储,会和容器内的挂载目录进行同步。NFS本身存在的文件会在pod中显示,镜像本身存在的文件却不能显示。

一个容器挂载了存储,那么这个目录空间并不属于容器,而是属于存储,容器的目录相当于是对存储空间的引用

搞清楚了这一点,对于同事的问题就很好解释了,file1.txt和file2.txt存在于容器中,而不存在于存储中,挂载部署的情况下当然是看不到的了,除非这两个文件先在存储中。

456b65ce7fbeed2259367c3220e3d780.gif

往期推荐

Redis 内存优化神技,小内存保存大数据

使用 nginx 轻松管理 kubernetes 资源文件

Redis 内存满了怎么办?这样置才正确!

实战 Kubectl 创建 Deployment 部署应用

78260202f66218ef63a4f3efda2fd846.gif

点分享

1775ff47ab2cea941af4b4d591ae9f3e.gif

点收藏

a1b56d083ea20c30b75b06f16302448a.gif

点点赞

102ac494775ea2e54d21bf116e394eb8.gif

点在看

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/511380.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PolarDB 并行查询的前世今生

简介&#xff1a;本文会深入介绍PolarDB MySQL在并行查询这一企业级查询加速特性上做的技术探索、形态演进和相关组件的实现原理&#xff0c;所涉及功能随PolarDB MySQL 8.0.2版本上线。 作者 | 遥凌 来源 | 阿里技术公众号 本文会深入介绍PolarDB MySQL在并行查询这一企业级查…

上海音乐学院计算机基础,上海音乐学院

2018年(第11届)中国大学生计算机设计大赛计算机音乐创作类决赛于8月26日—30日在浙江音乐学院举行&#xff0c;上海音乐学院音乐工程系大二学生蔡岳均作品《埙钹革》、大四学生赵子仪作品《踏风》(指导老师均为刘灏副教授)在决赛中分别获得计算机音乐创作专业组二、三等奖。中国…

从技术到管理,程序员如何实现螺旋上升?

作者 | 李昊 出品 | 《新程序员》编辑部从开发者到技术管理者应该如何提升能力&#xff1f;在李昊看来&#xff0c;开发和管理之间的“鸿沟”并非很难跨越&#xff0c;他将从“深入理解基层技术管理岗位角色、纠偏对技术管理者的认识误区&#xff0c;以及通过日常执行层真正…

80%的软件环境管理问题,根因都在这里

简介&#xff1a;80%的软件环境管理问题&#xff0c;根因都在这里&#xff0c;云效云原生应用管理平台AppStack正是基于OAM的应用交付平台&#xff0c;企业在云效AppStack&#xff0c;可以通过应用编排、占位符、变量等声明式定义&#xff0c;实现一套编排多环境差异化部署&…

开发之痛:稳定的测试环境,怎么就那么难

简介&#xff1a;开发之痛&#xff1a;稳定的测试环境&#xff0c;怎么就那么难。对于生产环境&#xff0c;准确、稳定最重要&#xff0c;我们推荐以应用为中心的基于OAM和IaC的实践方式&#xff1b;对于测试环境&#xff0c;隔离、低成本和稳定的依赖是最重要的&#xff0c;我…

天腾动力携Motinova 和 Welling E-bike电驱新品亮相EUROBIKE 2022

【德国法兰克福】2022年7月13日&#xff0c;欧洲国际自行车贸易博览会&#xff08;EUROBIKE 2022&#xff09;在法兰克福开展迎客。作为欧洲三大自行车展之一&#xff0c;EUROBIKE 2022被誉为行业潮流的风向标&#xff0c;吸引着品牌商、贸易商、采购商以及众多自行车爱好者的目…

阿里云云原生一体化数仓正式发布 助力企业数据驱动业务创新

简介&#xff1a;云原生一体化数仓是集阿里云大数据产品MaxCompute、DataWorks、Hologres三种产品能力于一体的一站式大数据处理平台。核心是3个一体化和全链路数据治理能力&#xff0c;包括离线实时一体、湖仓一体、分析服务一体、全链路数据治理。 2月16日&#xff0c;阿里云…

一文读懂云原生一体化数仓

简介&#xff1a;阿里云云原生一体化数仓产品技术深度解读。 本文大纲 一、云原生一体化数仓的发布背景 1 市场情况 2 挑战和痛点 二、云原生一体化数仓是什么 三、云原生一体化数仓的技术理念 1 离线实时一体 2 湖仓一体 3 分析服务一体 4 全链路数据治理 一…

西安交大计算机考研分数线2020院线,西安交通大学2020考研复试分数线已公布

2020西安交通大学考研复试分数线已公布&#xff01;点击查看>>34所自划线院校2020考研复试分数线。2020考研国家线已公布&#xff0c;当前2020考研考生需全力准备考研复试/调剂工作>>考研复试学习指南&#xff0c;让你不再盲目备战​西安交通大学公布2020年硕士研究…

Graphcore 联合百度飞桨提交 MLPerf Training 2.0,IPU 性能再下一城

作者 | 宋慧 出品 | CSDN 云计算&AI 科技大本营 为 AI 与机器学习提供更高性能的支持&#xff0c;是芯片厂商的竞争特点。最近&#xff0c;AI 芯片厂商 Graphcore 联合国内知名的深度学习平台百度飞桨&#xff0c;共同提交了 MLCommons 的 AI 基准评测 MLPerf Training 2.…

创新推出 | Serverless 调试大杀器:端云联调

简介&#xff1a;端云联调功能&#xff0c;不仅提升了 Serverless 应用的开发者的开发效率并且带来了良好的开发体验&#xff1b;让本地开发环境突破网络限制&#xff0c;真正实现和云端环境融为一体&#xff0c;一文带你了解&#xff0c;端云联调功能是如何解决应用调试难题的…

密立根油滴实验的计算机仿真实验报告,H-D光谱实验的计算机仿真

对H-D光谱实验进行计算机仿真,由计算机控制的摄谱仪进行氢氘光谱摄谱,对谱线寻峰,计算出里德伯常量、氢氘质量比和同位素位移,并画出了氢原子的能谱图。维普资讯 http://www.wendangwang.com第2 7卷第9期物理实验PH Y SI CS EXPERI EN TA T 1 N M 0Vo . 7 NO 9 12 .Se p., 0 20…

独家交付秘籍之招式拆解(第一回)

简介&#xff1a;上一回说到经历种种交付难题的王小锤一行人&#xff0c;意外发现一本交付秘籍&#xff0c;打开了新世界。本次他们带着具体交付场景来到阿里云&#xff0c;与交付宗师阿莫探讨秘籍中的招式以及招式背后的秘密。 作者&#xff1a;吕莫、新钰 前情介绍 大家好…

白鲸开源再获数千万元融资,完善 DataOps 开源生态,打造下一代云原生智能DataOps平台

Apache DolphinScheduler是首个由国人主导并贡献到Apache的大数据工作流调度领域的顶级项目。作为已经十分流行的开源调度项目&#xff0c;已有48位Committer和21位PMC&#xff0c;360 Contributors 积极参与到社区的共建中。自开源以来&#xff0c;Apache DolphinScheduler稳步…

国内唯一,阿里云容器服务进入 Forrester 领导者象限

简介&#xff1a;近日&#xff0c;国际权威咨询机构 Forrester 发布《 The Forrester WaveTM: Public Cloud Container Platforms, Q1 2022 》报告&#xff0c;报告显示&#xff0c;阿里云进入全球公共云容器平台"领导者"象限&#xff0c;这是中国云计算厂商首次进入…

K8s Ingress Provider 为什么选择 MSE 云原生网关?

简介&#xff1a;在虚拟化时期的微服务架构下&#xff0c;业务通常采用流量网关 微服务网关的两层架构&#xff0c;流量网关负责南北向流量调度和安全防护&#xff0c;微服务网关负责东西向流量调度和服务治理&#xff0c;而在容器和 K8s 主导的云原生时代&#xff0c;Ingress…

在 Kubernetes 上执行 GitHub Actions 流水线作业

作者 | Addo Zhang来源 | 云原生指北GitHub Actions 是一个功能强大、“免费” 的 CI&#xff08;持续集成&#xff09;工具。与之前介绍的 Tekton 类似&#xff0c;GitHub Actions 的核心也是 Pipeline as Code 也就是所谓的流水线即代码。二者不同的是&#xff0c;GitHub Act…

将信息系学生的计算机文化学,计算机等级考试(国家)-关系数据库操作语言sql(四)...

计算机等级考试(国家)-关系数据库操作语言sql(四) (8页)本资源提供全文预览&#xff0c;点击全文预览即可全文预览,如果喜欢文档就下载吧&#xff0c;查找使用更方便哦&#xff01;10.90 积分关系数据关系数据库库操作操作语语言言SQL(四四)设计题设计题 在SQL Server 2000中&a…

系统困境与软件复杂度,为什么我们的系统会如此复杂

简介&#xff1a;读 A Philosophy of Software Design 有感&#xff0c;软件设计与架构复杂度&#xff0c;你是战术龙卷风吗&#xff1f; 作者 | 聂晓龙&#xff08;率鸽&#xff09; 来源 | 阿里技术公众号 读 A Philosophy of Software Design 有感&#xff0c;软件设计与架…

节省 58% IT 成本,调用函数计算超过 30 亿次,石墨文档的 Serverless 实践

简介&#xff1a;石墨文档使用函数计算搭建文档实时编辑服务&#xff0c;由函数计算的智能调度系统自动分配执行环境&#xff0c;处理多用户同时编写文档带来的峰值负载&#xff0c;函数计算的动态扩缩容能力保障应用的可靠运行。 作者 | 金中茜 对石墨文档来说&#xff0c;“…