zoukankan      html  css  js  c++  java
  • 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。

    作者: 阿隆
    不足之处,欢迎技术指导。
  • 相关阅读:
    goroutine
    golang package log
    golang单元测试
    golang 文件操作
    go递归打印指定目录下的所有文件及文件夹
    go语言切片作为函数参数的研究
    go数据类型之基本类型
    结束了
    codeforces358D Dima and Hares【dp】
    codeforces1081G Mergesort Strikes Back【期望dp+脑洞】
  • 原文地址:https://www.cnblogs.com/sxshaolong/p/15407640.html
Copyright © 2011-2022 走看看