k8s-存储卷介绍
存储卷
Why:数据与镜像解耦,以及容器间的数据共享;
What:k8s抽象出的一个对象,用来保存数据,做存储用。
常用的几种存储卷:
emptyDir:本地临时卷(容器内部)–当容器删除,数据永久删除。
hostPath:本地卷(宿主机)–将宿主机节点的文件或目录挂载到集群中,pod删除,卷不会删除,需要注意调度问题,除非是共享存储或者指定调度。
nfs:共享卷
configmap/secret:配置中心
PV/PVC
挂载基础容器的TCP/IP协议栈,文件目录等。
k8s.gcr.io/pause 基础容器
示例
empryDir
emptyDir多使用为pod内多个容器之间共享存储目录,实现某种资源共享目的。
emptyDir实际是将Volume的内容写在Pod所在节点的磁盘上,另外emptyDir也可以设置存储介质为内存,如下所示,medium设置为Memory。
volumes: - name: html emptyDir: medium: Memory
spec: restartPolicy: Always serviceAccountName: default initContainers: - name: init-config image: xxx:10006/k8s/busybox:1.28 imagePullPolicy: IfNotPresent command: ["/bin/sh", "-c", "ln -sf /mnt/nginx/test.conf /etc/nginx/conf.d/default.conf"] volumeMounts: - name: nginx-default-config mountPath: /mnt/nginx - name: nginx-conf-d mountPath: /etc/nginx/conf.d containers: - name: nginx-configmap-container image: xxx:10006/k8s/nginx:latest imagePullPolicy: IfNotPresent volumeMounts: - name: nginx-default-config mountPath: /mnt/nginx - name: nginx-conf-d mountPath: /etc/nginx/conf.d volumes: - name: nginx-default-config configMap: name: nginx-default-config- name: nginx-conf-d emptyDir: {} #nodeSelector: # onne: north
hostPath
HostPath是一种持久化存储,emptyDir里面的内容会随着Pod的删除而消失,但HostPath不会,如果对应的Pod删除,HostPath Volume里面的内容依然存在于节点的目录中,如果后续重新创建Pod并调度到同一个节点,挂载后依然可以读取到之前Pod写的内容。
HostPath存储的内容与节点相关,所以它不适合像数据库这类的应用,想象下如果数据库的Pod被调度到别的节点了,那读取的内容就完全不一样了。
记住永远不要使用HostPath存储跨Pod的数据,一定要把HostPath的使用范围限制在读取节点文件上,这是因为Pod被重建后不确定会调度哪个节点上,写文件可能会导致前后不一致。
#apiVersion: extensions/v1beta1 apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment namespace: linux40 spec: replicas: 1 selector: matchLabels: app: ng-deploy-80 template: metadata: labels: app: ng-deploy-80 spec: containers: - name: ng-deploy-80 image: nginx imagePullPolicy: IfNotPresent ports: - containerPort: 80 volumeMounts: - mountPath: /data/mysql //挂载容器的目录路径 name: data-volume //选择挂载哪个名称 volumes: - name: data-volume hostPath: //卷类型 path: /data/mysql //可以预先创建,也可以不用创建
查看容器运行的节点,去对应节点查看
]# kubectl get pods -A -o wide ]# echo "hello world" > /data/mysql/index.html
在容器查看数据是否已经同步
]# kubectl exec -it nginx-deployment-758f46d4fb-vzkn7 -n linux40 /bin/sh # cat /data/mysql/index.html hello world
网络共享存储NFS
#apiVersion: extensions/v1beta1 apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment namespace: linux40 spec: replicas: 1 selector: matchLabels: app: ng-deploy-80 template: metadata: labels: app: ng-deploy-80 spec: containers: - name: ng-deploy-80 image: nginx ports: - containerPort: 80 volumeMounts: - mountPath: /usr/share/nginx/html name: linux40-nfs1-volume - mountPath: /usr/share/nginx/html/data name: linux40-nfs2-volume volumes: - name: linux40-nfs1-volume nfs: server: 192.168.64.110 //NFS权限确保允许pod和node节点的网段挂载 path: /root/data/nfs1 - name: linux40-nfs2-volume nfs: server: 192.168.64.110 path: /root/data/nfs2
查看pod挂载
]# kubectl exec -it nginx-deployment-6bc6445496-vh8qh -n linux40 /bin/bash root@nginx-deployment-6bc6445496-vh8qh:/# df -hT Filesystem Type Size Used Avail Use% Mounted on overlay overlay 46G 2.7G 43G 6% / tmpfs tmpfs 64M 0 64M 0% /dev tmpfs tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup /dev/mapper/centos-root xfs 46G 2.7G 43G 6% /etc/hosts shm tmpfs 64M 0 64M 0% /dev/shm 192.168.64.110:/root/data/nfs1 nfs4 50G 3.4G 47G 7% /usr/share/nginx/html tmpfs tmpfs 1.9G 12K 1.9G 1% /run/secrets/kubernetes.io/serviceaccount 192.168.64.110:/root/data/nfs2 nfs4 50G 3.4G 47G 7% /usr/share/nginx/html/data tmpfs tmpfs 1.9G 0 1.9G 0% /proc/acpi tmpfs tmpfs 1.9G 0 1.9G 0% /proc/scsi tmpfs tmpfs 1.9G 0 1.9G 0% /sys/firmware
可以实现同一个NFS挂载多个pod,也可以一个pod挂载多个NFS
PV和PVC
https://www.cnblogs.com/rtnb/p/15664690.html
越学越感到自己的无知
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署