八、持久卷使用

2021-12-02  本文已影响0人  jan29

1、emptyDir

EmptyDir是最基础的Volume类型,一个EmptyDir就是Host上的一个空目录。
EmptyDir是在Pod被分配到Node时创建的,它的初始内容为空,并且无须指定宿主机上对应的目录文件,因为kubernetes会自动分配一个目录,当Pod销毁时, EmptyDir中的数据也会被永久删除。

apiVersion: v1
kind: Pod
metadata:
  name: pod-emptydir
  namespace: default
spec:
  containers:
  - name: web
    image: nginx:1.14
    volumeMounts:
    - name: web-volume
      mountPath: /usr/share/nginx/html
      readOnly: true
  - name: busybox
    image: busybox
    imagePullPolicy: IfNotPresent
    command:
    - "/bin/sh"
    args:
    - "-c"
    - "while true;do echo $(date) >> /data/index.html;sleep 1;done"
    volumeMounts:
    - name: web-volume
      mountPath: /data
  volumes:
  - name: web-volume
    emptyDir:
      medium: Memory
      sizeLimit: 10Mi

验证

[root@master volume]# kubectl get po pod-emptydir -o wide
NAME           READY   STATUS    RESTARTS   AGE   IP             NODE    NOMINATED NODE   READINESS GATES
pod-emptydir   2/2     Running   0          29s   10.244.1.132   node2   <none>           <none>
[root@master volume]# curl 10.244.1.132
Thu Dec 2 14:01:16 UTC 2021
Thu Dec 2 14:01:17 UTC 2021
Thu Dec 2 14:01:18 UTC 2021
......

2、hostPath

HostPath就是将Node主机中一个实际目录挂在到Pod中,以供容器使用,这样的设计就可以保证Pod销毁了,但是数据依据可以存在于Node主机上。

apiVersion: v1
kind: Pod
metadata:
  name: pod-hostpath
  namespace: default
spec:
  containers:
  - name: web
    image: nginx:1.14
    volumeMounts:
    - name: web-hostpath
      mountPath: /usr/share/nginx/html
      readOnly: true
  volumes:
  - name: web-hostpath
    hostPath:
      path: /data/web
      type: DirectoryOrCreate

验证

[root@master volume]# kubectl get po pod-hostpath -o wide
NAME           READY   STATUS    RESTARTS   AGE   IP             NODE    NOMINATED NODE   READINESS GATES
pod-hostpath   1/1     Running   0          58s   10.244.1.134   node2   <none>           <none>
[root@node2 ~]# echo myWeb_hostPath > /data/web/index.html
[root@master volume]# curl 10.244.1.134
myWeb_hostPath

关于type字段的说明:
DirectoryOrCreate 目录存在就使用,不存在就先创建后使用
Directory 目录必须存在
FileOrCreate 文件存在就使用,不存在就先创建后使用
File 文件必须存在
Socket unix套接字必须存在
CharDevice 字符设备必须存在
BlockDevice 块设备必须存在

3、第三方存储卷配置

emptyDir和hostPath的数据并不能真正意义上保存,如果真正意义上保存还需要使用第三方存储。k8s支持的第三方后端存储有awsElasticBlockStore、azureDisk、cephfs、glusterfs、cinder、fc、iscsi、nfs、rbd、scaleIO等
具体支持的第三方设备及其配置参数可查看官方文档https://kubernetes.io/docs/concepts/storage/volumes/

以nfs为例

[root@master volume]# vim /etc/exports
/data/volume1 192.168.1.0/24(rw,root_squash,sync)
kind: Pod
metadata:
  name: pod-nfs
  namespace: default
spec:
  containers:
  - name: web
    image: nginx:1.14
    volumeMounts:
    - name: web-nfs
      mountPath: /usr/share/nginx/html
      readOnly: true
  volumes:
  - name: web-nfs
    nfs:
      path: /data/volume1
      server: 192.168.1.51

验证

[root@master volume]# kubectl get po pod-nfs -o wide
NAME      READY   STATUS    RESTARTS   AGE   IP             NODE    NOMINATED NODE   READINESS GATES
pod-nfs   1/1     Running   0          18s   10.244.2.124   node1   <none>           <none>
[root@master volume]# echo test-nfs-volume > /data/volume1/index.html
[root@master volume]# curl 10.244.2.124
test-nfs-volume

4、PV,PVC

管理存储是管理计算的一个明显问题。该PersistentVolume子系统为用户和管理员提供了一个API,用于抽象如何根据消费方式提供存储的详细信息。为此,我们引入了两个新的API资源:PersistentVolume和PersistentVolumeClaim

PersistentVolume(PV)是集群中由管理员配置的一段网络存储。 它是集群中的资源,就像节点是集群资源一样。 PV是容量插件,如Volumes,但其生命周期独立于使用PV的任何单个pod。 此API对象捕获存储实现的详细信息,包括NFS,iSCSI或特定于云提供程序的存储系统。

PersistentVolumeClaim(PVC)是由用户进行存储的请求。 它类似于pod。 Pod消耗节点资源,PVC消耗PV资源。Pod可以请求特定级别的资源(CPU和内存)。声明可以请求特定的大小和访问模式(例如,可以一次读/写或多次只读)。

4.1PV创建

[root@master volume]# vim /etc/exports
/data/volume1 192.168.1.0/24(rw,root_squash,sync)
/data/volume2 192.168.1.0/24(rw,root_squash,sync)
/data/volume3 192.168.1.0/24(rw,root_squash,sync)

以nfs为例

apiVersion: v1
kind: PersistentVolume
metadata:
  name: test-pv-volume1
spec:
  capacity:
    storage: 10Gi
  accessModes:
  - ReadWriteOnce
  nfs:
    path: /data/volume1
    server: 192.168.1.51
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: test-pv-volume2
spec:
  accessModes:
  - ReadOnlyMany
  capacity:
    storage: 5Gi
  nfs:
    path: /data/volume2
    server: 192.168.1.51
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: test-pv-volume3
spec:
  accessModes:
  - ReadWriteMany
  capacity:
    storage: 3Gi
  nfs:
    path: /data/volume3
    server: 192.168.1.51

验证

NAME              CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
test-pv-volume1   10Gi       RWO            Retain           Available                                   28s
test-pv-volume2   5Gi        ROX            Retain           Available                                   55s
test-pv-volume3   3Gi        RWX            Retain           Available                                   7s
  • 存储类型
    底层实际存储的类型,kubernetes支持多种存储类型,每种存储类型的配置都有所差异
  • 存储能力(capacity)
    用于存储空间的设置
  • 访问模式(accessModes)
    用于描述用户应用对存储资源的访问权限,访问权限包括下面几种方式:
  • ReadWriteOnce(RWO):读写权限,但是只能被单个节点挂载
  • ReadOnlyMany(ROX): 只读权限,可以被多个节点挂载
  • ReadWriteMany(RWX):读写权限,可以被多个节点挂载
    需要注意的是,底层不同的存储类型可能支持的访问模式不同
  • 回收策略(persistentVolumeReclaimPolicy)
    当PV不再被使用了之后,对其的处理方式。目前支持三种策略:
  • Retain (保留) 保留数据,需要管理员手工清理数据
  • Recycle(回收) 清除 PV 中的数据,效果相当于执行 rm -rf /thevolume/*
  • Delete (删除) 与 PV 相连的后端存储完成 volume 的删除操作,当然这常见于云服务商的存储服务
    需要注意的是,底层不同的存储类型可能支持的回收策略不同
  • 存储类别
    PV可以通过storageClassName参数指定一个存储类别
  • 具有特定类别的PV只能与请求了该类别的PVC进行绑定
  • 未设定类别的PV则只能与不请求任何类别的PVC进行绑定
  • 状态(status)
    一个 PV 的生命周期中,可能会处于4中不同的阶段:
  • Available(可用): 表示可用状态,还未被任何 PVC 绑定
  • Bound(已绑定): 表示 PV 已经被 PVC 绑定
  • Released(已释放): 表示 PVC 被删除,但是资源还未被集群重新声明
  • Failed(失败): 表示该 PV 的自动回收失败

4.2PVC创建

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: test1-volume
  namespace: default
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 2Gi

验证

[root@master volume]# kubectl get pv
NAME              CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM                  STORAGECLASS   REASON   AGE
test-pv-volume1   10Gi       RWO            Retain           Available                                                  14m
test-pv-volume2   5Gi        ROX            Retain           Available                                                  14m
test-pv-volume3   3Gi        RWX            Retain           Bound       default/test1-volume                           13m
[root@master volume]# kubectl get pvc
NAME           STATUS   VOLUME            CAPACITY   ACCESS MODES   STORAGECLASS   AGE
test1-volume   Bound    test-pv-volume3   3Gi        RWX                           23s

4.3pod使用

apiVersion: v1
kind: Pod
metadata:
  name: pod-pvc
  namespace: default
spec:
  containers:
  - name: web
    image: nginx:1.14
    volumeMounts:
    - name: test1-volume
      mountPath: /usr/share/nginx/html
  volumes:
  - name: test1-volume
    persistentVolumeClaim:
      claimName: test1-volume
      readOnly: false

验证

[root@master volume]# echo test1-pvc > /data/volume3/index.html 
[root@master volume]# kubectl get po pod-pvc -o wide
NAME      READY   STATUS    RESTARTS   AGE   IP             NODE    NOMINATED NODE   READINESS GATES
pod-pvc   1/1     Running   0          94s   10.244.2.126   node1   <none>           <none>
[root@master volume]# curl 10.244.2.126
test1-pvc

5、configMap

ConfigMap是一种比较特殊的存储卷,它的主要作用是用来存储配置信息的。

[root@master volume]# kubectl create cm wordpress --from-literal=wordpress-db-host=wordpress-mysql 
configmap/wordpress created
[root@master volume]# kubectl get cm wordpress
NAME        DATA   AGE
wordpress   1      4m15s

6、secret

在kubernetes中,还存在一种和ConfigMap非常类似的对象,称为Secret对象。它主要用于存储敏感信息,例如密码、秘钥、证书等等。

[root@master volume]# kubectl create secret generic wordpress --from-literal=wordpress-db-password=wordpresspwd --from-literal=mysql-root-password=wordpresspwd
[root@master volume]# kubectl get secret wordpress
NAME        TYPE     DATA   AGE
wordpress   Opaque   2      69s
上一篇下一篇

猜你喜欢

热点阅读