首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

Kubernetes(五)Kubernetes Volume详解

  • 23-11-14 12:43
  • 3781
  • 5645
blog.csdn.net

Volume的作用

一切container和它之中的数据都是临时的。如果container重启,这些数据会丢失。Volume用于container保存需要持久化的数据。这些数据也可以用于container共享。

Volume的概念

Docker中有volume的概念。在Docker中,volume是container中的一个目录。Volume没有生命周期的概念,volume中的数据只有储存在本地磁盘这一种形式。

Kubernetes的volume具有明确的生命空间。Volume生命周期比pod中运行的container长。Container重启之后,volume的数据仍会保留。但是,当Pod销毁之时,该pod关联的volume也会同时销毁。

使用volume的方法:在spec.volumes处声明volume,在spec.containers[*].volumeMount中挂载volume到container。

Volume的类型

ConfigMap

可以将ConfigMap的值注入到volume中。这样可以在pod中使用config map。同时,Volume中的值会随着ConfigMap的修改而自动更新。

在Volume中使用ConfigMap的用法如下:

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: configmap-pod
  5. spec:
  6. containers:
  7. - name: test
  8. image: busybox
  9. volumeMounts:
  10. - name: config-vol
  11. mountPath: /etc/config
  12. volumes:
  13. - name: config-vol
  14. configMap:
  15. name: log-config
  16. items:
  17. - key: log_level
  18. path: log_level

这里例子将名字为log-config的config map中key为log_level的值,作为文件log_level的内容,放入config-vol的根目录。然后把config-vol挂载到/etc/config,目录。也就是container中/etc/config/log_level文件的内容为log-config中log_level的值。

downwardAPI

可以使用DownWard API的方式,将k8s资源的spec信息作为文件内容放入到volume中。

例子如下:

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: kubernetes-downwardapi-volume-example
  5. labels:
  6. zone: us-est-coast
  7. cluster: test-cluster1
  8. rack: rack-22
  9. annotations:
  10. build: two
  11. builder: john-doe
  12. spec:
  13. containers:
  14. - name: client-container
  15. image: k8s.gcr.io/busybox
  16. command: ["sh", "-c"]
  17. args:
  18. - while true; do
  19. if [[ -e /etc/podinfo/labels ]]; then
  20. echo -en ' '; cat /etc/podinfo/labels; fi;
  21. if [[ -e /etc/podinfo/annotations ]]; then
  22. echo -en ' '; cat /etc/podinfo/annotations; fi;
  23. sleep 5;
  24. done;
  25. volumeMounts:
  26. - name: podinfo
  27. mountPath: /etc/podinfo
  28. volumes:
  29. - name: podinfo
  30. downwardAPI:
  31. items:
  32. - path: "labels"
  33. fieldRef:
  34. fieldPath: metadata.labels
  35. - path: "annotations"
  36. fieldRef:
  37. fieldPath: metadata.annotations

此处volume使用了downwardAPI。volume中labels文件的内容为pod metadata的labels配置项内容,即:

  1. zone: us-est-coast
  2. cluster: test-cluster1
  3. rack: rack-22

annotation文件的内容为为pod metadata的annotations配置项内容,即:

  1. build: two
  2. builder: john-doe

emptyDir

生命周期和pod一样。emptyDir的初始状态为一个没有任何内容的volume。如果Pod从集群节点上移除,那么emptyDir类型的volume中的内容会被清除。

Container遇到崩溃或重启,这时候Pod本身不会受任何影响,这种情况下emptyDir volume中的数据会保留。Container重启之后数据仍然可见。

emptyDir volume具有的这种特性适合如下场景使用:

  • 存放临时文件
  • 存放检查点,供container崩溃后恢复用

默认来说emptyDir类型volume的物理存储在硬盘,SSD或网络设备上。可以设置emptyDir.medium为Memory,这时候k8s会使用tempfs(基于内存的文件系统)。此时volume的容量限制收到container的内存配额的制约。

配置样例为:

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: fortune
  5. spec:
  6. containers:
  7. - image: luksa/fortune
  8. name: html-generator
  9. volumeMounts:
  10. - name: html
  11. mountPath: /var/htdocs
  12. - image: nginx:alpine
  13. name: web-server
  14. volumeMounts:
  15. - name: html
  16. mountPath: /usr/share/nginx/html
  17. readOnly: true
  18. ports:
  19. - containerPort: 80
  20. protocol: TCP
  21. volumes:
  22. - name: html
  23. emptyDir: {}

使用tempfs(内存)的emptyDir volume的配置样例如下;

  1. volumes:
  2. - name: html
  3. emptyDir:
  4. medium: Memory

gitRepo(已废弃)

gitRepo比较简单:先准备一个emptyDir类型的volume,再clone一个git repo到volume,然后把volume mount到container。

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: gitrepo-volume-pod
  5. spec:
  6. containers:
  7. - image: nginx:alpine
  8. name: web-server
  9. volumeMounts:
  10. - name: html
  11. mountPath: /usr/share/nginx/html
  12. readOnly: true
  13. ports:
  14. - containerPort: 80
  15. protocol: TCP
  16. volumes:
  17. - name: html
  18. gitRepo:
  19. repository: https://github.com/luksa/kubia-website-example.git
  20. revision: master
  21. directory: .

hostPath

此模式挂载pod宿主机文件系统中的文件或目录到pod。

hostPath必须指定一个path参与,用于指定使用宿主机哪个目录。

除此之外还有一个可选的type参数,有如下值可供配置:

  • (空,什么都不写):不进行任何检查
  • DirectoryOrCreate:如果path对应的目录不存在,自动创建一个目录,权限为0755,所属用户和用户组于kubelet相同。
  • Directory:path对应的目录必须存在。
  • FileOrCreate:如果path对应的文件不存在,自动创建一个空文件,权限为0644,所属用户和用户组于kubelet相同。
  • File:path对应的文件必须存在。
  • Socket:path必须对应一个unix socket。
  • CharDevice:path必须对应一个character device。
  • BlockDevice:path必须对应一个block device。

需要注意的是由于hostPath类型volume的数据和宿主机强绑定,如果pod停止后被schedule到其他节点,pod读取到的数据会有变化。

使用hostPath的例子:

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: test-pd
  5. spec:
  6. containers:
  7. - image: k8s.gcr.io/test-webserver
  8. name: test-container
  9. volumeMounts:
  10. - mountPath: /test-pd
  11. name: test-volume
  12. volumes:
  13. - name: test-volume
  14. hostPath:
  15. # directory location on host
  16. path: /data
  17. # this field is optional
  18. type: Directory

local

local模式支持使用磁盘,分区或者是目录。local还支持使用静态创建的PersistentVolume,不支持Dynamic provisioning(使用PVC的方式)。

与hostPath不同的是,local模式无需手动配置将pod调度到固定的node上。local模式系统通过volume的node affinity配置来感知volume的node限制(volume只能生成在特定的node上)。

使用例子:

  1. apiVersion: v1
  2. kind: PersistentVolume
  3. metadata:
  4. name: example-pv
  5. spec:
  6. capacity:
  7. storage: 100Gi
  8. volumeMode: Filesystem
  9. accessModes:
  10. - ReadWriteOnce
  11. persistentVolumeReclaimPolicy: Delete
  12. storageClassName: local-storage
  13. local:
  14. path: /mnt/disks/ssd1
  15. nodeAffinity:
  16. required:
  17. nodeSelectorTerms:
  18. - matchExpressions:
  19. - key: kubernetes.io/hostname
  20. operator: In
  21. values:
  22. - example-node

nodeAffinity必须配置。这个例子创建出的PersistentVolume必须创建在hostname包含example-node的节点上。

VolumeMode默认值为Filesystem。可以配置为Block,将volume作为块设备使用。

使用local模式的时候建议配套的StorageClass的volumeBindingMode设置为WaitForFirstConsumer。如下所示:

  1. apiVersion: storage.k8s.io/v1
  2. kind: StorageClass
  3. metadata:
  4. name: local-storage
  5. provisioner: kubernetes.io/no-provisioner
  6. volumeBindingMode: WaitForFirstConsumer

延迟volume绑定可以允许在volume绑定的时候考虑到pod中配置的一些限制,例如node资源限制,node选择器和pod affinity以及pod anti-affinity。

persistentVolumeClaim

使用PVC声明式的创建所需的PersistentVolume。这个稍后在PersistentVolume中介绍。

projected

映射多个类型的配置(数据源)到volume中。相当于多种volume合并使用。

可以映射的volume类型为:

  • secret
  • downwardAPI
  • configMap
  • serviceAccountToken

所有的volume数据源要求必须和使用它的pod在同一个namespace之下。

一个使用例子如下:

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: volume-test
  5. spec:
  6. containers:
  7. - name: container-test
  8. image: busybox
  9. volumeMounts:
  10. - name: all-in-one
  11. mountPath: "/projected-volume"
  12. readOnly: true
  13. volumes:
  14. - name: all-in-one
  15. projected:
  16. sources:
  17. - secret:
  18. name: mysecret
  19. items:
  20. - key: username
  21. path: my-group/my-username
  22. - downwardAPI:
  23. items:
  24. - path: "labels"
  25. fieldRef:
  26. fieldPath: metadata.labels
  27. - path: "cpu_limit"
  28. resourceFieldRef:
  29. containerName: container-test
  30. resource: limits.cpu
  31. - configMap:
  32. name: myconfigmap
  33. items:
  34. - key: config
  35. path: my-group/my-config

使用subPath

通常我们绑定volume时,映射的是volume的根目录。我们可以通过指定subPath参数,将volume中的其他目录挂载到container中。对于一个pod多个container,且多处使用同一个volume的场景最为适用。

例子如下:

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: my-lamp-site
  5. spec:
  6. containers:
  7. - name: mysql
  8. image: mysql
  9. env:
  10. - name: MYSQL_ROOT_PASSWORD
  11. value: "rootpasswd"
  12. volumeMounts:
  13. - mountPath: /var/lib/mysql
  14. name: site-data
  15. subPath: mysql
  16. - name: php
  17. image: php:7.0-apache
  18. volumeMounts:
  19. - mountPath: /var/www/html
  20. name: site-data
  21. subPath: html
  22. volumes:
  23. - name: site-data
  24. persistentVolumeClaim:
  25. claimName: my-lamp-site-data

这个例子中mysql和php两个container使用同一个volume site-data。Volume的mysql目录映射到了mysql container的/var/lib/mysql。Volume的html目录映射到了php container的/var/www/html。

资源使用

emptyDir使用磁盘时的限制取决于kubelet所在的文件系统(/var/lib/kubelet)。emptyDir或者hostPath占用多大磁盘空间是没有限制的。

注:本文转载自blog.csdn.net的liu_weiliang10405的文章"https://blog.csdn.net/liu_weiliang10405/article/details/123910198"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2491) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top