K8s新手系列之Pod的基本存储

打印 上一主题 下一主题

主题 1730|帖子 1730|积分 5190

概念

官方文档:https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/configure-volume-storage/
卷:https://kubernetes.io/zh-cn/docs/concepts/storage/volumes/
容器的生命周期可能很短,会被频仍地创建和烧毁。那么容器在烧毁时,保存在容器中的数据也会被清除。这种结果对用户来说,在某些情况下是不乐意看到的。为了持久化保存容器的数据,kubernetes引入了Volume的概念。
Volume是Pod中能够被多个容器访问的共享目录,它被界说在Pod上,然后被一个Pod里的多个容器挂载到具体的文件目录下,kubernetes通过Volume实现同一个Pod中不同容器之间的数据共享以及数据的持久化存储。Volume的生命容器不与Pod中单个容器的生命周期相关,当容器终止大概重启时,Volume中的数据也不会丢失。
kubernetes的Volume支持多种范例,比力常见的有下面几个:

  • 简单存储:EmptyDir、HostPath、NFS
  • 高级存储:PV、PVC
  • 配置存储:ConfigMap、Secret
基本存储之EmptyDir

官方文档:https://kubernetes.io/zh-cn/docs/concepts/storage/volumes/#emptydir
EmptyDir是在Pod被分配到Node时创建的,它的初始内容为空,并且无须指定宿主机上对应的目录文件,因为kubernetes会自动分配一个目录,当Pod烧毁时,EmptyDir中的数据也会被永久删除。使用在临时缓存文件、中间计算结果(无需持久化)。

特点


  • Pod 创建时自动创建空目录,Pod 删除时数据清除。
  • 数据仅存于 Pod 所在节点的内存或磁盘(可通过medium参数指定,默认""表现节点默认存储,Memory表现内存存储,数据易失)。
  • 支持 Pod 内多个容器共享数据。
EmptyDir使用场景


  • 临时缓存文件、中间计算结果(无需持久化)
  • 例如:filebeat收罗日记
EmptyDir实战案例

示例:
  1. # 定义清单文件
  2. [root@master01 ~/volumes]# cat empty-pod.yaml
  3. apiVersion: v1
  4. kind: Pod
  5. metadata:
  6.   name: empty-pod
  7. spec:
  8.   # 定义数据卷
  9.   volumes:
  10.   # 数据卷名称
  11.   - name: data-volume
  12.     # volume的类型
  13.     emptyDir: {}
  14.   containers:
  15.   - name: writer-busybox
  16.     image: busybox
  17.     command: ["/bin/sh", "-c"]
  18.     args:
  19.       - |
  20.         echo "hello emptyDir" >> /data/hello.txt;
  21.         sleep 3600
  22.     # 指定挂载的数据卷
  23.     volumeMounts:
  24.       # 要挂载的数据卷名称
  25.     - name: data-volume
  26.       # 挂载到容器内部的路径
  27.       mountPath: /data
  28.       # 是否只读,false为可读可写,true为只读
  29.       readOnly: false
  30.   - name: reader-busybox
  31.     image: busybox
  32.     command: ["/bin/sh", "-c"]
  33.     args:
  34.       - |
  35.         cat /data/hello.txt;
  36.         sleep 3600
  37.     volumeMounts:
  38.     - name: data-volume
  39.       mountPath: /data
  40.       readOnly: true
复制代码
检察pod打印的日记
  1. [root@master01 ~/volumes]# kubectl logs empty-pod reader-busybox
  2. hello emptyDir
复制代码
基本存储之HostPath

官方文档:https://kubernetes.io/zh-cn/docs/concepts/storage/volumes/#hostpath
EmptyDir中数据不会被持久化,它会随着Pod的结束而烧毁,如果想简单的将数据持久化到主机中,可以选择HostPath。
HostPath就是将Node主机中一个实际目录挂在到Pod中,以供容器使用,这样的设计就可以包管Pod烧毁了,但是数据依据可以存在于Node主机上。

特点


  • 挂载节点上的当地文件或目录(如/var/lib/data)到 Pod 中。
  • 数据随节点存在而保留,Pod 删除后数据仍在节点上,但跨节点调度时无法共享。
  • 需注意节点路径权限(如使用hostPath.type指定路径范例,如DirectoryOrCreate自动创建目录)。
HostPath实战案例
  1. # 定义清单文件
  2. [root@master01 ~/volumes]# cat hostpath-pod.yaml
  3. apiVersion: v1
  4. kind: Pod
  5. metadata:
  6.   name: hostpath-pod
  7. spec:
  8.   volumes:
  9.   - name: hostpath
  10.     hostPath:
  11.       # 节点上的存储位置
  12.       path: /data/nginx/
  13.       # 类型,文件夹不存在时自动创建
  14.       type: DirectoryOrCreate
  15.   containers:
  16.   - name: nginx
  17.     image: nginx
  18.     volumeMounts:
  19.     - name: hostpath
  20.       mountPath: /usr/share/nginx/html
  21. # 创建Pod
  22. [root@master01 ~/volumes]# kubectl apply -f hostpath-pod.yaml
  23. pod/hostpath-pod created
  24. # 查看Pod调度到哪个节点上
  25. [root@master01 ~/volumes]# kubectl get po hostpath-pod -o wide
  26. NAME           READY   STATUS    RESTARTS   AGE   IP               NODE     NOMINATED NODE   READINESS GATES
  27. hostpath-pod   1/1     Running   0          89s   100.95.185.242   node02   <none>           <none>
复制代码
前往node02节点上检察
  1. # 发现目录已经创建成功了
  2. [root@node02 ~]# stat /data/nginx/
  3.   File: /data/nginx/
  4.   Size: 4096            Blocks: 8          IO Block: 4096   directory
  5. Device: fd00h/64768d    Inode: 1441794     Links: 2
  6. Access: (0755/drwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
  7. Access: 2025-05-11 12:52:34.507395315 +0800
  8. Modify: 2025-05-11 12:51:28.658324447 +0800
  9. Change: 2025-05-11 12:51:28.658324447 +0800
  10. Birth: 2025-05-11 12:49:08.272029814 +0800
  11. # 写入一个文件进行访问测试
  12. [root@node02 ~]# echo I am huangsir > /data/nginx/index.html
  13. [root@node02 ~]# cat /data/nginx/index.html
  14. I am huangsir
  15. # 访问nginx,发现绑定成功
  16. [root@node02 ~]# curl 100.95.185.242
  17. I am huangsir
复制代码
hostPath中type的可用值


  • DirectoryOrCreate:如果在给定路径上什么都不存在,那么将根据需要创建空目录,权限设置为 0755,具有与 kubelet 相同的组和属主信息。
  • Directory:在给定路径上必须存在的目录。
  • FileOrCreate:如果在给定路径上什么都不存在,那么将在那里根据需要创建空文件,权限设置为 0644,具有与 kubelet 相同的组和全部权。
  • File:在给定路径上必须存在的文件。
  • Socket:在给定路径上必须存在的 UNIX 套接字。
  • CharDevice:(仅 Linux 节点) 在给定路径上必须存在的字符设备。
  • BlockDevice:(仅 Linux 节点) 在给定路径上必须存在的块设备。
基本存储之NFS

官方文档:https://kubernetes.io/zh-cn/docs/concepts/storage/volumes/#nfs
HostPath依赖节点,如果Pod重启之后调度到另一个节点中,那么所依赖数据将不存在。
NFS可以办理这个题目,
NFS存储特点


  • 挂载远程 NFS 服务器的共享目录,支持跨节点共享数据。
  • 数据持久化存储在 NFS 服务器,不依赖 Pod 或节点生命周期。
使用场景

多 Pod 共享数据(如分布式应用的共享配置)。
NFS实战案例

安装NFS

起首我们需要安装NFS,可以参考这篇文章:NFS搭建及使用
master节点安装服务端
  1. apt update -y
  2. apt install -y nfs-kernel-server
  3. # 检查状态
  4. systemctl status nfs-kernel-server
  5. # 创建共享目录
  6. mkdir -p /data/nfs/nginx
  7. echo '/data/nfs/nginx 10.0.0.0/24(rw,sync,no_root_squash,no_subtree_check)' >> /etc/exports
  8. exportfs -ra
  9. systemctl restart nfs-kernel-server
复制代码
node节点安装客户端(可以不用操作)
  1. apt update -y
  2. apt install -y nfs-common
  3. mkdir -p /data/nfs/nginx
  4. # 挂载
  5. mount -t nfs 10.0.0.30:/data/nfs/nginx /data/nfs/nginx
  6. # 开机自启动挂载
  7. echo 10.0.0.30:/data/nfs/nginx /data/nfs/nginx nfs defaults        0 0 >> /etc/fstab
  8. # 检查是否挂载成功
  9. df -h | grep /data/nfs/nginx
复制代码
创建Pod测试
  1. # 定义资源文件
  2. [root@master01 ~/volumes]# cat nfs-pod.yaml
  3. apiVersion: v1
  4. kind: Pod
  5. metadata:
  6.   name: nfs-pod
  7. spec:
  8.   # 指定Pod调度到node01节点上
  9.   nodeName: node01
  10.   volumes:
  11.   - name: nfs
  12.     nfs:
  13.       # nfs服务端的地址
  14.       server: 10.0.0.30
  15.       # 挂载nfs服务器的路径
  16.       path: /data/nfs/nginx
  17.   containers:
  18.   - name: nginx
  19.     image: nginx
  20.     volumeMounts:
  21.     - name: nfs
  22.       mountPath: /usr/share/nginx/html
  23. # 创建Pod
  24. [root@master01 ~/volumes]# kubectl apply -f nfs-pod.yaml
  25. pod/nfs-pod created
  26. # 查看pod信息,发现调度到node01节点上,IP为100.117.144.145
  27. [root@master01 ~/volumes]# kubectl get po nfs-pod -o wide
  28. NAME      READY   STATUS    RESTARTS   AGE   IP                NODE     NOMINATED NODE   READINESS GATES
  29. nfs-pod   1/1     Running   0          16s   100.117.144.145   node01   <none>           <none>
复制代码
配置测试内容并访问测试
  1. [root@master01 ~/volumes]#  echo nfs-server > index.html
  2. # 访问测试
  3. [root@master01 ~/volumes]# curl 100.117.144.145
  4. nfs-server
复制代码
再将Pod调度到node02节点上,测试访问内容是否会发生变化
  1. [root@master01 ~/volumes]# cat nfs-pod.yaml
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5.   name: nfs-pod
  6. spec:
  7.   # 指定Pod调度到node02节点上
  8.   nodeName: node02
  9.   volumes:
  10.   - name: nfs
  11.     nfs:
  12.       # nfs服务端的地址
  13.       server: 10.0.0.30
  14.       # 挂载nfs服务器的路径
  15.       path: /data/nfs/nginx
  16.   containers:
  17.   - name: nginx
  18.     image: nginx
  19.     volumeMounts:
  20.     - name: nfs
  21.       mountPath: /usr/share/nginx/html
  22. # 创建Pod,需要将上一步创建Pod删除哦~
  23. [root@master01 ~/volumes]# kubectl apply -f nfs-pod.yaml
  24. pod/nfs-pod created
  25. # 查看pod调度及IP
  26. [root@master01 ~/volumes]# kubectl get po nfs-pod -o wide
  27. NAME      READY   STATUS    RESTARTS   AGE   IP               NODE     NOMINATED NODE   READINESS GATES
  28. nfs-pod   1/1     Running   0          10s   100.95.185.244   node02   <none>           <none>
  29. # 访问,发现内容并没有发生变化
  30. [root@master01 ~/volumes]# curl 100.95.185.244
  31. nfs-seerver
复制代码
配置存储ConfigMap和Secret

可以参考下面这两篇文章

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

冬雨财经

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表