范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

我就想存个文件,怎么这么麻烦?k8sPVPVCStorageClass的关系

  Docker
  当我们使用 Docker 时,设置数据卷(Volume)还是比较简单的,只需要在容器映射指定卷的路径,然后在容器中使用该路径即可。
  比如这种:  # tomcat   tomcat01:     hostname: tomcat01     restart: always     image: jdk-tomcat:v8     container_name: tomcat8-1     links:       -  mysql:mysql     volumes:       - /home/soft/docker/tomcat/webapps:/usr/local/apache-tomcat-8.5.39/webapps       - /home/soft/docker/tomcat/logs:/usr/local/apache-tomcat-8.5.39/logs       - /etc/localtime:/etc/localtime     environment:       JAVA_OPTS: -Dspring.profiles.active=prod       TZ: Asia/Shanghai       LANG: C.UTF-8       LC_ALL: zh_CN.UTF-8     env_file:       - /home/soft/docker/env/tomcat.env
  为什么要设置 Volume? 当然是因为我们要持久化数据,要把数据存储到硬盘上。  k8s
  到了 k8s 这儿,你会发现事情没那么简单了,涌现出了一堆概念:  Pv  Pvc  StorageClass  Provisioner  ...
  先不管这些复杂的概念,我只想存个文件,有没有简单的方式?
  有,我们先回顾下基本概念。
  我们知道,Container 中的文件在磁盘上是临时存放的,当容器崩溃时文件丢失。kubelet 会重新启动容器, 但容器会以干净的状态重启。所以我们要使用 Volume 来持久化数据。  "
  Docker 也有 卷(Volume) 的概念,但对它只有少量且松散的管理。 Docker 卷是磁盘上或者另外一个容器内的一个目录 Docker 提供卷驱动程序,但是其功能非常有限。
  "   "
  Kubernetes 支持很多类型的卷。 Pod 可以同时使用任意数目的卷类型。
  "   "
  临时卷类型的生命周期与 Pod 相同,但持久卷可以比 Pod 的存活期长。 当 Pod 不再存在时,Kubernetes 也会销毁临时卷;不过 Kubernetes 不会销毁 持久卷。对于给定 Pod 中任何类型的卷,在容器重启期间数据都不会丢失。
  "   "
  卷的核心是一个目录,其中可能存有数据,Pod 中的容器可以访问该目录中的数据。 所采用的特定的卷类型将决定该目录如何形成的、使用何种介质保存数据以及目录中存放 的内容。
  "   "
  使用卷时,在 .spec.volumes 字段中设置为 Pod 提供的卷,并在 .spec.containers[*].volumeMounts 字段中声明卷在容器中的挂载位置。 各个卷则挂载在镜像内的指定路径上。 卷不能挂载到其他卷之上,也不能与其他卷有硬链接。Pod 配置中的每个容器必须独立指定各个卷的挂载位置。
  "
  通过上面的概念我们知道 Volume 有不同的类型,有临时的,也有持久的,那么我们先说说简单的,即解决"我只想存个文件,有没有简单的方式"的需求。  hostPath
  hostPath 卷能将主机节点文件系统上的文件或目录挂载到你的 Pod 中。看个示例:  apiVersion: v1 kind: Pod metadata:   name: test-webserver spec:   containers:   - name: test-webserver     image: k8s.gcr.io/test-webserver:latest     volumeMounts:     - mountPath: /var/local/aaa       name: mydir     - mountPath: /var/local/aaa/1.txt       name: myfile   volumes:   - name: mydir     hostPath:       # 确保文件所在目录成功创建。       path: /var/local/aaa       type: DirectoryOrCreate   - name: myfile     hostPath:       path: /var/local/aaa/1.txt       type: FileOrCreate
  通过 hostPath 能够简单解决文件在宿主机上存储的问题。
  不过需要注意的是:
  HostPath 卷存在许多安全风险,最佳做法是尽可能避免使用 HostPath。 当必须使用 HostPath 卷时,它的范围应仅限于所需的文件或目录,并以只读方式挂载。
  使用 hostPath 还有一个局限性就是,我们的 Pod 不能随便漂移,需要固定到一个节点上,因为一旦漂移到其他节点上去了宿主机上面就没有对应的数据了,所以我们在使用 hostPath 的时候都会搭配 nodeSelector 来进行使用。  emptyDir
  emptyDir 也是比较常见的一种存储类型。
  上面的 hostPath 显示的定义了宿主机的目录。emptyDir 类似隐式的指定。
  Kubernetes 会在宿主机上创建一个临时目录,这个目录将来就会被绑定挂载到容器所声明的 Volume 目录上。而 Pod 中的容器,使用的是 volumeMounts 字段来声明自己要挂载哪个 Volume,并通过 mountPath 字段来定义容器内的 Volume 目录  "
  当 Pod 分派到某个 Node 上时,emptyDir 卷会被创建,并且在 Pod 在该节点上运行期间,卷一直存在。 就像其名称表示的那样,卷最初是空的。 尽管 Pod 中的容器挂载 emptyDir 卷的路径可能相同也可能不同,这些容器都可以读写 emptyDir 卷中相同的文件。 当 Pod 因为某些原因被从节点上删除时,emptyDir 卷中的数据也会被永久删除。
  "   apiVersion: v1 kind: Pod metadata:   name: test-pd spec:   containers:   - image: k8s.gcr.io/test-webserver     name: test-container     volumeMounts:     - mountPath: /cache       name: cache-volume   volumes:   - name: cache-volume     emptyDir: {}
  如果执行  kubectl describe  命令查看 pod 信息的话,可以验证前面我们说的内容: "EmptyDir (a temporary directory that shares a pod"s lifetime)" ... Containers:   nginx:     Container ID:   docker://07b4f89248791c2aa47787e3da3cc94b48576cd173018356a6ec8db2b6041343     Image:          nginx:1.8     ...     Environment:         Mounts:       /usr/share/nginx/html from nginx-vol (rw) ... Volumes:   nginx-vol:     Type:    EmptyDir (a temporary directory that shares a pod"s lifetime) PV 和 PVCPV(PersistentVolume): 持久化卷  PVC(PersistentVolumeClaim): 持久化卷声明
  PV 和 PVC 的关系就像 java 中接口和实现的关系类似。
  PVC 是用户存储的一种声明,PVC 和 Pod 比较类似,Pod 消耗的是节点,PVC 消耗的是 PV 资源,Pod 可以请求 CPU 和内存,而 PVC 可以请求特定的存储空间和访问模式。对于真正使用存储的用户不需要关心底层的存储实现细节,只需要直接使用 PVC 即可。
  PV 是对底层共享存储的一种抽象,由管理员进行创建和配置,它和具体的底层的共享存储技术的实现方式有关,比如 Ceph、GlusterFS、NFS、hostPath 等,都是通过插件机制完成与共享存储的对接。
  我们来看一个例子:
  比如,运维人员可以定义这样一个 NFS 类型的 PV  apiVersion: v1 kind: PersistentVolume metadata:   name: nfs spec:   storageClassName: manual   capacity:     storage: 1Gi   accessModes:     - ReadWriteMany   nfs:     server: 10.244.1.4     path: "/"
  PVC 描述的,则是 Pod 所希望使用的持久化存储的属性。比如,Volume 存储的大小、可读写权限等等。   apiVersion: v1 kind: PersistentVolumeClaim metadata:   name: nfs spec:   accessModes:     - ReadWriteMany   storageClassName: manual   resources:     requests:       storage: 1Gi
  用户创建的 PVC 要真正被容器使用起来,就必须先和某个符合条件的 PV 进行绑定。  第一个条件是 PV 和 PVC 的 spec 字段。比如,PV 的存储(storage)大小,就必须满足 PVC 的要求。  第二个条件,则是 PV 和 PVC 的 storageClassName 字段必须一样
  在成功地将 PVC 和 PV 进行绑定之后,Pod 就能够像使用 hostPath 等常规类型的 Volume 一样,在自己的 YAML 文件里声明使用这个 PVC 了  apiVersion: v1 kind: Pod metadata:   labels:     role: web-frontend spec:   containers:   - name: web     image: nginx     ports:       - name: web         containerPort: 80     volumeMounts:         - name: nfs           mountPath: "/usr/share/nginx/html"   volumes:   - name: nfs     persistentVolumeClaim:       claimName: nfs
  我们前面使用的 hostPath 和 emptyDir 类型的 Volume 并不具备"持久化"特征,既有可能被 kubelet 清理掉,也不能被"迁移"到其他节点上。所以,大多数情况下,持久化 Volume 的实现,往往依赖于一个远程存储服务,比如:远程文件存储(比如,NFS、GlusterFS)、远程块存储(比如,公有云提供的远程磁盘)等等。  StorageClass
  前面我们人工管理 PV 的方式就叫作 Static Provisioning。
  一个大规模的 Kubernetes 集群里很可能有成千上万个 PVC,这就意味着运维人员必须得事先创建出成千上万个 PV。更麻烦的是,随着新的 PVC 不断被提交,运维人员就不得不继续添加新的、能满足条件的 PV,否则新的 Pod 就会因为 PVC 绑定不到 PV 而失败。在实际操作中,这几乎没办法靠人工做到。所以,Kubernetes 为我们提供了一套可以自动创建 PV 的机制,即:Dynamic Provisioning。
  Dynamic Provisioning 机制工作的核心,在于一个名叫 StorageClass 的 API 对象。而 StorageClass 对象的作用,其实就是创建 PV 的模板。
  具体地说,StorageClass 对象会定义如下两个部分内容:  第一,PV 的属性。比如,存储类型、Volume 的大小等等。  第二,创建这种 PV 需要用到的存储插件。比如,Ceph 等等。
  有了这样两个信息之后,Kubernetes 就能够根据用户提交的 PVC,找到一个对应的 StorageClass 了。然后,Kubernetes 就会调用该 StorageClass 声明的存储插件,创建出需要的 PV。
  在下面的例子中,PV 是被自动创建出来的。  apiVersion: v1 kind: PersistentVolumeClaim metadata:   name: claim1 spec:   accessModes:     - ReadWriteOnce # 指定所使用的存储类,此存储类将会自动创建符合要求的 PV  storageClassName: fast  resources:     requests:       storage: 30Gi apiVersion: storage.k8s.io/v1 kind: StorageClass metadata:   name: fast provisioner: kubernetes.io/gce-pd parameters:   type: pd-ssd
  StorageClass 的作用,则是充当 PV 的模板。并且,只有同属于一个 StorageClass 的 PV 和 PVC,才可以绑定在一起。StorageClass 的另一个重要作用,是指定 PV 的 Provisioner(存储插件)。这时候,如果你的存储插件支持 Dynamic Provisioning 的话,Kubernetes 就可以自动为你创建 PV 了。  Local PV
  Kubernetes 依靠 PV、PVC 实现了一个新的特性,这个特性的名字叫作:Local Persistent Volume,也就是 Local PV。
  Local PV 实现的功能就非常类似于 hostPath 加上 nodeAffinity,比如,一个 Pod 可以声明使用类型为 Local 的 PV,而这个 PV 其实就是一个 hostPath 类型的 Volume。如果这个 hostPath 对应的目录,已经在节点 A 上被事先创建好了,那么,我只需要再给这个 Pod 加上一个 nodeAffinity=nodeA,不就可以使用这个 Volume 了吗?理论上确实是可行的,但是事实上,我们绝不应该把一个宿主机上的目录当作 PV 来使用,因为本地目录的存储行为是完全不可控,它所在的磁盘随时都可能被应用写满,甚至造成整个宿主机宕机。所以, 一般来说 Local PV 对应的存储介质是一块额外挂载在宿主机的磁盘或者块设备,我们可以认为就是"一个 PV 一块盘" 。
  Local PV 和普通的 PV 有一个很大的不同在于 Local PV 可以保证 Pod 始终能够被正确地调度到它所请求的 Local PV 所在的节点上面,对于普通的 PV 来说,Kubernetes 都是先调度 Pod 到某个节点上,然后再持久化节点上的 Volume 目录,进而完成 Volume 目录与容器的绑定挂载,但是对于 Local PV 来说,节点上可供使用的磁盘必须是提前准备好的,因为它们在不同节点上的挂载情况可能完全不同,甚至有的节点可以没这种磁盘,所以,这时候,调度器就必须能够知道所有节点与 Local PV 对应的磁盘的关联关系,然后根据这个信息来调度 Pod,实际上就是在调度的时候考虑 Volume 的分布。
  例子:
  先创建本地磁盘对应的 pv  apiVersion: v1 kind: PersistentVolume metadata:   name: example-pv spec:   capacity:     storage: 5Gi   volumeMode: Filesystem   accessModes:   - ReadWriteOnce   persistentVolumeReclaimPolicy: Delete   storageClassName: local-storage   local:     path: /mnt/disks/vol1    nodeAffinity:     required:       nodeSelectorTerms:       - matchExpressions:         - key: kubernetes.io/hostname           operator: In           values:           - node-1
  其中:  lcal.path 写对应的磁盘路径  必须指定对应的 node , 用 .spec.nodeAffinity 来对应的 node  .spec.volumeMode 可以是 FileSystem(Default)和 Block  确保先运行了 StorageClass (即下面写的文件)
  再写对于的 StorageClass 文件  kind: StorageClass apiVersion: storage.k8s.io/v1 metadata:   name: local-storage provisioner: kubernetes.io/no-provisioner volumeBindingMode: WaitForFirstConsumer
  其中:  provisioner 是 kubernetes.io/no-provisioner , 这是因为 local pv 不支持 Dynamic Provisioning, 所以它没有办法在创建出 pvc 的时候,自动创建对应 pv  volumeBindingMode 是 WaitForFirstConsumer , WaitForFirstConsumer 即延迟绑定 , 这样可以既保证推迟到调度的时候再进行绑定 , 又可以保证调度到指定的 pod 上 , 其实 WaitForFirstConsumer 又 2 种:一种是 WaitForFirstConsumer , 一种是 Immediate , 这里必须用延迟绑定模式。
  再创建一个 pvc  kind: PersistentVolumeClaim apiVersion: v1 metadata:   name: example-local-claim spec:   accessModes:   - ReadWriteOnce   resources:     requests:       storage: 5Gi   storageClassName: local-storage
  这里需要注意的地方就是 storageClassName 要写出我们之前自己创建的 storageClassName 的名字:local-storage
  之后应用这个文件 , 使用命令 kubectl get pvc 可以看到他的状态是 Pending , 这个时候虽然有了匹配的 pv , 但是也不会进行绑定 , 依然在等待。
  之后我们写个 pod 应用这个 pvc  kind: Pod apiVersion: v1 metadata:   name: example-pv-pod spec:   volumes:     - name: example-pv-storage       persistentVolumeClaim:        claimName: example-local-claim   containers:     - name: example-pv-container       image: nginx       ports:         - containerPort: 80           name: "http-server"       volumeMounts:         - mountPath: "/usr/share/nginx/html"           name: example-pv-storage
  这样就部署好了一个 local pv 在 pod 上 , 这样即使 pod 没有了 , 再次重新在这个 node 上创建,写入的文件也能持久化的存储在特定位置。
  如何删除这个 pv 一定要按照流程来 , 要不然会删除失败  删除使用这个 pv 的 pod  从 node 上移除这个磁盘(按照一个 pv 一块盘)  删除 pvc  删除 pv  总结
  本文我们讨论了 kubernetes 存储的几种类型,有临时存储如:hostPath、emptyDir,也有真正的持久化存储,还讨论了相关的概念,如:PVC、PV、StorageClass等,下图是对这些概念的一个概括:
  、
  参考极客时间:深入剖析 Kubernetes 课程  https://kubernetes.io/zh/docs/concepts/storage/volumes/#emptydir  https://www.qikqiak.com/k8strain/storage/local/  https://www.kubernetes.org.cn/4078.html  https://haojianxun.github.io/2019/01/10/kubernetes%E7%9A%84%E6%9C%AC%E5%9C%B0%E6%8C%81%E4%B9%85%E5%8C%96%E5%AD%98%E5%82%A8--Local%20Persistent%20Volume%E8%A7%A3%E6%9E%90/

千兆光纤入户越来越近1月6日消息,我省实施千兆光纤网络建设工程,推进千兆网络对家庭和重点区域的基本覆盖。到2023年,千兆宽带用户数突破100万户。山西省新型基础设施建设领导小组办公室制定山西省新型基字节跳动研发医疗AI抗癌已申请15项发明专利1月7日,据字节跳动消息,字节跳动旗下医疗品牌小荷健康研发了一款结肠镜AI辅助诊断软件。其可利用人工智能技术,辅助临床医生实时发现鉴别结直肠癌症病变。目前,该软件对结直肠癌相关标准java为什么使用线程池阿粉有点惊叹最近的面试题,因为从之前的基础的面试题,到之后的一些涉及到分布式和微服务的面试题,再到现在的线程池的一些面试题,反正不同的面试官,就有不同的针对方向,可能现在的面试官比Linux其实非常好学随着中国互联网的快速发展,逐渐步入大数据和人工智能时代,但是有一个身影却一直活跃在互联网世界里面,它就是Linux。Linux是非常强大的一门技术,在我们日常生活中我们经常使用这门狂降4200元,小米折叠屏不香了,骁龙888三件套立体四扬67W智能手机发展迅速,为了实现手机的大屏化,手机厂商推出了折叠屏机型,OPPO也在前不久推出了自家的首款折叠屏机型OPPOFindN,8256GB版本直接杀到了7699元起,而对于小米从6299元跌至3989元,苹果A141200万,还有顶级IP68防尘防水新的2022年一开始小米公司就遭遇了网友们的一波吐槽,起因是因为小米公司在发布小米12系列新旗舰的时候,频繁的提到对标苹果手机,其实对标苹果手机本没有错,此次小米12系列在部分方面鲁大师12月新机流畅榜MIUI13助力小米12Pro夺冠2022年1月5日,国内权威评测机构鲁大师公布12月新发布安卓手机流畅榜,小米12Pro小米12在MIUI13的加持下,凭借快更稳的流畅体验,一举斩获该榜单前两名。MIUI13是小2亿像素新版骁龙8Gen2,小米12Ultra才是王炸!最快4月发布小米12系列已经正式发布,该系列一共发布了小米12X小米12和小米12Pro,然而最高端的小米12Ultra却没有发布。去年小米11系列的几款机型也分为前后发布,更高配置的小米11SpaceX称星链互联网服务已经获得超过14。5万用户财经网科技1月7日讯,据新浪科技报道,埃隆马斯克(ElonMusk)的SpaceX公司在本周四公布了其星链(Starlink)互联网服务的最新情况,称已服务14。5万余用户。最近一同为55英寸,荣耀和小米智能电视怎么选?8大维度评测有话说临近年底,拿到年终奖的你是否想入手一款音画体验绝佳的智能电视?但逛遍了家电商场之后却仍然感到迷茫,特别是对于尺寸一样的智能电视,怎么才能选到称心如意的机型是目前很多消费者关注的重点想买长焦拍鸟,尼康300f4D200500f5。6哪款好?你好,很高兴回答你的问题,340和200500哪款都不好。单用340打鸟焦距有点短,340打鸟一般配个增距镜,340画质比200500好,就是不够长,配在半幅机器还可以,相当于全画
4种颜色的气垫鼠标,雷柏ralemoAir1无线充电鼠标换装时间到!可爱精致自然又或是醒目,今天是哪种风格?Air1色号微醺紫让诱惑炽燃,如星河魅闪。创新光感给予材质细腻光泽,加入气场色,邂逅一丝醉后温柔。显白灯带,制造独特魅力。Air打开歌单按下播放键,雷柏i130蓝牙TWS耳机邀你和音乐碰杯安静是一种奢侈品特供能享受独处与独立的人,悦己自处,跨越生活的琐碎无常,在嘈杂和快节奏的世界里获得灵感和快乐,无论将要去向何方,别忘带上自己的阳光。她说追光者的人生,温顺尚早。走向雷柏ralemoAir1气垫鼠标,高级风格与工艺,为女性定制Nobodycoulddefineyouunlessyouletthem。没有人可以定义你,除非你允许。关于女性的话题,这些年一直有人在探讨。随着时代的不同,女性的自我独立意识也逐双RGB轮寻!雷柏VH700游戏耳机听声辨位,高级脸一见轻心你好,初次见面听辨是天性舒适是本命光影中锋芒初现轮廓下尽释神彩启动后定义胜利别看初来乍到已准备充足用实力,守住阵地雷柏VH700虚拟7。1声道线控游戏耳机听,就得听点厉害的超级心脏2020KPL秋季赛,雷柏游戏携手武汉eStarPro征战每粒微尘之中,蕴藏着一片新得天地,尽头指向着无限可能。eStarProxVPro,代表professional,即专业专心专注。专业,精心调教产品的专业表现,专心,去突破更多可能性破圈!破圈!万物皆可说唱,雷柏i130蓝牙耳机听说唱新世代说唱新世代又是一档说唱比赛的综艺节目,在口碑上却碾压了其他的说唱,为什么呢。搜刮了一番,发现赛制简洁,其次够真诚。播放三期,每个歌手带来的曲目都在倾诉着自己的小世界,歌曲旋律节奏表白天是职场人,下班后是运动达人。雷柏S120蓝牙耳机有新料白天是利落精致的职场人,下班后是精力饱满的运动达人。玩出自由,玩出魄力,找对了伙伴,相处才舒服。雷柏S120颈挂式蓝牙耳机,功能性与可视性并存,戴上灵感,玩出新花样。随时,状态切换雷柏ralemoPre5慕斯机械键盘,属于新女性的艺术品我看见绿树和红色玫瑰,我看见他们为你我开放,我情不自禁地想到,这是一个多么美妙的世界。WhataWonderfulWorld颜色的意义,对于女性来说,到底是什么?色彩的选择是非常私开黑缺一颗糖,雷柏V500PRO机械键盘冰激凌粉清洌紫登场粉上团战,一触即发,紫气东来,锐不可挡。沁爽简约主义,演绎竞技潮流,收获瞩目。雷柏V500PRO背光机械键盘糖果版,终于姗姗而来。玩游戏,带上这颗糖吧。保持热爱,感受游戏的美好。这开挂超车的说唱新世代,用雷柏i300蓝牙TWS耳机听文化绿洲这个夏天,极限挑战曾经的导演严敏和bilibili联手,打造了一款说唱节目。延续了严敏一贯的风格经费有限,比赛在废弃工厂,起居在大通铺,选手们根据成绩从一环住到四环。从被人唱衰到好轻巧和兼容,雷柏PA20mini充电器,20W输出2021年不提点劲怎么行?小型充电器准备好了单USBC口充电口最高输出功率可达20W雷柏PA20mini迷你型充电器超小巧的身段,性能却毫不逊色20WUSBPD快速充电适用于当前绝