K8S存储之emptyDir、hostPath、NFS

本文详细介绍了 Kubernetes 中三种不同的持久化存储方式:emptyDir、hostPath 和 NFS。emptyDir 类型的卷在容器内部提供临时存储,数据不会跨 pod 保留;hostPath 将 pod 的卷直接映射到宿主机目录,实现 pod 与宿主机共享数据;NFS 则通过挂载远程 NFS 服务器的共享目录,使得多个 pod 能共享存储空间,适合需要跨节点共享数据的场景。
摘要由CSDN通过智能技术生成

emptyDir

#定义yaml文件,创建容器
[root@k8s-master-01 volumeTest]# cat podEmptyDir.yaml
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: www04
  name: www04
spec:
  volumes:
  - name: v1  #定义的volume的名字
    emptyDir: {} #随机定义宿主机中的挂载目录
  containers:
  - image: nginx
    imagePullPolicy: IfNotPresent
    name: www04
    resources: {}
    volumeMounts:
    - name: v1 #与预先定义的volumes名字相同
      mountPath: /data  #容器中的挂载点
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}
[root@k8s-master-01 volumeTest]# kubectl apply -f podEmptyDir.yaml
pod/www04 created
[root@k8s-master-01 volumeTest]# kubectl get pods
NAME    READY   STATUS    RESTARTS   AGE
www04   1/1     Running   0          32s
#在调度到的节点查看容器信息
[root@k8s-node-01 ~]# docker ps -a | grep www04
4181d673e28b   605c77e624dd                                        "/docker-entrypoint.…"   3 minutes ago   Up 3 minutes                         k8s_www04_www04_app01_bb2ba6e3-a88b-4f94-8700-310c57a453f4_0
c0d911e5b886   registry.aliyuncs.com/google_containers/pause:3.6   "/pause"                 3 minutes ago   Up 3 minutes                         k8s_POD_www04_app01_bb2ba6e3-a88b-4f94-8700-310c57a453f4_0
[root@k8s-node-01 ~]# docker inspect 4181d673e28b | grep data
                "/var/lib/kubelet/pods/bb2ba6e3-a88b-4f94-8700-310c57a453f4/volumes/kubernetes.io~empty-dir/v1:/data",
                "Destination": "/data",
[root@k8s-node-01 ~]# ls /var/lib/kubelet/pods/bb2ba6e3-a88b-4f94-8700-310c57a453f4/volumes/kubernetes.io~empty-dir/v1
[root@k8s-node-01 ~]# cd /var/lib/kubelet/pods/bb2ba6e3-a88b-4f94-8700-310c57a453f4/volumes/kubernetes.io~empty-dir/v1
[root@k8s-node-01 v1]# ls
[root@k8s-node-01 v1]#
#主节点进入容器并在/data目录创建文件,之后再查看node节点文件情况
[root@k8s-master-01 volumeTest]# kubectl exec -it www04 -- bash
root@www04:/# ls /data
root@www04:/# cd /data/
root@www04:/data# touch emptyDirTest.txt
root@www04:/data#
[root@k8s-node-01 v1]# ls
emptyDirTest.txt
#删除pod查看文件情况,emptyDir是以内存为介质的存储方式,故删除容器后文件也会消失。
[root@k8s-master-01 volumeTest]# kubectl delete pod www04
pod "www04" deleted
[root@k8s-node-01 v1]# cd /var/lib/kubelet/pods/bb2ba6e3-a88b-4f94-8700-310c57a453f4/volumes/kubernetes.io~empty-dir/v1
-bash: cd: /var/lib/kubelet/pods/bb2ba6e3-a88b-4f94-8700-310c57a453f4/volumes/kubernetes.io~empty-dir/v1: 没有那个文件或目录

 hostPath

#创建yaml文件并应用
[root@k8s-master-01 volumeTest]# cat podHostPath.yaml
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: www04
  name: www04
spec:
  volumes:
  - name: v1
    hostPath:
      path: /hostPathTest
  containers:
  - image: nginx
    imagePullPolicy: IfNotPresent
    name: www04
    resources: {}
    volumeMounts:
    - name: v1
      mountPath: /data
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}
[root@k8s-master-01 volumeTest]# kubectl apply -f podHostPath.yaml
pod/www04 created
[root@k8s-master-01 volumeTest]# kubectl get pods -owide
NAME    READY   STATUS    RESTARTS   AGE   IP            NODE          NOMINATED NODE   READINESS GATES
www04   1/1     Running   0          20s   10.244.1.21   k8s-node-01   <none>           <none>
#在调度到的节点上可以看到/hostPathTest目录已被创建
[root@k8s-node-01 v1]# cd /hostPathTest/
[root@k8s-node-01 hostPathTest]#

NFS

#安装配置nfs
[root@k8s-node-01 ~]# yum install nfs-utils -y
[root@k8s-node-01 ~]# systemctl enable nfs-server.service --now
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.
[root@k8s-node-01 ~]# mkdir -p /nfs
[root@k8s-node-01 ~]# vim /etc/exports
[root@k8s-node-01 nfs]# cat /etc/exports
/nfs *(rw,no_root_squash)  #不压缩root权限
##刷新使nfs生效
[root@k8s-node-01 nfs]# exportfs -arv
exporting *:/nfs
##在worker上也需要安装nfs-utils。安装完后查看是否可访问
[root@k8s-node-01 nfs]# showmount -e 192.168.71.134
Export list for 192.168.71.134:
/nfs *
##挂载与umount测试,无任何报错说明服务正常
[root@k8s-node-01 nfs]# mount 192.168.71.134:/nfs /mnt ; umount /mnt
#创建使用nfs的容器
[root@k8s-master-01 volumeTest]# more podNfs.yaml

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: www04
  name: www04
spec:
  volumes:
  - name: nfsv1
    nfs:
      server: 192.168.71.134
      path: /nfs
  containers:
  - image: nginx
    imagePullPolicy: IfNotPresent
    name: www04
    resources: {}
    volumeMounts:
    - name: nfsv1
      mountPath: /data
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}
[root@k8s-master-01 volumeTest]# kubectl get pod -o wide
NAME    READY   STATUS    RESTARTS   AGE     IP            NODE          NOMINATED NODE   READINESS GATES
www04   1/1     Running   0          3m14s   10.244.1.41   k8s-node-01   <none>           <none>
#进入容器查看nfs挂在状况。挂载实际形式为宿主机挂载nfs目录后再在pod中挂载宿主机的目录。
[root@k8s-master-01 volumeTest]# kubectl exec -it www04 -- bash
root@www04:/# ls
bin  boot  data  dev  docker-entrypoint.d  docker-entrypoint.sh  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@www04:/# df -h
Filesystem               Size  Used Avail Use% Mounted on
overlay                   17G  8.0G  9.1G  47% /
tmpfs                     64M     0   64M   0% /dev
tmpfs                    3.9G     0  3.9G   0% /sys/fs/cgroup
192.168.71.134:/nfs       17G  8.0G  9.1G  47% /data
/dev/mapper/centos-root   17G  8.0G  9.1G  47% /etc/hosts
shm                       64M     0   64M   0% /dev/shm
tmpfs                    7.6G   12K  7.6G   1% /run/secrets/kubernetes.io/serviceaccount
tmpfs                    3.9G     0  3.9G   0% /proc/acpi
tmpfs                    3.9G     0  3.9G   0% /proc/scsi
tmpfs                    3.9G     0  3.9G   0% /sys/firmware
##在pod实际运行的worker节点查看挂载状态
[root@k8s-node-01 nfs]# df -h | grep 192
192.168.71.134:/nfs       17G  8.0G  9.1G   47% /var/lib/kubelet/pods/6d388500-0e70-4991-82f9-d21b82faed01/volumes/kubernetes.io~nfs/nfsv1
##进入容器创建文件后在nfs共享目录中查看
[root@k8s-master-01 volumeTest]# kubectl exec -it www04 -- bash
root@www04:/# touch /data/test.txt
root@www04:/#
[root@k8s-node-01 nfs]# ls
test.txt

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Kubernetes (K8s) 支持使用 NFS(Network File System)作为持久化存储解决方案。NFS 是一种分布式文件系统协议,允许将远程文件系统挂载到本地服务器上。 要使用 NFS 进行持久化存储,你需要先设置一个 NFS 服务器,并在 Kubernetes 集群中配置一个 NFS 持久卷。以下是一些步骤: 1. 配置 NFS 服务器:你需要设置一个 NFS 服务器并将其配置为共享文件系统。确保你已经安装并配置好了 NFS 服务器软件。 2. 创建 NFS 持久卷:在 Kubernetes 中,你可以使用 PersistentVolume(PV)和 PersistentVolumeClaim(PVC)对象来定义持久卷和持久卷声明。创建一个 PV 来表示 NFS 服务器上的共享目录,并为该 PV 创建一个 PVC。 3. 部署应用程序:使用创建的 PVC,在你的应用程序中声明一个持久卷。你可以通过将 PVC 挂载到应用程序的 Pod 中来实现持久化存储。 以下是一个示例的 YAML 文件,演示了如何在 Kubernetes 中配置一个 NFS 持久卷: ``` apiVersion: v1 kind: PersistentVolume metadata: name: nfs-pv spec: capacity: storage: 5Gi accessModes: - ReadWriteMany nfs: server: <NFS_SERVER_IP> path: /path/to/shared/directory --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: nfs-pvc spec: accessModes: - ReadWriteMany resources: requests: storage: 5Gi storageClassName: "" selector: matchLabels: name: nfs-pv ``` 替换 `<NFS_SERVER_IP>` 和 `/path/to/shared/directory` 为你 NFS 服务器的 IP 地址和共享目录的路径。然后,使用 kubectl apply 命令来部署这个 YAML 文件。 一旦 PVC 和 PV 创建成功,你可以在你的应用程序中使用该 PVC 来挂载 NFS 持久卷,并在 Pod 中进行持久化存储。 这就是使用 NFS 进行持久化存储的基本步骤。希望对你有所帮助!如果还有其他问题,请继续提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值