一、前言

1、根据应用本身是否需要持久存储数据,以及每一次的请求跟此前的请求之间是否有关联性,可以分为四类应用:

  • 有状态、要存储
  • 有状态、无存储
  • 无状态、有存储
  • 无状态、无存储

2、持久化数据的方式

  • 节点级:节点提供存储卷。此方式在k8s上,不太适用。这是因为一旦Pod被删除了,Pod是要被Scheduler组件重新调度的,调度之后的Pod并不一定还能运行在原来的节点上。
  • 脱离节点而存在的网络共享存储设备。k8s使用这种方式。

3、Pod的特点:

  • 同一个Pod内的多个容器,可共享访问同一个存储卷。因为:对k8s来讲,存储卷不属于容器,而属于Pod,可以在容器中挂在存储卷,所以,如果两个容器挂在了同一个存储卷,相当于两个容器共享数据了。
  • 为什么Pod能有存储卷Volume,也能有网络命名空间Namespace呢?Pod其实底层有个基础容器pause。所有的网络名称空间,存储卷的挂载,都是分配给基础容器pause的。在Pod中运行的容器是共享基础容器pause的命名空间、存储卷的。所以这就是为什么同一个Pod内的所有容器都能使用同一个IP地址、共享同一个TCP/IP协议栈、使用同一个主机名的原因(因为ipc、net、uts名称空间是共享的)。
  • 如果在Pod上使用存储卷:Pod的基础架构容器pause使用存储卷——>容器的存储卷就是容器的目录与宿主机目录建立关系——>如果宿主机的目录就是宿主机本地的,那么就随着宿主机的终结而终结,所以为了真正实现持久性,宿主机的目录也不是宿主机本地的,而是宿主机挂载的外部存储设备上的存储卷

4、k8s提供的存储卷类型

  • empryDir:emptyDir类型的volume在pod分配到node上时被创建,kubernetes会在node上自动分配 一个目录,因此无需指定宿主机node上对应的目录文件。这个目录的初始内容为空,当Pod从node上移除时,emptyDir中的数据会被永久删除不具备持久存储性
  • hostPath:hostPath Volume为pod挂载宿主机上的目录或文件,使得容器可以使用宿主机的高速文件系统进行存储。缺点是,在k8s中,pod都是动态在各node节点上调度。当一个pod在当前node节点上启动并通过hostPath存储了文件到本地以后,下次调度到另一个节点上启动时,就无法使用在之前节点上存储的文件(如果调度到同一个节点,还是可以继续使用之前节点上存储的文件的不具备持久存储性
  • 网络存储设备无论Pod重启后是否调度到原来的节点,存储的文件可以继续使用。
  1. 传统意义上的网络存储设备:SAN(存储区域网络的简称,常见的有:iSCSI...)、NAS(网络附属存储:常见的有:nfs、cifs)...
  2. 分布式网络存储设备:glusterfs(文件系统级别存储)、cephfs(文件系统级别存储)、ceph rbd(块级别存储)...
  3. 云网络存储设备:EBS(亚马逊的)、Azure Disk(微软的)、Azure File(微软的)...
  • pvc和pv
  • configmap和secret(两种特殊类型的存储卷:目的是给Pod提供存储空间,而是给管理员或用户提供了,从集群外部向Pod内部的应用,注入配置信息的方式

5、关于pvc的相关知识

[root@master ~]# kubectl explain pod.spec.volumes
   persistentVolumeClaim        <Object>     #持久存储申请
  • pvc——>与当前命名空间中的pvc资源建立关系——>与pv资源(真正提供存储的资源)建立关系——>与存储系统建立关系。
  • 如果在公有云上,有很多租户,不知道租户什么时候会要建立pvc,不确定租户要创建pvc时就一定有相应的pv资源。因此,在上面的流程上去掉了,"与pv资源建立关系"的这一块内容,而引入了存储类(由用户的请求动态生成相应大小的pv资源)的概念。

存储类的图:23

6、在Pod上使用普通volume存储卷(非pvc、pv)的过程

  1. 在Pod中定义volume,而volume要指明关联到哪个存储设备上
  2. 使用volumeMounts,将存储卷挂载到容器中

 

二、定义并使用存储卷的实例

 

1、emptyDir类型的存储卷—不依赖外部的存储设备

[root@master ingress]# kubectl explain pod.spec.volumes.emptyDir
   medium       <string>
     Must be an empty string (default) or Memory.       #该值有两种形式(1、空字符串——使用磁盘;2、Memory——使用内存)

   sizeLimit    <string>


[root@master ingress]# kubectl explain pod.spec.containers
   volumeMounts <[]Object>

(1)案例一:

[root@master manifests]# mkdir volumes
[root@master manifests]# cd volumes/
[root@master volumes]# vim pod-vol-demo.yaml    #创建一个自主式Pod。容器myapp和busybox共享同一个emptyDir存储。
apiVersion: v1
kind: Pod
metadata: 
        name: pod-demo
        namespace: default
        labels:
                app: myapp
                tier: frontend
        annotations:
                magedu.com/created-by: "cluster admin"
spec:
        containers:
        - name: myapp
          image: ikubernetes/myapp:v1
          ports:
          - name: http
            containerPort: 80
          volumeMounts:
          - name: html
            mountPath: /data/web/html    #这个目录如果不存在的话,会新建
        - name: busybox
          image: busybox:latest
          imagePullPolicy: IfNotPresent
          volumeMounts:
          - name: html
            mountPath: /data    #这个目录如果不存在的话,会新建
          command:
          - "/bin/sh"
          - "sleep 3600" 
        volumes:
        - name: html
          emptyDir: {}         #指定空的映射(映射就是键值对) 。空映射并不是不指定,而是使用默认值(medium为使用磁盘,sizeLimit为不设定大小)          


[root@master volumes]# kubectl apply -f pod-vol-demo.yaml 
pod/pod-demo created
[root@master volumes]# kubectl get pods pod-demo
NAME       READY   STATUS    RESTARTS   AGE
pod-demo   2/2     Running   0          7s





#测试:在容器vusybox的/data目录下写入数据,在myapp容器的/data/web/html应该可以看到
[root@master volumes]# kubectl exec -it pod-demo -c busybox -- /bin/sh   #连入busybox容器
/ # ls
bin   data  dev   etc   home  proc  root  sys   tmp   usr   var
/ # echo $(date) >> /data/index.html
/ # cat /data/index.html 
Mon Sep 28 09:04:49 UTC 2020


[root@master volumes]# kubectl exec -it pod-demo -c myapp -- /bin/sh     #连入myapp容器
/ # cat /data/web/html/index.html 
Mon Sep 28 09:04:49 UTC 2020

 

(2)案例二:

  • 改造1的内容:一个容器用来向外提供服务,另外一个容器用来不断改变index.html文件中的内容
[root@master volumes]# kubectl delete -f pod-vol-demo.yaml 
pod "pod-demo" deleted
[root@master volumes]# vim pod-vol-demo.yaml
apiVersion: v1
kind: Pod
metadata: 
        name: pod-demo
        namespace: default
        labels:
                app: myapp
                tier: frontend
        annotations:
                magedu.com/created-by: "cluster admin"
spec:
        containers:
        - name: httpd
          image: busybox:latest
          imagePullPolicy: IfNotPresent
          command:
          - "/bin/sh"
          - "-c"
          - "/bin/httpd -f -h /data/web/html"     #将/data/web/html设置为http服务的家目录。本来httpd容器上是没有/data/web/html目录的,在容器启动之前,会先进行挂载(挂载之后,本地就会新建一个/data/web/html目录)
          - "sleep 3600"
          ports:
          - name: http
            containerPort: 80
          volumeMounts:
          - name: html
            mountPath: /data/web/html
        - name: busybox
          image: busybox:latest
          imagePullPolicy: IfNotPresent
          volumeMounts:
          - name: html
            mountPath: /data
          command:
          - "/bin/sh"
          - "-c"
          - "while true; do echo $(date) >> /data/index.html; sleep 2; done"
        volumes:
        - name: html
          emptyDir: {}



[root@master volumes]# kubectl get pods pod-demo -o wide
NAME       READY   STATUS    RESTARTS   AGE    IP             NODE     NOMINATED NODE   READINESS GATES
pod-demo   2/2     Running   0          134m   10.244.2.124   node02   <none>           <none>



#测试:访问Pod的Ip地址,可以看到隔两秒往网页文件写入的内容
[root@master volumes]# curl 10.244.2.124
Mon Sep 28 09:31:59 UTC 2020
Mon Sep 28 09:32:01 UTC 2020
Mon Sep 28 09:32:03 UTC 2020
Mon Sep 28 09:32:05 UTC 2020
Mon Sep 28 09:32:07 UTC 2020
Mon Sep 28 09:32:09 UTC 2020
Mon Sep 28 09:32:11 UTC 2020
...

 

2、gitRepo类型的存储卷—本质上就是emptyDir存储卷

[root@master volumes]# kubectl explain pod.spec.volumes.gitRepo
   directory    <string>
   repository   <string> -required-
     Repository URL
  • 使用过程:1、把git仓库的地址放到上面的repository字段中;当Pod创建时,自动地连接到git仓库的地址,宿主机会通过这个地址将仓库中的内容克隆到本地(这要求:宿主机上必须有git命令)的directory(上面的directoryziduan )目录中,并且将克隆下来的内容挂载、定义到Pod上。
  • 注意:1、gitRepo存储卷本质上就是emptyDir存储卷;2、在存储卷中的修改不会同步到git仓库中去;3、如果在Pod运行的过程中,git仓库中的内容发生了变化,存储卷中的内容也是不会发生变化的(这是因为只有在Pod创建的那一个时刻,才会将git仓库中的内容克隆到本地)。

 

3、hostPath类型的存储卷

[root@master volumes]# kubectl explain pod.spec.volumes.hostPath
   path <string> -required-
   type <string>    帮助文档:https://kubernetes.io/docs/concepts/storage/volumes#hostpath
  • 帮助文档中看到的内容如下:type的类型决定了如果源文件/目录不存在时,是否会新建

 

[root@master volumes]# vim pod-hostpath-vol.yaml
[root@master volumes]# cat pod-hostpath-vol.yaml 
apiVersion: v1
kind: Pod
metadata:
        name: pod-vol-hostpath
        namespace: default
spec:
        containers:
        - name: myqpp
          image: ikubernetes/myapp:v1
          volumeMounts:
          - name: html
            moutPath: /usr/share/nginx/html
        volumes:
        - name: html
          hostPath:
                path: /data/pod/volume1
                type: DirectoryOrCreate



#为了看出效果,在node01和node02上分别/data/pod/volume1目录,并在该目录下编辑index.html文件
[root@node01 ~]# mkdir -p /data/pod/volume1
[root@node01 ~]# vim /data/pod/volume1/index.html
node01.magedu.com


[root@node02 ~]# mkdir -p /data/pod/volume1
[root@node02 ~]# vim /data/pod/volume1/index.html
node02.magedu.com



[root@master ~]# kubectl apply -f pod-hostpath-vol.yaml


#测试:
[root@master ~]# kubectl get pods pod-vol-hostpath -o wide
NAME               READY   STATUS    RESTARTS   AGE   IP             NODE     NOMINATED NODE   READINESS GATES
pod-vol-hostpath   1/1     Running   0          11m   10.244.1.111   node01   <none>           <none>
[root@master ~]# curl 10.244.1.111
node01.magedu.com



[root@master volumes]# kubectl delete -f pod-hostpath-vol.yaml 

[root@master volumes]# kubectl apply -f pod-hostpath-vol.yamls]# 


[root@master volumes]# kubectl get pods pod-vol-hostpath -o wide
NAME               READY   STATUS    RESTARTS   AGE   IP             NODE     NOMINATED NODE   READINESS GATES
pod-vol-hostpath   1/1     Running   0          34s   10.244.1.114   node01   <none>           <none>

[root@master volumes]# curl 10.244.1.114    #可以看到删除重建之后,仍然能够访问到。
node01.magedu.com

 

4、nfs类型(NAS类型)的网络存储设备

[root@master ~]# kubectl explain pod.spec.volumes.nfs
   path <string> -required-
   readOnly     <boolean>
   server       <string> -required-

 

(1)环境准备:

节点IP地址
master01192.168.10.3/10.0.2.2
node01192.168.10.4/10.0.2.3
node02192.168.10.5/10.0.2.4
stor01192.168.10.6/10.0.2.5

(2)示例内容:

【1】、配置stor01节点为nfs服务器

1、在stor01上,安装nfs并启动nfs
[root@stor01 ~]# yum install nfs-utils -y
[root@stor01 ~]# systemctl start nfs
[root@stor01 ~]# ss -tnl | grep 2049     #nfs监听在2049端口
LISTEN     0      64           *:2049                     *:*                  
LISTEN     0      64          :::2049                    :::*   


2、在stor01上,配置共享目录
[root@stor01 ~]# mkdir /data/volumes -p     #新建功共享目录/data/volumes
[root@stor01 ~]# vim /etc/exports
/data/volumes   10.0.2.0/24(rw,no_root_squash)

[root@stor01 ~]# exportfs -rv     #刷新,使得/etc/exports文件中的内容生效
exporting 10.0.2.0/24:/data/volumes

3、在node01和node02上,查看stor01上的nfs服务是否搭建好
[root@node01 ~]# yum install nfs-utils -y
[root@node01 ~]# showmount -e 10.0.2.4    #验证方式1
Export list for 10.0.2.4:
/data/volumes 10.0.2.0/24
[root@node01 ~]# mount 10.0.2.4:/data/volumes /mnt/     #验证方式2
[root@node01 ~]# df -Th /mnt/
Filesystem             Type  Size  Used Avail Use% Mounted on
10.0.2.4:/data/volumes nfs4   17G  3.6G   14G  22% /mnt
[root@node01 ~]# umount /mnt      #测试完之后,进行卸载



[root@node02 ~]# yum install nfs-utils -y
[root@node02 ~]# showmount -e 10.0.2.4    #验证方式1
Export list for 10.0.2.4:
/data/volumes 10.0.2.0/24
[root@node02 ~]# mount 10.0.2.4:/data/volumes /mnt/    #验证方式2
[root@node02 ~]# df -Th /mnt/
Filesystem             Type  Size  Used Avail Use% Mounted on
10.0.2.4:/data/volumes nfs4   17G  3.6G   14G  22% /mnt
[root@node02 ~]# umount /mnt      #测试完之后,进行卸载

【2】、在master节点上配置pod

#设置域名解析
[root@master volumes]# vim /etc/hosts
10.0.2.5  stor01
[root@node01 volumes]# vim /etc/hosts
10.0.2.5  stor01
[root@node02 volumes]# vim /etc/hosts
10.0.2.5  stor01


[root@master volumes]# vim pod-nfs-vol.yaml 
apiVersion: v1
kind: Pod
metadata:
        name: pod-vol-nfs
        namespace: default
spec:
        containers:
        - name: myqpp
          image: ikubernetes/myapp:v1
          imagePullPolicy: IfNotPresent
          volumeMounts:
          - name: html
            mountPath: /usr/share/nginx/html
        volumes:
        - name: html
          nfs:
                path: /data/volumes
                server: stor01     #保证这是可以解析到的



[root@master volumes]# kubectl apply -f pod-nfs-vol.yaml 


[root@master volumes]# kubectl get pods pod-vol-nfs -o wide
NAME          READY   STATUS    RESTARTS   AGE   IP             NODE     NOMINATED NODE   READINESS GATES
pod-vol-nfs   1/1     Running   0          16s   10.244.1.115   node01   <none>           <none>

【3】、测试:

#在stor01上配置index.html访问文件
[root@stor01 ~]# vim /data/volumes/index.html
<h1>NFS stor01</h1>


[root@master volumes]# curl 10.244.1.115    #访问pod-vol-nfs的IP地址
<h1>NFS stor01</h1>


#将原来的pod-nfs-vol删除,重建之后,仍然可以访问到
[root@master volumes]# kubectl delete -f pod-nfs-vol.yaml 

[root@master volumes]# kubectl apply -f pod-nfs-vol.yaml 

[root@master volumes]# kubectl get pods pod-vol-nfs -o wide
NAME          READY   STATUS    RESTARTS   AGE   IP             NODE     NOMINATED NODE   READINESS GATES
pod-vol-nfs   1/1     Running   0          7s    10.244.2.125   node02   <none>           <none>
[root@master volumes]# curl 10.244.2.125
<h1>NFS stor01</h1>

 

5、PVC

  • 在pvc不被调用时,pvc和pv之间是没有绑定的。
  • pv和pvc是一一对应的,一旦某个pv被某个pvc绑定了,这个pv就不能被其他pvc绑定。
  • pvc究竟绑定哪个pv?取决于pvc的定义中所指定的dataSource的大小。比如pvc指定存储空间的大小为5G,那么存储空间为2G的pv就不符合条件。
  • 还可以指定pvc的访问模型(取决于pvc的定义中做指定的accessModes):【1】、一个Pod读写;【2】、一Pod只读;【3】、多个Pod只读;【4】、多个Pod读写

 

  • 存储工程师把存储划分好;运维工程师将pv创建好;pvc既可以由运维工程师创建,也可以由Pod创建者创建;Pod创建者只需要指定pvc的大小即可。

图片 1:23 

 

(1)创建pv资源(pv资源的定义与在Pod上直接使用存储卷的定义是一样的)

[root@master volumes]# kubectl explain pv.spec
   accessModes  <[]string>    #访问模式,支不支持多个Pod访问等等。
     AccessModes contains all ways the volume can be mounted. More info:
     https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes(帮助文档的地址)
   capacity     <map[string]string>
     A description of the persistent volume's resources and capacity. More info:
     https://kubernetes.io/docs/concepts/storage/persistent-volumes#capacity(帮助文档的地址)
   persistentVolumeReclaimPolicy        <string>    #pv的回收策略
     What happens to a persistent volume when released from its claim. Valid
     options are Retain (default for manually created PersistentVolumes), Delete
     (default for dynamically provisioned PersistentVolumes), and Recycle
     (deprecated). Recycle must be supported by the volume plugin underlying
     this PersistentVolume. More info:
     https://kubernetes.io/docs/concepts/storage/persistent-volumes#reclaiming



[root@master volumes]# kubectl explain pv.spec.nfs
   path <string> -required-
   readOnly     <boolean>
   server       <string> -required-
  • accessModes的帮助文档:

  • capacity的帮助文档:

 

1、在stor01上,设置nfs服务端要共享的目录
[root@stor01 ~]# mkdir /nfs/volumes/v{1..5} -p
[root@stor01 ~]# ls /nfs/volumes/      #v1、v2、v3、v4和v5是要共享的目录
v1  v2  v3  v4  v5


[root@stor01 ~]# vim /etc/exports
/data/volumes   10.0.2.0/24(rw,no_root_squash)      #上一个nfs存储卷时定义的共享目录
/nfs/volumes/v1 10.0.2.0/24(rw,no_root_squash)
/nfs/volumes/v2 10.0.2.0/24(rw,no_root_squash)
/nfs/volumes/v3 10.0.2.0/24(rw,no_root_squash)
/nfs/volumes/v4 10.0.2.0/24(rw,no_root_squash)
/nfs/volumes/v5 10.0.2.0/24(rw,no_root_squash)


[root@node02 ~]# exportfs -rv
exporting 10.0.2.0/24:/nfs/volumes/v5
exporting 10.0.2.0/24:/nfs/volumes/v4
exporting 10.0.2.0/24:/nfs/volumes/v3
exporting 10.0.2.0/24:/nfs/volumes/v2
exporting 10.0.2.0/24:/nfs/volumes/v1
exporting 10.0.2.0/24:/data/volumes
[root@node02 ~]# 



2、在master01上,将nfs服务端共享的目录设置为pv。即创建pv资源
apiVersion: v1
kind: PersistentVolume
metadata:      #注意:这里不写namespace,因为namespace是集群级别的资源
        name: pv001
        labels:
                name: pv001
spec:
        nfs:
                path: /nfs/volumes/v1
                server: node02
        accessModes: ["ReadWriteMany","ReadWriteOnce"]    #pvc的访问模式必须是要绑定的某个pv的访问模式的子集。
        capacity:
                storage: 2Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
        name: pv002
        labels:
                name: pv002
spec:
        nfs:
                path: /nfs/volumes/v2
                server: node02
        accessModes: ["ReadWriteOnce"]
        capacity:
                storage: 5Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
        name: pv003
        labels:
                name: pv003
spec:
        nfs:
                path: /nfs/volumes/v3
                server: node02
        accessModes: ["ReadWriteMany","ReadWriteOnce"]
        capacity:
                storage: 20Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
        name: pv004
        labels:
                name: pv004
spec:
        nfs:
                path: /nfs/volumes/v4
                server: node02
        accessModes: ["ReadWriteMany","ReadWriteOnce"]
        capacity:
                storage: 10Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
        name: pv005
        labels:
                name: pv005
spec:
        nfs:
                path: /nfs/volumes/v5
                server: node02
        accessModes: ["ReadWriteMany","ReadWriteOnce"]
        capacity:
                storage: 10Gi
---



[root@master volumes]# kubectl apply -f pod-demo.yaml


[root@master volumes]# kubectl get pv      
NAME    CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
pv001   2Gi        RWO,RWX        Retain           Available                                   2m55s
pv002   5Gi        RWO            Retain           Available                                   2m55s
pv003   20Gi       RWO,RWX        Retain           Available                                   2m55s
pv004   10Gi       RWO,RWX        Retain           Available                                   2m55s
pv005   10Gi       RWO,RWX        Retain           Available                                   2m55s
#RECLAIM POLICY是指回收策略,即如果某个pvc绑定了某个pv,并且在里面存了数据,此时,删除了pvc,那这个绑定就不存在了,那此时pv(里面还存有数据)该怎么处理?共有三种策略:
#1、Retain表示保留(保留原来pvc存储的数据);
#2、Recycle表示回收(删除原来pvc存储的数据,即释放,可供其他pv绑定);
#3、Delete表示删除(删除该pv)。

 

(2)创建pvc资源

[root@master volumes]# kubectl explain pvc.spec
   accessModes  <[]string>       #访问模式,支不支持多个Pod访问等等。同pv资源中的accessModes字段
   resources    <Object>         #指定pvc的最小存储空间
     Resources represents the minimum resources the volume should have. 
   selector     <Object>      #pv资源上可以有标签,所以pvc的标签选择器,可以指定选择哪类pv资源
   volumeMode   <string>      #指定后端存储卷的模式
   volumeName   <string>      #指定后端存储卷的名字(相当于指定了pv的名称,精确绑定)

 

[root@master volumes]# vim pod-vol-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
        name: mypvc
        namespace: default
spec:
        accessModes: ["ReadWriteMany"]
        resources:
                requests: 
                        storage: 6Gi      #注意:这个键值必须是storage,否则会报错。
---
apiVersion: v1
kind: Pod
metadata:
        name: pod-vol-pvc
        namespace: default
spec:
        containers:
        - name: myapp
          image: ikubernetes/myapp:v1
          volumeMounts:
          - name: html
            mountPath: /usr/share/nginx/html
        volumes:
        - name: html
          persistentVolumeClaim:
                claimName: mypvc



[root@master volumes]# kubectl apply -f pod-vol-pvc.yaml 

[root@master volumes]# kubectl get pv     #其中pv004被绑定了(Bound)
NAME    CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM           STORAGECLASS   REASON   AGE
pv001   2Gi        RWO,RWX        Retain           Available                                           2d18h
pv002   5Gi        RWO            Retain           Available                                           2d18h
pv003   20Gi       RWO,RWX        Retain           Available                                           2d18h
pv004   10Gi       RWO,RWX        Retain           Bound       default/mypvc                           2d18h
pv005   10Gi       RWO,RWX        Retain           Available                                           2d18h
[root@master volumes]# kubectl get pvc
NAME    STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
mypvc   Bound    pv004    10Gi       RWO,RWX                       9s
[root@master volumes]# kubectl get pod
NAME                             READY   STATUS    RESTARTS   AGE
pod-demo                         2/2     Running   4          14d
pod-vol-nfs                      1/1     Running   2          14d
pod-vol-pvc                      1/1     Running   0          119s
tomcat-deploy-6c57d89947-gw5w8   1/1     Running   0          48m
tomcat-deploy-6c57d89947-qt97d   1/1     Running   0          48m
tomcat-deploy-6c57d89947-rw6f2   1/1     Running   4          15d

 

(3)在Pod中指定pvc

[root@master volumes]# kubectl explain pod.spec.volumes.persistentVolumeClaim 
   claimName    <string> -required-       #创建好的pvc资源的名字
   readOnly     <boolean>

 

6、需要注意的地方:

  • namespace资源、pv资源属于集群级别的,不属于namespace名称空间,不能定义在namespace名称空间中。
Logo

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

更多推荐