kubernetes存储(二)——K8S的Volumes配置管理(emptyDir卷、hostPath卷、nfs 卷、持久卷PV与持久卷声明PVC)

文章目录

  • 1.Volumes的介绍
    • 1.1 emptyDir卷
    • 1.2 hostPath卷
    • 1.3 nfs 卷
    • 1.4 持久卷PV与持久卷声明PVC
      • 1.创建pv
      • 2.创建pvc
      • 3. Pod挂载PV

参考官网:https://kubernetes.io/zh/docs/concepts/storage/volumes/

1.Volumes的介绍

容器中的文件在磁盘上是临时存放的,这给容器中运行的特殊应用程序带来一些问题。首先,当容器崩溃时,kubelet 将重新启动容器,容器中的文件将会丢失, 因为容器会以干净的状态重建。其次,当在一个 Pod 中同时运行多个容器时,常常需要在这些容器之间共享文件。 Kubernetes 抽象出 Volume 对象来解决这两 个问题。

Kubernetes 卷具有明确的生命周期,与包裹它的 Pod 相同。 因此,卷比 Pod 中运行的任何容器的存活期都长,在容器重新启动时数据也会得到保留。 当然,当一个 Pod 不再存在时,卷也将不再存在。也许更重要的是,Kubernetes 可以支持许多类型的卷,Pod 也能同时使用任意数量的卷。

卷不能挂载到其他卷,也不能与其他卷有硬链接。 Pod 中的每个容器必须独立地指定每个卷的挂载位置。

Kubernetes 支持下列类型的卷:
• awsElasticBlockStore 、azureDisk、azureFile、cephfs、cinder、configMap、csi • downwardAPI、emptyDir、fc (fibre channel)、flexVolume、flocker • gcePersistentDisk、gitRepo (deprecated)、glusterfs、hostPath、iscsi、local、
• nfs、persistentVolumeClaim、projected、portworxVolume、quobyte、rbd • scaleIO、secret、storageos、vsphereVolume

1.1 emptyDir卷

当 Pod 指定到某个节点上时,首先创建的是一个 emptyDir 卷,并且只要 Pod 在该节点上运行,卷就一直存在。 就像它的名称表示的那样,卷最初是空的。 尽管 Pod 中的容器挂载 emptyDir 卷的路径可能相同也可能不同,但是这些容器都可以读写 emptyDir 卷中相同的文件。 当 Pod 因为某些原因被从节点上删除时, emptyDir 卷中的数据也会永久删除。

emptyDir 的使用场景:
• 缓存空间,例如基于磁盘的归并排序。
• 为耗时较长的计算任务提供检查点,以便任务能方便地从崩溃前状态恢复执行。
• 在 Web 服务器容器服务数据时,保存内容管理器容器获取的文件。

默认情况下, emptyDir 卷存储在支持该节点所使用的介质上;这里的介质可以是磁盘或SSD 或网络存储。 但是,可以将 emptyDir.medium 字段设 置为 “Memory”,以告诉 Kubernetes 安装 tmpfs(基于内存的文件系统)。 虽然 tmpfs 速度非常快,但是要注意它与磁盘不同。 tmpfs 在节点重启时会被清除,并且所写入的所有文件都会计入容器的内存消耗,受容器内存限制约束。

apiVersion: v1
kind: Pod
metadata:
  name: vol1
spec:
  containers:
  - image: busyboxplus
    name: vm1
    command: ["sleep", "300"]
    volumeMounts:
    - mountPath: /cache
      name: cache-volume
  - name: vm2
    image: nginx
    volumeMounts:
    - mountPath: /usr/share/nginx/html
      name: cache-volume
  volumes:
  - name: cache-volume
    emptyDir:
      medium: Memory
      sizeLimit: 100Mi
[kubeadm@server1 ~]$ mkdir vol
[kubeadm@server1 ~]$ cd vol/
[kubeadm@server1 vol]$ ls
[kubeadm@server1 vol]$ vim vol1.yml
[kubeadm@server1 vol]$ kubectl apply -f vol1.yml 
pod/vol1 created
[kubeadm@server1 vol]$ kubectl get pod
NAME                        READY   STATUS    RESTARTS   AGE
my-nginx-56794ff6cb-5qxlq   1/1     Running   0          12h
mypod                       1/1     Running   0          5h20m
vol1                        2/2     Running   0          5s
[kubeadm@server1 vol]$ kubectl get pod -o wide
NAME                        READY   STATUS    RESTARTS   AGE     IP            NODE      NOMINATED NODE   READINESS GATES
my-nginx-56794ff6cb-5qxlq   1/1     Running   0          12h     10.244.1.72   server2   <none>           <none>
mypod                       1/1     Running   0          5h20m   10.244.1.75   server2   <none>           <none>
vol1                        2/2     Running   0          21s     10.244.2.95   server3   <none>           <none>
[kubeadm@server1 vol]$ curl 10.244.2.95
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.19.0</center>
</body>
</html>

kubernetes存储(二)——K8S的Volumes配置管理(emptyDir卷、hostPath卷、nfs 卷、持久卷PV与持久卷声明PVC)_第1张图片
kubernetes存储(二)——K8S的Volumes配置管理(emptyDir卷、hostPath卷、nfs 卷、持久卷PV与持久卷声明PVC)_第2张图片
kubernetes存储(二)——K8S的Volumes配置管理(emptyDir卷、hostPath卷、nfs 卷、持久卷PV与持久卷声明PVC)_第3张图片
kubernetes存储(二)——K8S的Volumes配置管理(emptyDir卷、hostPath卷、nfs 卷、持久卷PV与持久卷声明PVC)_第4张图片
kubernetes存储(二)——K8S的Volumes配置管理(emptyDir卷、hostPath卷、nfs 卷、持久卷PV与持久卷声明PVC)_第5张图片
消耗内存

[kubeadm@server1 vol]$ kubectl exec -it vol1 -- sh
Defaulting container name to vm1.
Use 'kubectl describe pod/vol1 -n default' to see all of the containers in this pod.
sh: shopt: not found
[ root@vol1:/ ]$ cd cache/
[ root@vol1:/cache ]$ dd if=/dev/zero of=bigfile bs=1M count=100
100+0 records in
100+0 records out
[ root@vol1:/cache ]$ dd if=/dev/zero of=bigfile bs=1M count=100
100+0 records in
100+0 records out
[ root@vol1:/cache ]$ dd if=/dev/zero of=bigfile bs=1M count=300
300+0 records in
300+0 records out

kubernetes存储(二)——K8S的Volumes配置管理(emptyDir卷、hostPath卷、nfs 卷、持久卷PV与持久卷声明PVC)_第6张图片
在这里插入图片描述
注意:内存限制不是实时的, 可以看到文件超过sizeLimit,则一段时间后(1-2分钟)会被kubelet evict掉。之所以不是“立即” 被evict,是因为kubelet是定期进行检查的,这里会有一个时间差。

emptydir缺点:
• 不能及时禁止用户使用内存。虽然过1-2分钟kubelet会将Pod挤出,但是这个时间内,其实 对node还是有风险的;
• 影响kubernetes调度,因为empty dir并不涉及node的resources,这样会造成Pod“偷偷” 使用了node的内存,但是调度器并不知晓;
• 用户不能及时感知到内存不可用


1.2 hostPath卷

hostPath卷能将主机节点文件系统上的文件或目录挂载到您的 Pod 中。 虽然这不是大多数 Pod 需要的,但是它为一些应用程序提供了强大的逃生舱。

hostPath 用法:
• 运行一个需要访问 Docker 引擎内部机制的容器,挂载 /var/lib/docker 路径。
• 在容器中运行 cAdvisor 时,以 hostPath 方式挂载 /sys。
• 允许 Pod 指定给定的 hostPath 在运行 Pod 之前是否应该存在,是否应该创建以及应该以什么方式存在。

除了必需的 path 属性之外,用户可以选择性地为 hostPath 卷指定 type:
kubernetes存储(二)——K8S的Volumes配置管理(emptyDir卷、hostPath卷、nfs 卷、持久卷PV与持久卷声明PVC)_第7张图片
hostPath卷的注意:
• 具有相同配置(例如从 podTemplate 创建)的多个 Pod 会由于节点上文件的不同而在不同节点上有不同的行为。
• 当 Kubernetes 按照计划添加资源感知的调度时,这类调度机制将无法考虑由 hostPath 使用的资源。
• 基础主机上创建的文件或目录只能由 root 用户写入。您需要在 特权容器中以 root 身份运行进程,或者修改主机上的文件权限以便容器能够写入 hostPath 卷。

[kubeadm@server1 vol]$ cat vol1.yml 
apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - image: nginx
    name: test-container
    volumeMounts:
    - mountPath: /usr/share/nginx/html
      name: test-volume
  volumes:
  - name: test-volume
    hostPath:
      path: /data
      type: DirectoryOrCreate
[kubeadm@server1 vol]$ kubectl get pod
No resources found in default namespace.
[kubeadm@server1 vol]$ vim vol1.yml 
[kubeadm@server1 vol]$ kubectl apply -f vol1.yml 
pod/test-pd created
[kubeadm@server1 vol]$ kubectl get pod -o wide
NAME      READY   STATUS    RESTARTS   AGE   IP            NODE      NOMINATED NODE   READINESS GATES
test-pd   1/1     Running   0          6s    10.244.1.76   server2   <none>           <none>
[kubeadm@server1 vol]$ curl 10.244.1.76
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.19.0</center>
</body>
</html>
[kubeadm@server1 vol]$ curl 10.244.1.76
www.red.org

kubernetes存储(二)——K8S的Volumes配置管理(emptyDir卷、hostPath卷、nfs 卷、持久卷PV与持久卷声明PVC)_第8张图片
kubernetes存储(二)——K8S的Volumes配置管理(emptyDir卷、hostPath卷、nfs 卷、持久卷PV与持久卷声明PVC)_第9张图片
kubernetes存储(二)——K8S的Volumes配置管理(emptyDir卷、hostPath卷、nfs 卷、持久卷PV与持久卷声明PVC)_第10张图片
在这里插入图片描述


调度容器到server3

[kubeadm@server1 vol]$ cat vol1.yml 
apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  nodeSelector:
    kubernetes.io/hostname: server3
  containers:
  - image: nginx
    name: test-container
    volumeMounts:
    - mountPath: /usr/share/nginx/html
      name: test-volume
  volumes:
  - name: test-volume
    hostPath:
      path: /data
      type: DirectoryOrCreate

[kubeadm@server1 vol]$ kubectl delete -f vol1.yml 
pod "test-pd" deleted
[kubeadm@server1 vol]$ vim vol1.yml 
[kubeadm@server1 vol]$ kubectl apply -f vol1.yml 
pod/test-pd created
[kubeadm@server1 vol]$ kubectl get pod -o wide
NAME      READY   STATUS    RESTARTS   AGE   IP            NODE      NOMINATED NODE   READINESS GATES
test-pd   1/1     Running   0          4s    10.244.2.97   server3   <none>           <none>
[kubeadm@server1 vol]$ curl 10.244.2.97
www.redhat.com

kubernetes存储(二)——K8S的Volumes配置管理(emptyDir卷、hostPath卷、nfs 卷、持久卷PV与持久卷声明PVC)_第11张图片
kubernetes存储(二)——K8S的Volumes配置管理(emptyDir卷、hostPath卷、nfs 卷、持久卷PV与持久卷声明PVC)_第12张图片
kubernetes存储(二)——K8S的Volumes配置管理(emptyDir卷、hostPath卷、nfs 卷、持久卷PV与持久卷声明PVC)_第13张图片


1.3 nfs 卷

nfs 卷能将 NFS (网络文件系统) 挂载到您的 Pod 中。
不像 emptyDir 那样会在删除 Pod 的同时也会被删除,nfs 卷的内容在删除 Pod 时会被保存,卷只是被卸载掉了。
这意味着 nfs 卷可以被预先填充数据,并且这些数据可以在 Pod 之间"传递"。

在harbor仓库安装nfs服务器:
yum install -y nfs-utils.x86_64 注意:每个节点也需要安装
mkdir /nfsdata
vim /etc/exports

/nfsdata    *(rw,sync)

chmod 777 /nfsdata
systemctl enable nfs --now
showmount -e

在这里插入图片描述
kubernetes存储(二)——K8S的Volumes配置管理(emptyDir卷、hostPath卷、nfs 卷、持久卷PV与持久卷声明PVC)_第14张图片
在这里插入图片描述
在这里插入图片描述
nfs示例

[kubeadm@server1 vol]$ cat vol1.yml
apiVersion: v1 
kind: Pod 
metadata:  
  name: test-pd 
spec:  
  containers:  
  - image: nginx    
    name: test-container    
    volumeMounts:    
    - mountPath: /usr/share/nginx/html      
      name: test-volume  
  volumes:  
  - name: test-volume    
    nfs:      
      server: 172.25.1.11      
      path: /nfsdata
[kubeadm@server1 vol]$ kubectl get pod
No resources found in default namespace.
[kubeadm@server1 vol]$ vim vol1.yml 
[kubeadm@server1 vol]$ kubectl apply -f vol1.yml 
pod/test-pd created
[kubeadm@server1 vol]$ kubectl get pod -o wide
NAME      READY   STATUS    RESTARTS   AGE   IP            NODE      NOMINATED NODE   READINESS GATES
test-pd   1/1     Running   0          13s   10.244.1.77   server2   <none>           <none>
[kubeadm@server1 vol]$ curl 10.244.1.77
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.19.0</center>
</body>
</html>

[root@harbor ~]# cd /nfsdata/
[root@harbor nfsdata]# echo www.red.org > index.html
[root@harbor nfsdata]# ls
index.html

[kubeadm@server1 vol]$ curl 10.244.1.77
www.red.org

kubernetes存储(二)——K8S的Volumes配置管理(emptyDir卷、hostPath卷、nfs 卷、持久卷PV与持久卷声明PVC)_第15张图片
kubernetes存储(二)——K8S的Volumes配置管理(emptyDir卷、hostPath卷、nfs 卷、持久卷PV与持久卷声明PVC)_第16张图片
kubernetes存储(二)——K8S的Volumes配置管理(emptyDir卷、hostPath卷、nfs 卷、持久卷PV与持久卷声明PVC)_第17张图片
在这里插入图片描述


调度到server3

[kubeadm@server1 vol]$ cat vol1.yml
apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  nodeSelector:
    kubernetes.io/hostname: server3
  containers:
  - image: nginx
    name: test-container
    volumeMounts:
    - mountPath: /usr/share/nginx/html
      name: test-volume
  volumes:
  - name: test-volume
    nfs:
      server: 172.25.1.11
      path: /nfsdata

kubernetes存储(二)——K8S的Volumes配置管理(emptyDir卷、hostPath卷、nfs 卷、持久卷PV与持久卷声明PVC)_第18张图片
kubernetes存储(二)——K8S的Volumes配置管理(emptyDir卷、hostPath卷、nfs 卷、持久卷PV与持久卷声明PVC)_第19张图片


1.4 持久卷PV与持久卷声明PVC

PersistentVolume(持久卷,简称PV)是集群内,由管理员提供的网络存储的一部分。 就像集群 中的节点一样,PV也是集群中的一种资源。它也像Volume一样,是一种volume插件,但是它的生命周期却是和使用它的Pod相互独立的。PV这个API对象,捕获了诸如NFS、ISCSI、或其他 云存储系统的实现细节。

PersistentVolumeClaim(持久卷声明,简称PVC)是用户的一种存储请求。 它和Pod类似,Pod 消耗Node资源,而PVC消耗PV资源。Pod能够请求特定的资源(如CPU和内存)。PVC能够请求指定的大小和访问的模式(可以被映射为一次读写或者多次只读)

有两种PV提供的方式:静态和动态
• 静态PV:集群管理员创建多个PV,它们携带着真实存储的详细信息,这些存储对于集群用户是可用的。它们存在于Kubernetes API中,并可用于存储使用。
• 动态PV:当管理员创建的静态PV都不匹配用户的PVC时,集群可能会尝试专门地供给 volume给PVC。这种供给基于StorageClass。
• PVC与PV的绑定是一对一的映射。没找到匹配的PV,那么PVC会无限期得处于unbound未绑定状态。

使用:
Pod使用PVC就像使用volume一样。集群检查PVC,查找绑定的PV,并映射PV给Pod。对 于支持多种访问模式的PV,用户可以指定想用的模式。一旦用户拥有了一个PVC,并且 PVC被绑定,那么只要用户还需要,PV就一直属于这个用户。用户调度Pod,通过在Pod的 volume块中包含PVC来访问PV。

释放
当用户使用PV完毕后,他们可以通过API来删除PVC对象。当PVC被删除后,对应的PV就 被认为是已经是“released”了,但还不能再给另外一个PVC使用。前一个PVC的属于还存在于该PV中,必须根据策略来处理掉。

回收
PV的回收策略告诉集群,在PV被释放之后集群应该如何处理该PV。当前,PV可以被 Retained(保留)、 Recycled(再利用)或者Deleted(删除)。保留允许手动地再次声明 资源。对于支持删除操作的PV卷,删除操作会从Kubernetes中移除PV对象,还有对应的外 部存储(如AWS EBS,GCE PD,Azure Disk,或者Cinder volume)。动态供给的卷总是会被删除。

访问模式
ReadWriteOnce – 该volume只能被单个节点以读写的方式映射
ReadOnlyMany – 该volume可以被多个节点以只读方式映射
ReadWriteMany – 该volume可以被多个节点以读写的方式映射
在命令行中,访问模式可以简写为:
• RWO - ReadWriteOnce
• ROX - ReadOnlyMany
• RWX - ReadWriteMany

回收策略
• Retain:保留,需要手动回收
• Recycle:回收,自动删除卷中数据
• Delete:删除,相关联的存储资产,如AWS EBS,GCE PD,Azure Disk,or OpenStack Cinder卷都会被删除
当前,只有NFS和HostPath支持回收利用,AWS EBS,GCE PD,Azure Disk,or OpenStack Cinder卷支持删除操作。

状态:
• Available:空闲的资源,未绑定给PVC • Bound:绑定给了某个PVC
• Released:PVC已经删除了,但是PV还没有被集群回收
• Failed:PV在自动回收中失败了 • 命令行可以显示PV绑定的PVC名称。

NFS持久化存储实战: • 安装配置NFS服务:

 yum install -y nfs-utils 
  mkdir -m 777 /nfsdata 
 vim /etc/exports      
 /nfsdata *(rw,sync,no_root_squash) 
 systemctl enable --now rpcbind 
 systemctl enbale --now nfs

1.创建pv

NFS PV 示例

[kubeadm@server1 vol]$ cat pv1.yml
apiVersion: v1 
kind: PersistentVolume 
metadata:  
  name: pv1
spec:  
  capacity:    
    storage: 5Gi  
  volumeMode: Filesystem  
  accessModes:    
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Recycle    
  storageClassName: nfs   
  nfs:    
    path: /nfsdata
    server: 172.25.1.11

[kubeadm@server1 vol]$ vim pv1.yml 
[kubeadm@server1 vol]$ kubectl apply -f pv1.yml 
persistentvolume/pv1 created
[kubeadm@server1 vol]$ kubectl get pv
NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
pv1    5Gi        RWO            Recycle          Available           nfs                     4s

kubernetes存储(二)——K8S的Volumes配置管理(emptyDir卷、hostPath卷、nfs 卷、持久卷PV与持久卷声明PVC)_第20张图片
在这里插入图片描述


2.创建pvc

pvc示例

[kubeadm@server1 vol]$ cat pv1.yml 
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv1
spec:
  capacity:
    storage: 5Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Recycle
  storageClassName: nfs
  nfs:
    path: /nfsdata
    server: 172.25.1.11
---
apiVersion: v1 
kind: PersistentVolumeClaim 
metadata:  
  name: pvc1 
spec:
  storageClassName: nfs
  accessModes:
     - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
      
[kubeadm@server1 vol]$ vim pv1.yml 
[kubeadm@server1 vol]$ kubectl apply -f pv1.yml 
persistentvolume/pv1 unchanged
persistentvolumeclaim/pvc1 created
[kubeadm@server1 vol]$ kubectl get pvc
NAME   STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pvc1   Bound    pv1      5Gi        RWO            nfs            12s
[kubeadm@server1 vol]$ kubectl get pv
NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM          STORAGECLASS   REASON   AGE
pv1    5Gi        RWO            Recycle          Bound    default/pvc1   nfs                     14m

kubernetes存储(二)——K8S的Volumes配置管理(emptyDir卷、hostPath卷、nfs 卷、持久卷PV与持久卷声明PVC)_第21张图片
kubernetes存储(二)——K8S的Volumes配置管理(emptyDir卷、hostPath卷、nfs 卷、持久卷PV与持久卷声明PVC)_第22张图片


3. Pod挂载PV

示例一:单点读写

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv1
spec:
  capacity:
    storage: 5Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Recycle
  storageClassName: nfs
  nfs:
    path: /nfsdata
    server: 172.25.1.11
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc1
spec:
  storageClassName: nfs
  accessModes:
     - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi
---
apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - image: nginx
    name: nginx
    volumeMounts:
    - mountPath: /usr/share/nginx/html
      name: pv1
  volumes:
  - name: pv1
    persistentVolumeClaim:
      claimName: pvc1
[kubeadm@server1 vol]$ vim pv1.yml 
[kubeadm@server1 vol]$ kubectl apply -f pv1.yml 
persistentvolume/pv1 created
persistentvolumeclaim/pvc1 created
pod/test-pd created
[kubeadm@server1 vol]$ kubectl get pod -o wide
NAME      READY   STATUS    RESTARTS   AGE   IP            NODE      NOMINATED NODE   READINESS GATES
test-pd   1/1     Running   0          4s    10.244.1.83   server2   <none>           <none>
[kubeadm@server1 vol]$ kubectl describe pod test-pd 
Name:         test-pd
Namespace:    default
Priority:     0
Node:         server2/172.25.1.2
Start Time:   Thu, 02 Jul 2020 13:35:34 +0800
Labels:       <none>
Annotations:  Status:  Running
IP:           10.244.1.83
IPs:
  IP:  10.244.1.83
Containers:
  nginx:
    Container ID:   docker://0d770c7e45da6c3f895fedd0db96e5669afa94df35e74cb2c9996e10dac53b4f
    Image:          nginx
    Image ID:       docker-pullable://nginx@sha256:0efad4d09a419dc6d574c3c3baacb804a530acd61d5eba72cb1f14e1f5ac0c8f
    Port:           <none>
    Host Port:      <none>
    State:          Running
      Started:      Thu, 02 Jul 2020 13:35:35 +0800
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /usr/share/nginx/html from pv1 (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-5qqxc (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
Volumes:
  pv1:
    Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
    ClaimName:  pvc1
    ReadOnly:   false
  default-token-5qqxc:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-5qqxc
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type    Reason     Age        From               Message
  ----    ------     ----       ----               -------
  Normal  Scheduled  <unknown>  default-scheduler  Successfully assigned default/test-pd to server2
  Normal  Pulling    13s        kubelet, server2   Pulling image "nginx"
  Normal  Pulled     13s        kubelet, server2   Successfully pulled image "nginx"
  Normal  Created    13s        kubelet, server2   Created container nginx
  Normal  Started    13s        kubelet, server2   Started container nginx

kubernetes存储(二)——K8S的Volumes配置管理(emptyDir卷、hostPath卷、nfs 卷、持久卷PV与持久卷声明PVC)_第23张图片
kubernetes存储(二)——K8S的Volumes配置管理(emptyDir卷、hostPath卷、nfs 卷、持久卷PV与持久卷声明PVC)_第24张图片
kubernetes存储(二)——K8S的Volumes配置管理(emptyDir卷、hostPath卷、nfs 卷、持久卷PV与持久卷声明PVC)_第25张图片
kubernetes存储(二)——K8S的Volumes配置管理(emptyDir卷、hostPath卷、nfs 卷、持久卷PV与持久卷声明PVC)_第26张图片
kubernetes存储(二)——K8S的Volumes配置管理(emptyDir卷、hostPath卷、nfs 卷、持久卷PV与持久卷声明PVC)_第27张图片
kubernetes存储(二)——K8S的Volumes配置管理(emptyDir卷、hostPath卷、nfs 卷、持久卷PV与持久卷声明PVC)_第28张图片


示例二:多点读写

[root@harbor ~]# mkdir /nfsdata2
[root@harbor ~]# mkdir /nfsdata3
[root@harbor ~]# vim /etc/exports
[root@harbor ~]# cat /etc/exports
/nfsdata   *(rw,sync)
/nfsdata2   *(rw,sync)
/nfsdata3   *(ro)
[root@harbor ~]# ll -d /nfsdata3
drwxr-xr-x 2 root root 6 Jul  2 13:46 /nfsdata3
[root@harbor ~]# chmod 777 /nfsdata2
[root@harbor ~]# exportfs -rv
exporting *:/nfsdata3
exporting *:/nfsdata2
exporting *:/nfsdata
[root@harbor ~]# showmount -e
Export list for harbor:
/nfsdata3 *
/nfsdata2 *
/nfsdata  *

kubernetes存储(二)——K8S的Volumes配置管理(emptyDir卷、hostPath卷、nfs 卷、持久卷PV与持久卷声明PVC)_第29张图片

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv2
spec:
  capacity:
    storage: 10Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Recycle
  storageClassName: nfs
  nfs:
    path: /nfsdata2
    server: 172.25.1.11
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc2
spec:
  storageClassName: nfs
  accessModes:
     - ReadWriteMany
  resources:
    requests:
      storage: 5Gi
---
apiVersion: v1
kind: Pod
metadata:
  name: test-pd2
spec:
  containers:
  - image: nginx
    name: nginx
    volumeMounts:
    - mountPath: /usr/share/nginx/html
      name: pv2
  volumes:
  - name: pv2
    persistentVolumeClaim:
      claimName: pvc2

kubernetes存储(二)——K8S的Volumes配置管理(emptyDir卷、hostPath卷、nfs 卷、持久卷PV与持久卷声明PVC)_第30张图片
在这里插入图片描述
在这里插入图片描述

[kubeadm@server1 vol]$ kubectl exec -it test-pd2 -- bash
root@test-pd2:/# ls
bin   dev     docker-entrypoint.sh  home  lib64  mnt  proc  run   srv  tmp  var
boot  docker-entrypoint.d  etc    lib   media  opt  root  sbin  sys  usr
root@test-pd2:/# cd /usr/share/nginx/html/
root@test-pd2:/usr/share/nginx/html# ls
index.html
root@test-pd2:/usr/share/nginx/html# echo hello linux > test.html
root@test-pd2:/usr/share/nginx/html# ls
index.html  test.html
root@test-pd2:/usr/share/nginx/html# exit
[kubeadm@server1 vol]$ curl 10.244.2.102/test.html
hello linux

kubernetes存储(二)——K8S的Volumes配置管理(emptyDir卷、hostPath卷、nfs 卷、持久卷PV与持久卷声明PVC)_第31张图片
在这里插入图片描述


示例二:多点只读

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv3
spec:
  capacity:
    storage: 20Gi
  volumeMode: Filesystem
  accessModes:
    - ReadOnlyMany
  persistentVolumeReclaimPolicy: Recycle
  storageClassName: nfs
  nfs:
    path: /nfsdata3
    server: 172.25.1.11
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc3
spec:
  storageClassName: nfs
  accessModes:
     - ReadOnlyMany
  resources:
    requests:
      storage: 5Gi
---
apiVersion: v1
kind: Pod
metadata:
  name: test-pd3
spec:
  containers:
  - image: nginx
    name: nginx
    volumeMounts:
    - mountPath: /usr/share/nginx/html
      name: vol3
  volumes:
  - name: vol3
    persistentVolumeClaim:
      claimName: pvc3

kubernetes存储(二)——K8S的Volumes配置管理(emptyDir卷、hostPath卷、nfs 卷、持久卷PV与持久卷声明PVC)_第32张图片
*kubernetes存储(二)——K8S的Volumes配置管理(emptyDir卷、hostPath卷、nfs 卷、持久卷PV与持久卷声明PVC)_第33张图片
在这里插入图片描述
在这里插入图片描述


注意:以上的几个示例为静态pv

你可能感兴趣的:(深入浅出,Kubernetes,volumes,数据卷,pv,pvc)