Kubernetes教程-volumn
第十三章 存储之volume
容器磁盘上的文件的生命周期是短暂的,这就使得在容器中运行重要应用时会出现一些问题。首先,当容器崩溃时,kubelet 会重启它,但是容器中的文件将丢失——容器以干净的状态(镜像最初的状态)重新启动。其次,在Pod中同时运行多个容器时,这些容器之间通常需要共享文件。Kubernetes 中的Volume抽象就很好的解决了这些问题
1、背景
Kubernetes 中的卷有明确的寿命 —— 与封装它的 Pod 相同。所f以,卷的生命比 Pod 中的所有容器都长,当这个容器重启时数据仍然得以保存。当然,当 Pod 不再存在时,卷也将不复存在。也许更重要的是,Kubernetes支持多种类型的卷,Pod 可以同时使用任意数量的卷
2、卷的类型
3、emptyDir
当 Pod 被分配给节点时,首先创建emptyDir卷,并且只要该 Pod 在该节点上运行,该卷就会存在。正如卷的名字所述,它最初是空的。Pod 中的容器可以读取和写入emptyDir卷中的相同文件,尽管该卷可以挂载到每个容器中的相同或不同路径上。当出于任何原因从节点中删除 Pod 时,emptyDir中的数据将被永久删除
emptyDir的用法有:
① 暂存空间,例如用于基于磁盘的合并排序
② 用作长时间计算崩溃恢复时的检查点
③ Web服务器容器提供数据时,保存内容管理器容器提取的文件
#cd ~ #mkdir volume #cd volume #ntpdate ntp1.aliyun.com #同步时间 #date #vim em.yaml apiVersion: v1 kind: Pod metadata: name: test-pd spec: containers: - image: hub.atguigu.com/library/nginx:latest name: test-container volumeMounts: - mountPath: /cache #容器里面的目录 name: cache-volume - name: liveness-exec-container image: hub.atguigu.com/library/busybox:latest imagePullPolicy: IfNotPresent command: ["/bin/sh", "-c", "sleep 6000s"] volumeMounts: - mountPath: /test #容器里面的目录 name: cache-volume volumes: - name: cache-volume #定义卷的名称 emptyDir: {} #一个空的目录 #kubectl apply -f em.yaml #kubectl get pod
#kubectl describe pod test-pd
#kubectl exec test-pd -c test-container -it -- /bin/sh #pod里面有多个容器,进入pod里某一个容器需要用-c指定某个容器的名称 #cd /cache/ #ls #空目录
#date > index.html
#kubectl exec test-pd -c liveness-exec-container -it -- /bin/sh #进入另一个pod里面的容器
#cd /test/
#ls #有index.html共享目录里面的文件
4、hostPath
hostPath:卷将主机节点的文件系统中的文件或目录挂载到集群中
hostPath的用途如下:
① 运行需要访问 Docker 内部的容器;使用/var/lib/docker的hostPath
② 在容器中运行 cAdvisor;使用/dev/cgroups的hostPath
③ 允许 pod 指定给定的 hostPath 是否应该在 pod 运行之前存在,是否应该创建,以及它应该以什么形式存在
除了所需的path属性之外,用户还可以为 hostPath 卷指定 type
值 |
行为 |
|
空字符串(默认)用于向后兼容,这意味着在挂载 hostPath 卷之前不会执行任何检查 |
DirectoryOrCreate |
如果在给定的路径上没有任何东西存在,那么将根据需要在那里创建一个空目录,权限设置为0755,与Kubelet具有相同的组和所有权。 |
Directory |
给定的路径下必须存在目录 |
FileOrCreate |
如果在给定的路径上没有任何东西存在,那么会根据需要创建一个空文件,权限设置为0644,与Kubelet具有相同的组和所有权。 |
File |
给定的路径下必须存在文件 |
Socket |
给定的路径下必须存在UNIX套接字 |
CharDevice |
给定的路径下必须存在字符设备 |
BlockDevice |
给定的路径下必须存在块设备 |
使用这种卷类型是请注意,因为:
① 由于每个节点上的文件都不同,具有相同配置(例如从 podTemplate 创建的)的 pod 在不同节点上的行为可能会有所不同
② 当 Kubernetes 按照计划添加资源感知调度时,将无法考虑 hostPath 使用的资源
③ 在底层主机上创建的文件或目录只能由 root 写入。您需要在特权容器中以 root 身份运行进程,或修改主机上的文件权限以便写入hostPath卷
#mkdir /data #每台机器上都需要提前创建这个目录 #vim host.yaml apiVersion: v1 kind: Pod metadata: name: test-pd2 spec: containers: - image: hub.atguigu.com/library/nginx:latest name: test-container2 volumeMounts: - mountPath: /test-pd2 name: test-volume2 volumes: - name: test-volume2 hostPath: path: /data # 宿主机的文件目录 type: Directory # 给定的路径下必须存在目录 #kubectl apply -f host.yaml
#kubectl get pod
#kubectl get pod -o wide
#kubectl exec test-pd2 -it -- /bin/sh
#cd /test-pd2
#date > index.html
在node2机器上面有index.html文件了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
2014-06-15 SQL SERVER SELECT语句中加锁选项的详细说明 [转]