一、Volumes
容器的弊端:
1. Container (容器) 中的磁盘文件是短暂的,当容器崩溃时,kubelet 会重新启动容器,但最初的文件 将丢失,Container 会以最干净的状态启动。
2. 当一个 Pod 运行多个 Container 时,各个容器可能需要共享一些文件。
Kubernetes Volume 可以解决这两个问题。
一些需要持久化数据的程序才会用到 Volumes,或者一些需要共享数据的容器需要 volumes。
如:Redis 分片集群模式,Redis-Cluster:nodes.conf
日志收集的需求:需要在应用程序的容器里面加一个 sidecar,这个容器是一个收集日志的容器,比如 filebeat,它通过 volumes 共享应用程序的日志文件目录。
Kubernetes Volumes 官方文档:https://kubernetes.io/docs/concepts/storage/volumes/
1. Docker 和 K8S 的 Volume 区别
1. 生命周期管理:Docker的卷生命周期由其容器决定,如果容器被删除,卷并不会被自动删除。而 Kubernetes的卷与Pod生命周期绑定,当Pod被删除时,其卷也会被自动删除。
2. 共享与访问:在Docker中,每个容器都有自己的卷,无法共享卷。而在Kubernetes中,多个容器 可以共享同一个卷,并且通过在每个容器的volumeMounts字段中指定相同的卷,可以实现多容器 共享数据。
3. 卷类型和功能:Kubernetes支持多种类型的卷,如EmptyDir、Secret、ConfigMap、 PersistentVolumeClaim等,提供了丰富的选择和功能。而Docker的卷功能相对基础,主要关注持 久存储数据的解决方案。
4. 数据持久性:Kubernetes的卷在容器重启或销毁后仍然可以保留数据,因为其生命周期与Pod相 同。而Docker的卷在容器删除后数据可能会丢失。
5. 扩展性和灵活性:Kubernetes的卷架构更加开放和灵活,支持多种存储后端和插件机制,方便扩展 和定制。而Docker的卷功能相对固定,扩展性和灵活性相对较低。
2. EmptyDir 容器卷
EmptyDir 卷用于 Pod 中的不同 Container 共享数据,如果删除 Pod,EmptyDir 卷中的数据也将被删 除。
使用方式:
默认情况下,EmptyDir 卷支持节点上的任何介质,可以是 SSD、磁盘或网络存储,具体如何使用 取决于自身的环境。
还可以将 emptyDir.medium 字段设置为 Memory,让 Kubernetes 使用 tmpfs(内存支持的文件 系统),不过这样虽然提高性能,但因为是运行在内存中,所以数据无法持久化,且设置的大小会 被计入到 Container 的内存限制中。
使用 emptyDir 卷的示例,直接指定 emptyDir 为 {} 即可:
挂载验证
3. HostPath 本地卷
HostPath 卷可将将宿主机的文件或目录挂载到 Pod 上,用于 Pod 自定义日志输出或访问 Docker 内部 的容器等。
在挂载时,要注意该 Pod 是在哪个节点上运行的,要在对应的 node 上创建需要挂载的文件或目录。 使用 hostPath 卷的示例。
将主机的 /root/test.txt 挂载到 Pod 的 /tmp 下:
先为两台节点分别设置标签
在 node01 节点上创建 test.txt
修改 nginx 的 deplyment 资源
4. NFS 网络卷
node02 使用 nfs 部署网络存储
修改 yaml 文件
node02 在/hehe 共享目录下创建文件
查看 Pod 是否挂载成功
node02 节点验证/hehe