关于k8s集群的存储卷

目录

1.emptyDir存储卷

2.hostPath存储卷

3.nfs共享存储卷


容器磁盘上的文件的生命周期是短暂的,这就使得在容器中运行重要应用时会出现一些问题。首先,当容器崩溃时,kubelet 会重启它,但是容器中的文件将丢失------容器以干净的状态(镜像最初的状态)重新启动。其次,在Pod中同时运行多个容器时,这些容器之间通常需要共享文件。Kubernetes 中的Volume抽象就很好的解决了这些问题。Pod中的容器通过Pause容器共享Volume。

1.emptyDir存储卷

容器之间共享数据无持久化

当Pod被分配给节点时,首先创建emptyDir卷,并且只要该Pod在该节点上运行,该卷就会存在。正如卷的名字所述,它最初是空的。Pod 中的容器可以读取和写入emptyDir卷中的相同文件,尽管该卷可以挂载到每个容器中的相同或不同路径上。当出于任何原因从节点中删除 Pod 时,emptyDir中的数据将被永久删除。

示例:

复制代码
vim pod.yaml
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: demo.pod
  name: demo.pod
spec:                      
  volumes:                    #定义一个存储卷
  - name: tan-vol             #定义存储卷名字
    emptyDir: {}
  containers:
  - image: soscscs/myapp:v1
    name: myapp
    ports:
    - containerPort: 80
    resources: {}
    volumeMounts:
    - name: tan-vol
      mountPath: /mnt/
  - image: busybox:1.28
    name: busybox
    volumeMounts:             #设置挂载数据卷
    - name: tan-vol           #设置挂载数据卷名字
      mountPath: /data/       #设置挂载目录(容器内)
    command:                  #设置操作命令
    - sh
    - -c
    - "while true; do echo '123' >> /data/scj.txt; sleep 2; done"

  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}

kubectl apply -f pod.yaml


验证数据持久化:

复制代码
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: demo.pod
  name: demo.pod
spec:
  volumes:
  - name: tan-vol
    emptyDir: {}
  containers:
  - image: soscscs/myapp:v1
    name: myapp
    ports:
    - containerPort: 80
    resources: {}
    volumeMounts:
    - name: tan-vol
      mountPath: /mnt/
  - image: busybox:1.28
    name: busybox
    volumeMounts:
    - name: tan-vol
      mountPath: /data/
    command:
    - sh
    - -c
    - "while true; do echo '456' >> /data/scj.txt; sleep 2; done"     #修改内容重新生成

  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}


kubectl delete -f pod.yaml && kubectl apply -f pod.yaml   #更新数据

2.hostPath存储卷

挂载宿主机文件/目录,实现数据共享,只能在单机上实现持久化

hostPath卷将 node 节点的文件系统中的文件或目录挂载到集群中。
hostPath可以实现持久存储,但是在node节点故障时,也会导致数据的丢失。

示例:

复制代码
vim demo3.yaml
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: demo3
  name: demo3
spec:
  volumes:
  - name: tan-vol
    hostPath:
      path: /opt/tan
      type: DirectoryOrCreate
  containers:
  - image: soscscs/myapp:v1
    name: demo
    ports:
    - containerPort: 80
    resources: {}
    volumeMounts:
    - name: tan-vol
      mountPath: /usr/share/nginx/html
      readOnly: false
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}
 
kubectl apply -f demo3.yaml 



测试不同节点数据是否能共享

复制代码
vim demo3.yaml 
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: demo3
  name: demo4               #修改资源名
spec:
  nodeName: node01          #指定node节点创建资源
  volumes:
  - name: tan-vol
    hostPath:
      path: /opt/tan
      type: DirectoryOrCreate
  containers:
  - image: soscscs/myapp:v1
    name: demo
    ports:
    - containerPort: 80
    resources: {}
    volumeMounts:
    - name: tan-vol
      mountPath: /usr/share/nginx/html
      readOnly: false
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}

kubectl apply -f demo3.yaml

3.nfs共享存储卷

跨node节点的Pod共享数据

复制代码
配置nfs,任选一台服务器

systemctl disable --now firewalld.service
setenforce 0

yum install -y rpcbind nfs-utils
systemctl enable --now rpcbind nfs
mkdir /opt/nfs  #创建共享目录
vim /etc/exports
/opt/nfs 192.168.9.0/24(rw,sync,no_root_squash)

exportfs -avr   #共享
     

确保两台node节点的rpcbind是开启状态

复制代码
vim demo4.yaml
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: demo4
  name: demo4
spec:
  volumes:                            #定义一个存储卷
  - name: tc-vol                      #定义存储卷名字
    nfs:                              #存储卷类型为nfs
      path: /opt/nfs                  #NFS服务器上的共享目录路径
      server: 192.168.9.116           #NFS服务器的IP地址
  containers:
  - image: soscscs/myapp:v1
    name: demo
    ports:
    - containerPort: 80
    resources: {}
    volumeMounts:                    #存储卷挂载
    - name: tc-vol                   #挂载的存储卷
      mountPath: /mnt                #存储卷挂载目录
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}

kubectl apply -f demo4.yaml


实现跨节点通信

复制代码
vim demo4.yaml 
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: demo4
  name: demo5
spec:
  nodeName: node01            #指定节点创建
  volumes:
  - name: tc-vol
    nfs:
      path: /opt/nfs
      server: 192.168.9.116
  containers:
  - image: soscscs/myapp:v1
    name: demo
    ports:
    - containerPort: 80
    resources: {}
    volumeMounts:
    - name: tc-vol
      mountPath: /mnt
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}

kubectl apply -f demo4.yaml
相关推荐
忆~遂愿2 小时前
本地片库怎么在外面打开?Plex + cpolar 搭一套可远程访问的私人影音库
docker·容器
Thneonl2 小时前
你的 Pod 为什么 Pending:调度器两阶段
后端·kubernetes
不吃香菜kkk、2 小时前
CI/CD(GitOps)学习与部署手册
运维·云原生·容器·kubernetes·云计算·jenkins·argocd
ChaITSimpleLove3 小时前
云原生性能对决:JDK21虚拟线程+GraalVM vs .NET10/11 技术栈深度对比
微服务·云原生·serverless·graalvm native·native aot·runtime async·.net11/java21
九皇叔叔15 小时前
Kubernetes 资源管理方式详解:命令式与声明式管理
docker·容器·k8s
春天花会开13118 小时前
Supabase 自部署 Edge Functions 超时从 60s 延长到 360s 完整复盘
运维·云原生
程序猿小郑20 小时前
Docker Compose 构建完整服务实战指南:从入门到最佳实践
docker·容器
ysu_03141 天前
【2026】K8s GPU调度空占怎么解?Kueue与Volcano Gang配置
云原生·kubernetes·gpu算力·volcano·ai基础设施·kueue·gang scheduling
哈__2 天前
KES-Operator重塑Kubernetes环境下的KES数据库集群管理
数据库·kubernetes·operator·kes
九皇叔叔2 天前
K8S 资源菜单
docker·容器·kubernetes·k8s