目录

1、k8s持久化存储:emptyDir

2、k8s持久化存储:hostPath

3、k8s持久化存储:nfs

4、k8s持久化存储: PVC

4.1.1  k8s PV是什么?

4.1.2  k8s PVC是什么?

4.1.3  k8s PVC和PV工作原理

4.1.4  创建pod,使用pvc作为持久化存储卷


文档中的YAML文件配置直接复制粘贴可能存在格式错误,故实验中所需要的YAML文件以及本地包均打包至网盘

链接:https://pan.baidu.com/s/1bKnnnfPFQKHH0EjPiufB-g 
提取码:psgz 

在k8s中为什么要做持久化存储?

 在k8s中部署的应用都是以pod容器的形式运行的,假如我们部署MySQL、Redis等数据库,需要对这些数据库产生的数据做备份。因为Pod是有生命周期的,如果pod不挂载数据卷,那pod被删除或重启后这些数据会随之消失,如果想要长久的保留这些数据就要用到pod数据持久化存储。

1、k8s持久化存储:emptyDir

#查看k8s支持哪些存储

[root@xianchaomaster1 ~]# kubectl explain pods.spec.volumes

KIND:     Pod

VERSION:  v1

RESOURCE: volumes <[]Object>

DESCRIPTION:

     List of volumes that can be mounted by containers belonging to the pod.

     More info: https://kubernetes.io/docs/concepts/storage/volumes

     Volume represents a named volume in a pod that may be accessed by any

     container in the pod.

FIELDS:

   awsElasticBlockStore <Object>

   azureDisk  <Object>

   azureFile  <Object>

   cephfs <Object>

   cinder <Object>

   configMap  <Object>

   csi   <Object>

   downwardAPI <Object>

   emptyDir   <Object>

   ephemeral  <Object>

   fc <Object>

   flexVolume <Object>

   flocker   <Object>

   gcePersistentDisk   <Object>

   gitRepo   <Object>

   glusterfs  <Object>

   hostPath   <Object>

   iscsi <Object>

   name  <string> -required-

   nfs   <Object>

   persistentVolumeClaim   <Object>

   photonPersistentDisk <Object>

   portworxVolume <Object>

   projected  <Object>

   quobyte   <Object>

   rbd   <Object>

   scaleIO   <Object>

   secret <Object>

   storageos  <Object>

   vsphereVolume  <Object>

常用的如下:

emptyDir

hostPath

nfs

persistentVolumeClaim

glusterfs

cephfs

configMap

secret

我们想要使用存储卷,需要经历如下步骤

1、定义pod的volume,这个volume指明它要关联到哪个存储上的

2、在容器中要使用volumemounts挂载对应的存储

经过以上两步才能正确的使用存储卷

emptyDir类型的Volume是在Pod分配到Node上时被创建,Kubernetes会在Node上自动分配一个目录,因此无需指定宿主机Node上对应的目录文件。 这个目录的初始内容为空,当Pod从Node上移除时,emptyDir中的数据会被永久删除。emptyDir Volume主要用于某些应用程序无需永久保存的临时目录,多个容器的共享目录等。

#创建一个pod,挂载临时目录emptyDir

Emptydir的官方网址:

Volumes | Kubernetes

[root@xianchaomaster1 ~]# cat emptydir.yaml

apiVersion: v1

kind: Pod

metadata:

  name: pod-empty

spec:

  containers:

  - name: container-empty

    image: nginx

    imagePullPolicy: IfNotPresent

    volumeMounts:

    - mountPath: /cache

      name: cache-volume

  volumes:

  - emptyDir:

     {}

    name: cache-volume

#更新资源清单文件

[root@xianchaomaster1 ~]# kubectl apply -f emptydir.yaml

pod/pod-empty created

查看本机临时目录存在的位置,可用如下方法:

#查看pod调度到哪个节点

[root@xianchaomaster1 ~]# kubectl get pods -o wide | grep empty

pod-empty      1/1     Running     0       10.244.209.152   xianchaonode1

#查看pod的uid

[root@xianchaomaster1 ~]# kubectl get pods pod-empty -o yaml | grep uid

uid: 38d60544-8591-468d-b70d-2a66df3a1cf6

#登录到xianchaonode1上

[root@xianchaonode1 ~]# yum install tree -y

[root@xianchaonode1 ~]# tree /var/lib/kubelet/pods/38d60544-8591-468d-b70d-2a66df3a1cf6

/var/lib/kubelet/pods/38d60544-8591-468d-b70d-2a66df3a1cf6

├── containers

│   └── container-empty

│       └── c9e06d01

├── etc-hosts

├── plugins

│   └── kubernetes.io~empty-dir

│       ├── cache-volume

│       │   └── ready

│       └── wrapped_default-token-cq5qp

│           └── ready

└── volumes

    ├── kubernetes.io~empty-dir

    │   └── cache-volume

    │       └── aa

    └── kubernetes.io~secret

        └── default-token-cq5qp

            ├── ca.crt -> ..data/ca.crt

            ├── namespace -> ..data/namespace

            └── token -> ..data/token

12 directories, 7 files

由上可知,临时目录在本地的/var/lib/kubelet/pods/38d60544-8591-468d-b70d-2a66df3a1cf6/volumes/kubernetes.io~empty-dir/cache-volume/下

2、k8s持久化存储:hostPath

hostPath Volume是指Pod挂载宿主机上的目录或文件。 hostPath Volume使得容器可以使用宿主机的文件系统进行存储,hostpath(宿主机路径):节点级别的存储卷,在pod被删除,这个存储卷还是存在的,不会被删除,所以只要同一个pod被调度到同一个节点上来,在pod被删除重新被调度到这个节点之后,对应的数据依然是存在的。

#查看hostPath存储卷的用法

[root@xianchaomaster1 ~]# kubectl explain pods.spec.volumes.hostPath

KIND:     Pod

VERSION:  v1

RESOURCE: hostPath <Object>

DESCRIPTION:

     HostPath represents a pre-existing file or directory on the host machine

     that is directly exposed to the container. This is generally used for

     system agents or other privileged things that are allowed to see the host

     machine. Most containers will NOT need this. More info:

     https://kubernetes.io/docs/concepts/storage/volumes#hostpath

     Represents a host path mapped into a pod. Host path volumes do not support

     ownership management or SELinux relabeling.

FIELDS:

   path <string> -required-

   type <string>

#把tomcat.tar.gz上传到xianchaonode2和xianchaonode1上,手动解压:

[root@xianchaonode2 ~]# ctr -n=k8s.io images import  tomcat.tar.gz

[root@xianchaonode1 ~]# ctr -n=k8s.io images import  tomcat.tar.gz

#创建一个pod,挂载hostPath存储卷

[root@xianchaomaster1 ~]# cat hostpath.yaml

apiVersion: v1

kind: Pod

metadata:

  name: test-hostpath

spec:

  containers:

  - image: nginx

    imagePullPolicy: IfNotPresent

    name: test-nginx

    volumeMounts:

    - mountPath: /test-nginx

      name: test-volume

  - image: tomcat:8.5-jre8-alpine

    imagePullPolicy: IfNotPresent

    name: test-tomcat

    volumeMounts:

    - mountPath: /test-tomcat

      name: test-volume

  volumes:

  - name: test-volume

    hostPath:

      path: /data1

      type: DirectoryOrCreate

注意:

# DirectoryOrCreate表示本地有/data1目录,就用本地的,本地没有就会在pod调度到的节点自动创建一个。

https://kubernetes.io/zh-cn/docs/concepts/storage/volumes/

#更新资源清单文件

[root@xianchaomaster1 ~]# kubectl apply -f hostpath.yaml

pod/test-hostpath created

#查看pod调度到了哪个物理节点

[root@xianchaomaster1 ~]# kubectl get pods -o wide | grep hostpath

test-hostpath      2/2     Running        10.244.209.153   xianchaonode1  

#由上面可以知道pod调度到了xianchaonode1上,登录到xianchaonode1机器,查看是否在这台机器创建了存储目录

[root@xianchaonode1 ~]# ll /data1/

total 0

#上面可以看到已经创建了存储目录/data1,这个/data1会作为pod的持久化存储目录

#在xianchaonode1上的/data1下创建一个目录

[root@xianchaonode1 ~]# cd /data1/

[root@xianchaonode1 data1]# mkdir aa

#测试存储卷是否可以正常使用,登录到nginx容器

[root@xianchaomaster1 ~]# kubectl exec -it test-hostpath -c test-nginx -- /bin/bash     

root@test-hostpath:/# cd /test-nginx/ 

#/test-nginx/目录存在,说明已经把宿主机目录挂载到了容器里

root@test-hostpath:/test-nginx# ls

aa

#测试存储卷是否可以正常使用,登录到tomcat容器

[root@xianchaomaster1 ~]# kubectl exec -it test-hostpath -c test-tomcat -- /bin/bash

root@test-hostpath:/usr/local/tomcat# cd /test-tomcat/

#/test-tomcat/目录存在,说明已经把宿主机目录挂载到了容器里

root@test-hostpath:/test-tomcat# ls

aa

#通过上面测试可以看到,同一个pod里的test-nginx和test-tomcat这两个容器是共享存储卷的。

hostpath存储卷缺点:

单节点

pod删除之后重新创建必须调度到同一个node节点,数据才不会丢失

可以用分布式存储:

nfs,cephfs,glusterfs

3、k8s持久化存储:nfs

NFS:网络文件系统,英文Network File System(NFS),是由SUN公司研制的UNIX表示层协议(presentation layer protocol),能使使用者访问网络上别处的文件就像在使用自己的计算机一样。

1、搭建nfs服务

以k8s的控制节点作为NFS服务端

[root@xianchaomaster1 ~]# yum install nfs-utils -y

#在宿主机创建NFS需要的共享目录

[root@xianchaomaster1 ~]# mkdir /data/volumes -pv

mkdir: created directory ‘/data’

mkdir: created directory ‘/data/volumes’

#配置nfs共享服务器上的/data/volumes目录

[root@xianchaomaster1 ~]# systemctl start nfs

[root@xianchaomaster1 ~]# vim /etc/exports

/data/volumes *(rw,no_root_squash)

#rw 该主机对该共享目录有读写权限

# no_root_squash 登入 NFS 主机使用分享目录的使用者,如果是 root 的话,那么对于这个分享的目录来说,他就具有 root 的权限

#使NFS配置生效

[root@xianchaomaster1 ~]# exportfs -arv

exporting *:/data/volumes

[root@xianchaomaster1 ~]# service nfs restart

#设置成开机自启动

[root@xianchaomaster1 ~]# systemctl enable nfs

#查看nfs是否启动成功

[root@xianchaomaster1 ~]# systemctl status nfs

   Active: active

看到nfs是active,说明nfs正常启动了

#xianchaonode2和xianchaonode1上也安装nfs驱动

yum install nfs-utils -y

systemctl enable  nfs –now

在xianchaonode1上手动挂载试试:

[root@xianchaonode1 ~]# mkdir /test

[root@xianchaonode1 ~]# mount 192.168.40.180:/data/volumes /test/

[root@xianchaonode1 ~]# df -h

192.168.40.180:/data/volumes   50G  5.2G   45G  11% /test

#nfs可以被正常挂载

#手动卸载:

[root@xianchaonode1 ~]# umount /test

#创建Pod,挂载NFS共享出来的目录

Pod挂载nfs的官方地址:

卷 | Kubernetes

[root@xianchaomaster1 ~]# cat nfs.yaml

apiVersion: v1

kind: Pod

metadata:

 name: test-nfs-volume

spec:

 containers:

 - name: test-nfs

   image: nginx

   imagePullPolicy: IfNotPresent

   ports:

   - containerPort: 80

     protocol: TCP

   volumeMounts:

   - name: nfs-volumes

     mountPath: /usr/share/nginx/html

 volumes:

 - name: nfs-volumes

   nfs:

    path: /data/volumes

server: 192.168.40.180

注:path:  /data/volumes #nfs的共享目录

server:192.168.40.180是xianchaomaster1机器的ip,这个是安装nfs服务的地址

#更新资源清单文件

[root@xianchaomaster1 ~]# kubectl apply -f nfs.yaml

#查看pod是否创建成功

[root@xianchaomaster1]# kubectl get pods

NAME                        READY   STATUS    RESTARTS   AGE

nfs-test-76ffd8fdd6-5cbsk   1/1     Running   0          4s

nfs-test-76ffd8fdd6-9kk48   1/1     Running   0          4s

nfs-test-76ffd8fdd6-pt748   1/1     Running   0          4s

[root@xianchaomaster1]# kubectl get pods -owide

NAME                        READY   STATUS    RESTARTS   AGE   IP              NODE            NOMINATED NODE   READINESS GATES

nfs-test-76ffd8fdd6-5cbsk   1/1     Running   0          36s   10.244.121.44   xianchaonode1   <none>           <none>

nfs-test-76ffd8fdd6-9kk48   1/1     Running   0          36s   10.244.102.94   xianchaonode2   <none>           <none>

nfs-test-76ffd8fdd6-pt748   1/1     Running   0          36s   10.244.102.92   xianchaonode2   <none>           <none>

#登录到nfs服务器,在共享目录创建一个index.html

[root@xianchaomaster1 ~]# cd /data/volumes/

root@xianchaomaster1 volumes]# pwd

/data/volumes

[root@xianchaomaster1 volumes]# vim index.html

Hello, Everyone

My name is xianchao

My Chat is luckylucky421302

#请求pod,看结果

[root@xianchaomaster1]# curl 10.244.102.94

Hello, Everyone

My name is xianchao

My Chat is luckylucky421302

#通过上面可以看到,在共享目录创建的index.html已经被pod挂载了

#登录到pod验证下

[root@xianchaomaster1]# kubectl exec -it test-nfs-volume  -- /bin/bash

root@test-nfs-volume:/# cat /usr/share/nginx/html/index.html

Hello, Everyone

My name is xianchao

My Chat is luckylucky421302

#上面说明挂载nfs存储卷成功了,nfs支持多个客户端挂载,可以创建多个pod,挂载同一个nfs服务器共享出来的目录;但是nfs如果宕机了,数据也就丢失了,所以需要使用分布式存储,常见的分布式存储有glusterfs和cephfs

4、k8s持久化存储: PVC

参考官网:

https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes

4.1.1  k8s PV是什么?

PersistentVolume(PV)是群集中的一块存储,由管理员配置或使用存储类动态配置。 它是集群中的资源,就像pod是k8s集群资源一样。 PV是容量插件,如Volumes,其生命周期独立于使用PV的任何单个pod。

4.1.2  k8s PVC是什么?

PersistentVolumeClaim(PVC)是一个持久化存储卷,我们在创建pod时可以定义这个类型的存储卷。 它类似于一个pod。 Pod消耗节点资源,PVC消耗PV资源。 Pod可以请求特定级别的资源(CPU和内存)。 pvc在申请pv的时候也可以请求特定的大小和访问模式(例如,可以一次读写或多次只读)。

4.1.3  k8s PVC和PV工作原理

PV是群集中的资源。 PVC是对这些资源的请求。

PV和PVC之间的相互作用遵循以下生命周期:

(1)pv的供应方式

可以通过两种方式配置PV:静态或动态。

静态的:

集群管理员创建了许多PV。它们包含可供群集用户使用的实际存储的详细信息。它们存在于Kubernetes API中,可供使用。

动态的:

当管理员创建的静态PV都不匹配用户的PersistentVolumeClaim时,群集可能会尝试为PVC专门动态配置卷。此配置基于StorageClasses,PVC必须请求存储类,管理员必须创建并配置该类,以便进行动态配置。

(2)绑定

用户创建pvc并指定需要的资源和访问模式。在找到可用pv之前,pvc会保持未绑定状态

(3)使用

a)需要找一个存储服务器,把它划分成多个存储空间;

b)k8s管理员可以把这些存储空间定义成多个pv;

c)在pod中使用pvc类型的存储卷之前需要先创建pvc,通过定义需要使用的pv的大小和对应的访问模式,找到合适的pv;

d)pvc被创建之后,就可以当成存储卷来使用了,我们在定义pod时就可以使用这个pvc的存储卷

e)pvc和pv它们是一一对应的关系,pv如果被pvc绑定了,就不能被其他pvc使用了;

f)我们在创建pvc的时候,应该确保和底下的pv能绑定,如果没有合适的pv,那么pvc就会处于pending状态。

(4)回收策略

当我们创建pod时如果使用pvc做为存储卷,那么它会和pv绑定,当删除pod,pvc和pv绑定就会解除,解除之后和pvc绑定的pv卷里的数据需要怎么处理,目前,卷可以保留,回收或删除:

Retain

Recycle (不推荐使用,1.15可能被废弃了)

Delete

1、Retain

当删除pvc的时候,pv仍然存在,处于released状态,但是它不能被其他pvc绑定使用,里面的数据还是存在的,当我们下次再使用的时候,数据还是存在的,这个是默认的回收策略

 

Delete

删除pvc时即会从Kubernetes中移除PV,也会从相关的外部设施中删除存储资产

4.1.4  创建pod,使用pvc作为持久化存储卷

1、创建nfs共享目录

#在宿主机创建NFS需要的共享目录

[root@xianchaomaster1 ~]# mkdir /data/volume_test/v{1,2,3,4,5,6,7,8,9,10} -p

#配置nfs共享宿主机上的/data/volume_test/v1..v10目录

[root@xianchaomaster1 ~]# cat /etc/exports

/data/volumes 192.168.40.0/24(rw,no_root_squash)

/data/volume_test/v1 192.168.40.0/24(rw,no_root_squash)

/data/volume_test/v2 192.168.40.0/24(rw,no_root_squash)

/data/volume_test/v3 192.168.40.0/24(rw,no_root_squash)

/data/volume_test/v4 192.168.40.0/24(rw,no_root_squash)

/data/volume_test/v5 192.168.40.0/24(rw,no_root_squash)

/data/volume_test/v6 192.168.40.0/24(rw,no_root_squash)

/data/volume_test/v7 192.168.40.0/24(rw,no_root_squash)

/data/volume_test/v8 192.168.40.0/24(rw,no_root_squash)

/data/volume_test/v9 192.168.40.0/24(rw,no_root_squash)

/data/volume_test/v10 192.168.40.0/24(rw,no_root_squash)

#重新加载配置,使配置成效

[root@xianchaomaster1 ~]# exportfs -arv

2、如何编写pv的资源清单文件

#查看定义pv需要的字段

[root@xianchaomaster1 ~]# kubectl explain pv

KIND:     PersistentVolume

VERSION:  v1

DESCRIPTION:

     PersistentVolume (PV) is a storage resource provisioned by an

     administrator. It is analogous to a node. More info:

     https://kubernetes.io/docs/concepts/storage/persistent-volumes

FIELDS:

   apiVersion   <string>s

   kind <string>

   metadata <Object>

   spec <Object>

#查看定义nfs类型的pv需要的字段

[root@xianchaomaster1 ~]# kubectl explain pv.spec.nfs

KIND:     PersistentVolume

VERSION:  v1

RESOURCE: nfs <Object>

FIELDS:

   path <string> -required-

   readOnly <boolean>

   server   <string> -required-

3、创建pv

参考:持久卷 | Kubernetes

[root@xianchaomaster1 ~]# cat pv.yaml

apiVersion: v1

kind: PersistentVolume

metadata:

  name: v1

  labels:

    app: v1

spec:

  nfs:

   server: 192.168.40.180

   path: /data/volume_test/v1

  accessModes: ["ReadWriteOnce"]

  capacity:

   storage: 1Gi

---

apiVersion: v1

kind: PersistentVolume

metadata:

  name: v2

  labels:

    app: v2

spec:

  nfs:

   server: 192.168.40.180

   path: /data/volume_test/v2

  accessModes: ["ReadOnlyMany"]

  capacity:

   storage: 2Gi

---

apiVersion: v1

kind: PersistentVolume

metadata:

  name: v3

  labels:

    app: v3

spec:

  nfs:

   server: 192.168.40.180

   path: /data/volume_test/v3

  accessModes: ["ReadWriteMany"]

  capacity:

   storage: 3Gi

[root@xianchaomaster1]# kubectl apply -f pv.yaml

[root@xianchaomaster1]# kubectl get pv

NAME   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE

v1     1Gi        RWO            Retain           Available                                   55s

v2     2Gi        ROX            Retain           Available                                   55s

v3     3Gi        RWX            Retain           Available                                   55s

注解:        RWO:readwariteonce: 单路读写,允许同一个node节点上的pod访问

      ROX: readonlymany:    多路只读,允许不通node节点的pod以只读方式访问

              RWX: readwritemany:  多路读写,允许不同的node节点的pod以读写方式访问

4、创建pvc,和符合条件的pv绑定

[root@xianchaomaster1 ~]# cat pvc.yaml

apiVersion: v1

kind: PersistentVolumeClaim

metadata:

  name: pvc-v1

spec:

  accessModes: ["ReadWriteOnce"]

  selector:

    matchLabels:

      app: v1

  resources:

    requests:

      storage: 1Gi

---

apiVersion: v1

kind: PersistentVolumeClaim

metadata:

  name: pvc-v2

spec:

  accessModes: ["ReadOnlyMany"]

  selector:

    matchLabels:

      app: v2

  resources:

    requests:

      storage: 2Gi

---

apiVersion: v1

kind: PersistentVolumeClaim

metadata:

  name: pvc-v3

spec:

  accessModes: ["ReadWriteMany"]

  selector:

    matchLabels:

      app: v3

  resources:

    requests:

     storage: 3Gi

[root@xianchaomaster1]# kubectl apply -f pvc.yaml

persistentvolumeclaim/pvc-v1 created

persistentvolumeclaim/pvc-v2 created

persistentvolumeclaim/pvc-v3 created

[root@xianchaomaster1]# kubectl get pvc

NAME     STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE

pvc-v1   Bound    v1       1Gi        RWO                           17s

pvc-v2   Bound    v2       2Gi        ROX                           17s

pvc-v3   Bound    v3       3Gi        RWX                           17s

看到pvc的status都是bound状态,就说明pvc跟pv已经绑定了

5、创建pod,挂载pvc

[root@xianchaomaster1 ~]# cat pod_pvc.yaml

[root@xianchaomaster1]# cat pod_pvc.yaml

apiVersion: apps/v1

kind: Deployment

metadata:

  name: pvc-test

spec:

  replicas: 3

  selector:

    matchLabels:

      cunchu: pvc

  template:

    metadata:

      labels:

         cunchu: pvc

    spec:

      containers:

      - name: test-pvc

        image: xianchao/nginx:v1

        imagePullPolicy: IfNotPresent

        ports:

        - containerPort: 80

          protocol: TCP

        volumeMounts:

        - name: nginx-html

          mountPath: /usr/share/nginx/html

      volumes:

      - persistentVolumeClaim:

          claimName: pvc-v1

        name: nginx-html

[root@xianchaomaster1]# kubectl apply -f pod_pvc.yaml

[root@xianchaomaster1 cunchu]# kubectl get pods -l cunchu=pvc

NAME                        READY   STATUS    RESTARTS   AGE

pvc-test-65b6487489-84tlz   1/1     Running   0          6m51s

pvc-test-65b6487489-9kdgd   1/1     Running   0          6m51s

pvc-test-65b6487489-xpb7n   1/1     Running   0          6m51s

[root@xianchaomaster1]# cd /data/volume_test/v1

[root@xianchaomaster1 v1]# mkdir lucky

[root@xianchaomaster1]# kubectl exec -it pvc-test-65b6487489-84tlz -- /bin/bash

root@pvc-test-65b6487489-84tlz:/# cd /usr/share/nginx/html/

root@pvc-test-65b6487489-84tlz:/usr/share/nginx/html# ls

lucky

注:使用pvc和pv的注意事项

1、我们每次创建pvc的时候,需要事先有划分好的pv,这样可能不方便,那么可以在创建pvc的时候直接动态创建一个pv这个存储类,pv事先是不存在的

2、pvc和pv绑定,如果使用默认的回收策略retain,那么删除pvc之后,pv会处于released状态,我们想要继续使用这个pv,需要手动删除pv,kubectl delete pv pv_name,删除pv,不会删除pv里的数据,当我们重新创建pvc时还会和这个最匹配的pv绑定,数据还是原来数据,不会丢失。

 经过测试,如果回收策略是Delete,删除pv,pv后端存储的数据也不会被删除

回收策略:persistentVolumeReclaimPolicy字段

删除pvc的步骤:

需要先删除使用pvc的pod

再删除pvc

[root@xianchaomaster1]# kubectl delete -f pod_pvc.yaml

[root@xianchaomaster1]# kubectl get pvc

NAME     STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE

pvc-v1   Bound    v1       1Gi        RWO                           36s

pvc-v2   Bound    v2       2Gi        ROX                           22m

pvc-v3   Bound    v3       3Gi        RWX                           22m

[root@xianchaomaster1 cunchu]# kubectl delete pvc pvc-v1

persistentvolumeclaim "pvc-v1" deleted

演示pv用Delete回收策略:

[root@xianchaomaster1]# vim pv-1.yaml

apiVersion: v1

kind: PersistentVolume

metadata:

  name: v4

  labels:

    app: v4

spec:

  nfs:

   server: 192.168.40.180

   path: /data/volume_test/v4

  accessModes: ["ReadWriteOnce"]

  capacity:

   storage: 1Gi

  persistentVolumeReclaimPolicy: Delete

[root@xianchaomaster1]# kubectl apply -f  pv-1.yaml

[root@xianchaomaster1]# vim pvc-1.yaml

apiVersion: v1

kind: PersistentVolumeClaim

metadata:

  name: pvc-v4

spec:

  accessModes: ["ReadWriteOnce"]

  selector:

    matchLabels:

      app: v4

  resources:

    requests:

      storage: 1Gi

[root@xianchaomaster1]# kubectl apply -f pvc-1.yaml

[root@xianchaomaster1]# kubectl get pvc

NAME     STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE

pvc-v1   Bound    v1       1Gi        RWO                           5m4s

pvc-v2   Bound    v2       2Gi        ROX                           28m

pvc-v3   Bound    v3       3Gi        RWX                           28m

pvc-v4   Bound    v4       1Gi        RWO                           33s

[root@xianchaomaster1]# cat pod_pvc-2.yaml

apiVersion: apps/v1

kind: Deployment

metadata:

  name: pvc-test-1

spec:

  replicas: 3

  selector:

    matchLabels:

      cunchu: pvc-1

  template:

    metadata:

      labels:

         cunchu: pvc-1

    spec:

      containers:

      - name: test-pvc

        image: xianchao/nginx:v1

        imagePullPolicy: IfNotPresent

        ports:

        - containerPort: 80

          protocol: TCP

        volumeMounts:

        - name: nginx-html

          mountPath: /usr/share/nginx/html

      volumes:

      - persistentVolumeClaim:

          claimName: pvc-v4

        name: nginx-html

[root@xianchaomaster1]# kubectl apply -f pod_pvc-2.yaml

[root@xianchaomaster1 v1]# cd /data/volume_test/v4/

[root@xianchaomaster1 v4]# ls

[root@xianchaomaster1 v4]# mkdir lucky

[root@xianchaomaster1]# kubectl exec -it pvc-test-1-744c9dbc96-5b6c2 -- /bin/bash

root@pvc-test-1-744c9dbc96-5b6c2:/# cd /usr/share/nginx/html/

sbin/  share/ src/  

root@pvc-test-1-744c9dbc96-5b6c2:/# cd /usr/share/nginx/html/

root@pvc-test-1-744c9dbc96-5b6c2:/usr/share/nginx/html# ls

lucky

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐