Kubernetes存储(volume,及pv/pvc)

1、volume存储

kubernetes支持以下类型卷:awsElasticBlockStore ,azureDisk ,azureFile ,cephfs ,csi ,downwardAPI ,emptyDir,fc,flocker ,gcePersistentDisk ,gitRepo ,glusterfs ,hostPath, iscsi, local, nfs,persistentVolumeClaim, projected ,portworxVolume ,quobyte ,rbd ,scaleIO, secret,storageos ,vsphereVolume

hostPath:卷将主机节点的文件系统中的文件或目录挂载到集群中

hostPath的用途如下:

运行需要访问 Docker 内部的容器;使用 /var/lib/docker 的 hostPath

在容器中运行 cAdvisor;使用 /dev/cgroups 的 hostPath

允许 pod 指定给定的 hostPath 是否应该在 pod 运行之前存在,是否应该创建,以及它应该以什么形式存在

除了所需的 path 属性之外,用户还可以为 hostPath 卷指定 type

使用这种卷类型请注意,因为:

由于每个节点上的文件都不同,具有相同配置(例如从 podTemplate 创建的)的 pod 在不同节点上的行为
可能会有所不同。

Kubernetes 按照计划添加资源感知调度时,将无法考虑 hostPath 使用的资源。

在底层主机上创建的文件或目录只能由 root 写入。您需要在特权容器中以 root 身份运行进程,或修改主机
上的文件权限以便写入 hostPath 卷。

创建一个deployment挂载volume

vim   camp.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-nginx
  template:
    metadata:
      labels:
        app: my-nginx
    spec:
      containers:
      - name: my-nginx
        image: nginx
        volumeMounts:         #调用下面的共享,将本地的、data目录挂载至pod里面的/sfs
        - name: config-volume
          mountPath: /sfs
      volumes:                #这是将本地的/data共享
        - name: config-volume   #定义一个名字,通过名字调用
          hostPath:
            path: /data         #本地的/data目录
            type: Directory     #类型为目录

首先要在本地node1和node2创建/data目录用于共享,不然创建deployment时会找不到目录导致启动不起来。

创建完目录就可以创建deployment

查看pod,然后通过kubectl进入pod

从下图中可以看出,本地/data目录共享至pod的sfs已经挂载完成

然后在pod中创建一个文件,在本地查看是否共享成功。

查看是pod在哪个node上面运行的,然后在node的本地查看是否共享。

在node1上面运行的,那就在node1的/data查看是否存在aa.txt,文件内是否有时间。

在node1在创建一个看在pod里能否实时共享。

在pod里面查看是能实互相时共享。

删除pod,删除deployment看本地node1目录下的数据是否存在。

删除pod后node1的数据是存在,实现持久化,pod崩溃不会导致数据丢失。

 

2、PersistentVolume PV),PersistentVolumeClaim PVC

PersistentVolume PV
是由管理员设置的存储,它是群集的一部分。就像节点是集群中的资源一样,PV 也是集群中的资源。 PV
Volume 之类的卷插件,但具有独立于使用 PV Pod 的生命周期。此 API 对象包含存储实现的细节,即 NFS
iSCSI 或特定于云供应商的存储系统。

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

绑定
master 中的控制环路监视新的 PVC,寻找匹配的 PV(如果可能),并将它们绑定在一起。如果为新的 PVC 动态
调配 PV,则该环路将始终将该 PV 绑定到 PVC。否则,用户总会得到他们所请求的存储,但是容量可能超出要求
的数量。一旦 PV PVC 绑定后, PersistentVolumeClaim 绑定是排他性的,不管它们是如何绑定的。 PVC
PV 绑定是一对一的映射。

持久化卷类型
PersistentVolume 类型以插件形式实现。Kubernetes 目前支持以下插件类型:
GCEPersistentDisk AWSElasticBlockStore AzureFile AzureDisk FC (Fibre Channel)
FlexVolume Flocker NFS iSCSI RBD (Ceph Block Device) CephFS
Cinder (OpenStack block storage) Glusterfs VsphereVolume Quobyte Volumes
HostPath VMware Photon Portworx Volumes ScaleIO Volumes StorageOS

PV 访问模式
PersistentVolume 可以以资源提供者支持的任何方式挂载到主机上。如下表所示,供应商具有不同的功能,每个
PV 的访问模式都将被设置为该卷支持的特定模式。例如,NFS 可以支持多个读/写客户端,但特定的 NFS PV 可能
以只读方式导出到服务器上。每个 PV 都有一套自己的用来描述特定功能的访问模式

ReadWriteOnce——该卷可以被单个节点以读/写模式挂载(第二个节点在去挂载是无法挂载成功)
ReadOnlyMany——该卷可以被多个节点以只读模式挂载    (很多pod访问时可以但是只是只读)
ReadWriteMany——该卷可以被多个节点以读/写模式挂载

 

在命令行中,访问模式缩写为:
RWO - ReadWriteOnce
ROX - ReadOnlyMany
RWX - ReadWriteMany

 

回收策略

Retain(保留)——手动回收
Recycle(回收)——基本擦除( rm -rf /thevolume/*
Delete(删除)——关联的存储资产(例如 AWS EBSGCE PDAzure Disk OpenStack Cinder 卷)
将被删除
当前,只有 NFS HostPath 支持回收策略。AWS EBSGCE PDAzure Disk Cinder 卷支持删除策略

 

状态
卷可以处于以下的某种状态:
Available(可用)——一块空闲资源还没有被任何声明绑定
Bound(已绑定)——卷已经被声明绑定
Released(已释放)——声明被删除,但是资源还未被集群重新声明

Failed(失败)——该卷的自动回收失败

命令行会显示绑定到 PV PVC 的名称

 

持久化演示说明 - NFS

(1),通过nfs进行实验首先找一台服务器安装NFS(安装至node2服务器)

在node2上面安装sfs

yum install -y nfs-common nfs-utils rpcbind

echo "/nfs   *(rw,no_root_squash,no_all_squash,sync)" >>/etc/exports

echo "/nfs1   *(rw,no_root_squash,no_all_squash,sync)" >>/etc/exports

echo "/nfs 2  *(rw,no_root_squash,no_all_squash,sync)" >>/etc/exports

启动

systemctl start rpcbind

systemctl start nfs

创建三个挂载目录,因为上面配置了三个挂载点

mkdir /nfs /nfs1 /nfs2 

在其他节点安装客户端(node1,k8smaster)

yum -y install nfs-utils rpcbind

在k8smaster上面扫描,挂载测试一下。

然后在去node2的/nfs目录下面查看是否有创建的文件

再次证明我们创建的nfs可以通过本地能访问到并能挂载,这样就可以创建pod并在pod内进行挂载。 

(2)创建pv

vim  pv-1.yaml       #创建3个pv,pvc进行匹配调用

apiVersion: v1
kind: PersistentVolume                         #类型为pv
metadata:
  name: pv001                                      #第一个pv的名称
spec:
  capacity:                                             #当前属性
    storage: 5Gi                                       #定义大小
  accessModes:
    - ReadWriteOnce                                 #当前模式,只允许一个节点访问
  persistentVolumeReclaimPolicy: Retain    #回收策略手动回收
  storageClassName: nfs                           #类型为nfs 
  nfs:
    path: /nfs                                             #共享的路径
    server: 192.168.10.195                         #共享nfs服务器的ip地址
---                                                # 第二个pv
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv002                                     #第二个pv名称
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: nfs
  nfs:
    path: /nfs1                                    #挂载的/nfs1
    server: 192.168.10.195
---                                                #第三个pv 
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv003                                      #第三个pv名称                          
spec:
  capacity:
    storage: 15Gi
  accessModes:
    - ReadWriteMany                               #可以被多个节点以读/写模式挂载
  persistentVolumeReclaimPolicy: Retain
  storageClassName: nfs
  nfs:
    path: /nfs2                                    #挂载的/nfs2
    server: 192.168.10.195

kubectl apply -f pv-1.yaml             创建

创建完成进行查看: kubectl get pv

 

NAME :名称

CAPACITY:卷大小

ACCESS MODES :pv访问模式

RECLAIM POLICY:回收策略

STATUS:运行状态

STORAGECLASS:类型nfs

(3)创建pvc及pod让自动识别pv并挂载

vim  pod-1.yaml

apiVersion: v1
kind: PersistentVolumeClaim              #定义pvc
metadata:
  name: pvc-test                               #定义pvc名称被pod调用
spec:
  accessModes:
    - ReadWriteOnce                       #定义只能被第一次调用,跟pv一致的就会被匹配
  storageClassName: nfs                #nfs
  resources:
    requests:
      storage: 5Gi                           #大小跟pv一致会匹配
---
apiVersion: v1                               #定义一个pod
kind: Pod
metadata:
  name: nginx-pv
spec:
  containers:
  - image: nginx                                  #镜像为nginx
    imagePullPolicy: IfNotPresent 
    name: nginx-pv
    volumeMounts:
    - mountPath: /usr/share/nginx/html           #nginx的网站目录
      name: mydata                                        #要挂载目录的名称
  volumes:
  - name: mydata                                          #定义名称,通过名称被pod挂载
    persistentVolumeClaim:
      claimName: pvc-test                               #指定pvc的名称

查看pod,并查pvc是否匹配到合适的pv

在查看pv状态

pod通过pvc绑定pv,实现共享。上面我们pod是用的nginx镜像,nginx的网站目录使用的挂载目录,可以添加网页测试看是否能访问。

以上pod用的是pv001,对应的就是/nfs,在/nfs添加网页访问测试。

在node2的/nfs添加测试网页。

访问pod测试

创建pv并且绑定pvc,pod通过挂载网站目录访问。

(4),创建一个deployment挂载pv

上面创建了三个pv,两个模式是(ReadWriteOnce),一个是(ReadWriteMany)。创建一个deployment去匹配ReadWriteMany模式的pv

vim  deployment.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-nginx
spec:
  accessModes:
    - ReadWriteMany              #可以被多个节点以读/写模式挂载   
  storageClassName: nfs
  resources:
    requests:
      storage: 10Gi                  #大小10G,会匹配到等于10G或者大于10G大小的pv
---
apiVersion: apps/v1
kind: Deployment                 #类型是deployment
metadata:
  name: myapp-deploy
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: nginx
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
        volumeMounts:
        - name: mydata
          mountPath: /usr/share/nginx/html   #挂载的nginx网站目录
      volumes:                                             #指定挂载的pvc
      - name: mydata
        persistentVolumeClaim:
          claimName: pvc-nginxc

创建:kubectl apply -f deployment.yaml

查看pvc是不是绑定的pv模式是 RWX(ReadWriteMany),卷大小等于10g,或者大于10g。

可以看出创建的deployment挂载的pvc,pvc根据定义的模式(RWX),以及大小10G以上或者等于10G的PV相匹配。

deployment创建的nginx,网站目录还是挂载。挂载的是pv003的共享,也就是node2服务器上面的/nfs2,添加网页测试访问。

访问成功,pv及pvc绑定成功,并且能够挂载使用。

以上使用了两种方式去挂载PV,一种通过Pod,一种通过deployment创建挂载。若要删除pv,及pvc时。先删除pod,在删除pvc,最后在删除pv。

posted @ 2021-10-14 17:33  點燈的人  阅读(110)  评论(0编辑  收藏  举报