存储卷查看:kubectl explain pods.spec.volumes

一、简单的存储方式

1)2个容器之间共享存储.。(删除则数据消失)

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: pod-demo
  5. namespace: default
  6. labels:
  7. app: myapp
  8. tier: frontend
  9. annotations:
  10. magedu.com/created-by: "clusten admin"
  11. spec:
  12. containers:
  13. - name: myapp
  14. image: ikubernetes/myapp:v1
  15. ports:
  16. - name: http
  17. containerPort:
  18. volumeMounts:
  19. - name: html
  20. mountPath: /data/web/html/
  21. - name: busybox
  22. image: busybox:latest
  23. imagePullPolicy: IfNotPresent
  24. volumeMounts:
  25. - name: html
  26. mountPath: /data/
  27. command:
  28. - "/bin/sh"
  29. - "-c"
  30. - "sleep 3600"
  31. volumes:
  32. - name: html
  33. emptyDir: {}

pod-vol-demo.yaml

创建容器

  1. [root@master volume]# kubectl apply -f pod-vol-demo.yaml
  2. pod/pod-demo created

进入容器测试

  1. 进入其中一个创建数据
  2. [root@master volume]# kubectl exec -it pod-demo -c busybox -- /bin/sh
  3. / #
  4. / # echo $(date) >> /data/index.html
  5. / # echo $(date) >> /data/index.html
  6. / # cat /data/index.html
  7. Sun Jun :: UTC
  8. Sun Jun :: UTC
  9. 进入第二查看数据
  10. [root@master volume]# kubectl exec -it pod-demo -c myapp -- /bin/sh
  11. / # cat /data/web/html/index.html
  12. Sun Jun :: UTC
  13. Sun Jun :: UTC

2)根据2个容器的存储,一个容器创造数据,一个数据读取数据。(删除则数据消失)

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: pod-demo
  5. namespace: default
  6. labels:
  7. app: myapp
  8. tier: frontend
  9. annotations:
  10. magedu.com/created-by: "clusten admin"
  11. spec:
  12. containers:
  13. - name: myapp
  14. image: ikubernetes/myapp:v1
  15. ports:
  16. - name: http
  17. containerPort:
  18. volumeMounts:
  19. - name: html
  20. mountPath: /usr/share/nginx/html/
  21. - name: busybox
  22. image: busybox:latest
  23. imagePullPolicy: IfNotPresent
  24. volumeMounts:
  25. - name: html
  26. mountPath: /data/
  27. command: ["/bin/sh"]
  28. args: ["-c", "while true; do echo $(date) >> /data/index.html; sleep 2; done"]
  29. volumes:
  30. - name: html
  31. emptyDir: {}

pod-vol-demo.yaml

读取测试

  1. [root@master volume]# kubectl apply -f pod-vol-demo.yaml
  2. pod/pod-demo created
  3. [root@master volume]# kubectl get pods -o wide
  4. NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
  5. pod-demo / Running 10s 10.244.2.8 node01 <none> <none>
  6. [root@master volume]# curl 10.244.2.8
  7. Sun Jun :: UTC
  8. Sun Jun :: UTC
  9. Sun Jun :: UTC
  10. Sun Jun :: UTC
  11. Sun Jun :: UTC
  12. Sun Jun :: UTC
  13. Sun Jun :: UTC

3)将内容存储与节点机器上

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: pod-vol-hostpath
  5. namespace: default
  6. spec:
  7. containers:
  8. - name: myapp
  9. image: ikubernetes/myapp:v1
  10. volumeMounts:
  11. - name: html
  12. mountPath: /usr/share/nginx/html
  13. volumes:
  14. - name: html
  15. hostPath:
  16. path: /data/pod/volume1
  17. type: DirectoryOrCreate

pod-hostpath-vol.yaml

创建容器

  1. [root@master volume]# kubectl apply -f pod-hostpath-vol.yaml
  2. pod/pod-vol-hostpath created
  3. [root@master volume]# kubectl get pods -o wide
  4. NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
  5. pod-vol-hostpath / Running 51s 10.244.2.9 node01 <none> <none>

进入容器内创建数据,则可在存储卷中查看到数据内容

  1. [root@master volume]# kubectl exec -it pod-vol-hostpath /bin/sh
  2. / # cd /usr/share/nginx/html
  3. /usr/share/nginx/html # echo "hello world" >> index.html
  4. [root@master volume]# curl 10.244.2.9
  5. hello world
  6.  
  7. 登陆到 node01 服务器
  8. [root@node01 ~]# cat /data/pod/volume1/index.html
  9. hello world

3.1)测试删除了容器,内容是否还在

  1. [root@master volume]# kubectl delete -f pod-hostpath-vol.yaml
  2. pod "pod-vol-hostpath" deleted
  3. [root@master volume]# kubectl get pods
  4. No resources found.
  5. [root@master volume]# kubectl apply -f pod-hostpath-vol.yaml
  6. pod/pod-vol-hostpath created
  7. [root@master volume]# kubectl get pods -o wide
  8. NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
  9. pod-vol-hostpath / Running 39s 10.244.2.10 node01 <none> <none>
  10. [root@master volume]# curl 10.244.2.10
  11. hello world

二、使用nfs来做存储卷

1)先测试 nfs 共享存储的可用性

1.1)node 机器和pv机器编辑hosts主机解析

  1. 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
  2. :: localhost localhost.localdomain localhost6 localhost6.localdomain6
  3.  
  4. 192.168.1.5 master
  5. 192.168.1.6 node01 n1
  6. 192.168.1.7 node02 n2
  7. 192.168.1.8 pv01 p1

cat /etc/hosts

1.2)pv 机器安卓nfs 并启动

  1. [root@pvz01 ~]# yum install -y nfs-utils
  2. [root@pvz01 ~]# mkdir -pv /data/volumes
  3. mkdir: created directory ‘/data
  4. mkdir: created directory ‘/data/volumes
  5. [root@pvz01 ~]# cat /etc/exports
  6. /data/volumes 192.168.1.0/(rw,no_root_squash)
  7. [root@pvz01 ~]# systemctl start nfs
  8. [root@pvz01 ~]# ss -tnl|grep
  9. LISTEN *: *:*
  10. LISTEN ::: :::

节点机器也需要安装nfs,并测试挂载服务

  1. [root@node01 ~]# yum install -y nfs-utils
  2. [root@node01 ~]# mount -t nfs pv01:/data/volumes /mnt
  3. [root@node01 ~]# df -h|grep mnt
  4. pv01:/data/volumes 19G .1G 18G % /mnt
  5. [root@node01 ~]# df -h|grep mnt
  6. pv01:/data/volumes 19G .1G 18G % /mnt

1.3)挂在服务正常可用。取消挂载

  1. [root@node01 ~]# umount /mnt
  2. [root@node01 ~]# df -h|grep mnt

2)使用k8s来管理节点调用 nfs的存储功能

  1. [root@master ~]# cat /etc/hosts|grep 192.168.1.8
  2. 192.168.1.8 pv01 p1 pv01.test.com

2.1)master机器编辑 相应的yaml文件

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: pod-vol-nfs
  5. namespace: default
  6. spec:
  7. containers:
  8. - name: myapp
  9. image: ikubernetes/myapp:v1
  10. volumeMounts:
  11. - name: html
  12. mountPath: /usr/share/nginx/html
  13. volumes:
  14. - name: html
  15. nfs:
  16. path: /data/volumes
  17. server: pv01.test.com

pod-vol-nfs.yaml

2.2)创建该pod

  1. [root@master nfs_volume]# kubectl apply -f pod-vol-nfs.yaml
  2. pod/pod-vol-nfs created
  3. [root@master nfs_volume]# kubectl get pods -o wide
  4. NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
  5. pod-vol-nfs / Running 10s 10.244.2.11 node01 <none> <none>

2.3)进入pv服务,在挂载卷下随便创建内容,进入访问测试

  1. [root@pvz01 ~]# echo $(date) > /data/volumes/index.html
  2. [root@pvz01 ~]# echo $(date) >> /data/volumes/index.html
  3. [root@pvz01 ~]# echo $(date) >> /data/volumes/index.html
  4.  
  5. [root@master nfs_volume]# curl 10.244.2.11
  6. Sun Jun :: CST
  7. Sun Jun :: CST
  8. Sun Jun :: CST

三、pv 和 pvc的使用

1)在pv机器创建好存储卷

  1. [root@pvz01 volumes]# ls
  2. index.html
  3. [root@pvz01 volumes]# mkdir v{,,,,}
  4. [root@pvz01 volumes]# ls
  5. index.html v1 v2 v3 v4 v5
  6. [root@pvz01 volumes]# cat /etc/exports
  7. /data/volumes/v1 192.168.1.0/(rw,no_root_squash)
  8. /data/volumes/v2 192.168.1.0/(rw,no_root_squash)
  9. /data/volumes/v3 192.168.1.0/(rw,no_root_squash)
  10. /data/volumes/v4 192.168.1.0/(rw,no_root_squash)
  11. /data/volumes/v5 192.168.1.0/(rw,no_root_squash)
  12. [root@pvz01 volumes]# exportfs -arv
  13. exporting 192.168.1.0/:/data/volumes/v5
  14. exporting 192.168.1.0/:/data/volumes/v4
  15. exporting 192.168.1.0/:/data/volumes/v3
  16. exporting 192.168.1.0/:/data/volumes/v2
  17. exporting 192.168.1.0/:/data/volumes/v1
  18. [root@pvz01 volumes]# showmount -e
  19. Export list for pvz01:
  20. /data/volumes/v5 192.168.1.0/
  21. /data/volumes/v4 192.168.1.0/
  22. /data/volumes/v3 192.168.1.0/
  23. /data/volumes/v2 192.168.1.0/
  24. /data/volumes/v1 192.168.1.0/

2)创建pv 绑定pv机器上的存储卷

[root@master ~]# kubectl explain pv    # pv 相关参数

  1. apiVersion: v1
  2. kind: PersistentVolume
  3. metadata:
  4. name: pv001
  5. labels:
  6. name: pv001
  7. spec:
  8. nfs:
  9. path: /data/volumes/v1
  10. server: pv01.test.com
  11. accessModes: ["ReadWriteMany","ReadWriteOnce"]
  12. capacity:
  13. storage: 2Gi
  14. ---
  15. apiVersion: v1
  16. kind: PersistentVolume
  17. metadata:
  18. name: pv002
  19. labels:
  20. name: pv002
  21. spec:
  22. nfs:
  23. path: /data/volumes/v2
  24. server: pv01.test.com
  25. accessModes: ["ReadWriteMany","ReadWriteOnce"]
  26. capacity:
  27. storage: 2Gi
  28. ---
  29. apiVersion: v1
  30. kind: PersistentVolume
  31. metadata:
  32. name: pv003
  33. labels:
  34. name: pv003
  35. spec:
  36. nfs:
  37. path: /data/volumes/v3
  38. server: pv01.test.com
  39. accessModes: ["ReadWriteMany","ReadWriteOnce"]
  40. capacity:
  41. storage: 1Gi
  42. ---
  43. apiVersion: v1
  44. kind: PersistentVolume
  45. metadata:
  46. name: pv004
  47. labels:
  48. name: pv004
  49. spec:
  50. nfs:
  51. path: /data/volumes/v4
  52. server: pv01.test.com
  53. accessModes: ["ReadWriteOnce"]
  54. capacity:
  55. storage: 5Gi
  56. ---
  57. apiVersion: v1
  58. kind: PersistentVolume
  59. metadata:
  60. name: pv005
  61. labels:
  62. name: pv005
  63. spec:
  64. nfs:
  65. path: /data/volumes/v5
  66. server: pv01.test.com
  67. accessModes: ["ReadWriteMany","ReadWriteOnce"]
  68. capacity:
  69. storage: 5Gi

pv-demo.yaml

创建可利用的pv

  1. [root@master volume]# kubectl apply -f pv-demo.yaml
  2. persistentvolume/pv001 created
  3. persistentvolume/pv002 created
  4. persistentvolume/pv003 created
  5. persistentvolume/pv004 created
  6. persistentvolume/pv005 created
  7. [root@master volume]# kubectl get pv
  8. NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
  9. pv001 2Gi RWO,RWX Retain Available 37s
  10. pv002 2Gi RWO,RWX Retain Available 37s
  11. pv003 1Gi RWO,RWX Retain Available 37s
  12. pv004 5Gi RWO Retain Available 37s
  13. pv005 5Gi RWO,RWX Retain Available 37s

3)定义pod资源, 使用pvc调用可利用的pv

  1. apiVersion: v1
  2. kind: PersistentVolumeClaim
  3. metadata:
  4. name: mypvc
  5. namespace: default
  6. spec:
  7. accessModes: ["ReadWriteMany"]
  8. resources:
  9. requests:
  10. storage: 4Gi
  11. ---
  12. apiVersion: v1
  13. kind: Pod
  14. metadata:
  15. name: pod-vol-pvc
  16. namespace: default
  17. spec:
  18. containers:
  19. - name: myapp
  20. image: ikubernetes/myapp:v1
  21. volumeMounts:
  22. - name: html
  23. mountPath: /usr/share/nginx/html
  24. volumes:
  25. - name: html
  26. persistentVolumeClaim:
  27. claimName: mypvc

pod-vol-pvc.yaml

创建pod的资源查看 pv 的情况

  1. [root@master volume]# kubectl apply -f pod-vol-pvc.yaml
  2. persistentvolumeclaim/mypvc unchanged
  3. pod/pod-vol-pvc created
  4. [root@master ~]# kubectl get pods
  5. NAME READY STATUS RESTARTS AGE
  6. pod-vol-pvc / Running 6m16s
  7. [root@master ~]# kubectl get pv
  8. NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
  9. pv001 2Gi RWO,RWX Retain Available 22m
  10. pv002 2Gi RWO,RWX Retain Available 22m
  11. pv003 1Gi RWO,RWX Retain Available 22m
  12. pv004 5Gi RWO Retain Available 22m
  13. pv005 5Gi RWO,RWX Retain Bound default/mypvc 22m
  14. [root@master ~]# kubectl get pvc
  15. NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
  16. mypvc Bound pv005 5Gi RWO,RWX 8m33s

此时根据调度算法,数据已经绑定在了pv005中

k8s的存储卷的更多相关文章

  1. k8s之存储卷及pvc

    1.存储卷概述 因为pod是有生命周期的,pod一重启,里面的数据就没了,所以我们需要数据持久化存储,在k8s中,存储卷不属于容器,而是属于pod,也就是说同一个pod中的容器可以共享一个存储卷,存储 ...

  2. K8s的存储卷使用总结

    K8s的存储卷: 它有四种存储卷: 1. emptyDir: 空目录,这种存储卷会随着Pod的删除而被清空,它一般作为缓存目录使用,或临时目录, 当做缓存目录时,通常会将一块内存空间映射到该目录上,让 ...

  3. k8s volume存储卷

    k8s volume存储卷   介绍 volume存储卷是Pod中能够被多个容器访问的共享目录,kubernetes的volume概念,用途和目的与docker的volume比较类似,但两者不能等价, ...

  4. k8s volume存储卷(四)

    介绍 volume存储卷是Pod中能够被多个容器访问的共享目录,kubernetes的volume概念,用途和目的与docker的volume比较类似,但两者不能等价,首先,kubernetes中的v ...

  5. k8s系列---存储卷pv/pvc。configMap/secert

    因为pod是有生命周期的,pod一重启,里面的数据就没了.所以我们需要数据持久化存储. 在k8s中,存储卷不属于容器,而是属于pod.也就是说同一个pod中的容器可以共享一个存储卷. 存储卷可以是宿主 ...

  6. 12.k8s的存储卷创建过程

    数据持久化需要数据卷.kubernetes生态提供海量的存储驱动和存储使用方式. [root@master song]# cat pod-demo.yml apiVersion: v1 kind: P ...

  7. Kubernetes学习之路(十六)之存储卷

    目录 一.存储卷的概念和类型 二.emptyDir存储卷演示 三.hostPath存储卷演示 四.nfs共享存储卷演示 五.PVC和PV的概念 六.NFS使用PV和PVC 1.配置nfs存储 2.定义 ...

  8. k8s学习笔记之八:存储卷

    第一章.前言 默认情况下容器的数据都是非持久化的, 在容器消亡以后数据也跟着丢失, 所以 Docker 提供了 Volume 机制以便将数据持久化存储. 类似的, Kubernetes 提供了更强大的 ...

  9. 从零开始入门 K8s | 应用存储和持久化数据卷:核心知识

    作者 | 至天 阿里巴巴高级研发工程师 一.Volumes 介绍 Pod Volumes 首先来看一下 Pod Volumes 的使用场景: 场景一:如果 pod 中的某一个容器在运行时异常退出,被 ...

随机推荐

  1. ABP框架按条件导出

    web层 .js导出事件: //导出为excel文档 $('#btn-export').click(function () { //得到查询的参数 var temp = { //这里的键的名字和控制器 ...

  2. Prometheus + Grafana

    Prometheus ubuntu安装prometheus非常简单: apt update apt install prometheus systemctl enable prometheus sys ...

  3. 前端每日实战:63# 视频演示如何用纯 CSS 创作一台烤面包机

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/OEBJRN 可交互视频 此视频是可 ...

  4. 特斯拉通过GitHub发布了这些源代码,用意何在?

    特斯拉多年来一直在软件社区使用开源软件而不遵守许可证. 在迈向合规性的一步中,特斯拉现在正在发布其软件的一些部分,这对特斯拉黑客和安全研究人员来说非常有用. 特斯拉是一家软件强大的公司,它一直在使用大 ...

  5. hdu 1695: GCD 【莫比乌斯反演】

    题目链接 这题求[1,n],[1,m]gcd为k的对数.而且没有顺序. 设F(n)为公约数为n的组数个数 f(n)为最大公约数为n的组数个数 然后在纸上手动验一下F(n)和f(n)的关系,直接套公式就 ...

  6. pycharm之black配置for python file(代码格式化工具)

    一.介绍下black 源码;https://github.com/ambv/blackpei 二.具体步骤 第一步 安装black: 从命令行安装:例如Windows的cmd窗口,运行命令pip3 i ...

  7. git 往远端Dev推送

  8. Git使用包括切换分支

  9. SpringBoot编程思想

    Spring Boot的特性 1).创建独立的Spring应用 2).直接嵌入Tomcat.Jetty或Undertow等Web容器(不需要部署WAR文件) 3).提供固化的starter依赖,简化构 ...

  10. .NET Core 使用 mongodb

    1.运行环境 开发工具:Visual Studio 2017 JDK版本:.NET Core 2.0 项目管理工具:nuget 2.GITHUB地址 https://github.com/nbfujx ...