第 3 章 创建持久性卷


OpenShift Container Platform 集群可以使用 GlusterFS 为持久性存储 置备。

持久性卷(PV)和持久性卷声明(PVC)可以在单个项目间共享卷。虽然 PV 定义中包含的 GlusterFS 相关信息也可以直接在容器集定义中定义,但这样做不会将卷创建为不同的集群资源,从而使卷更容易冲突。

按 Labels 和 Selectors 绑定 PV

标签(label)是一个 OpenShift Container Platform 功能,作为对象规格的一部分支持用户定义的标签(键值对)。其主要目的是通过在它们中定义相同的标签来启用对象的任意分组。这些标签可以按照选择器来定向,以匹配具有指定标签值的所有对象。它是我们利用此功能使 PVC 绑定到我们的 PV。

您可以使用标签来标识卷之间共享的常见属性或特征。例如,您可以定义 gluster 卷,使其具有名为 storage-tier _ 的自定义属性(key),其值为 _gold _assigned。声明将能够选择带有 _storage-tier=gold 的 PV,以匹配此 PV。

第 3.1 节 “文件存储” 中提供了在基于文件的存储中置备卷的详情。同样,第 3.2 节 “块存储” 中提供了在基于块的存储中置备卷的详情。

3.1. 文件存储

文件存储也称为文件级或基于文件的存储,以分层结构存储数据。数据保存在文件和文件夹中,并向系统显示存储它并以相同的格式检索数据。您可以为基于文件的存储静态或动态置备卷。

3.1.1. 卷的静态置备

要在 OpenShift 和 Kubernetes 中启用持久卷支持,必须创建几个端点和服务。

注意

如果使用(默认)Ansible 安装程序部署 OpenShift Container Storage,则不需要以下步骤

示例 glusterfs 端点文件(sample-gluster-endpoints.yaml)和示例 glusterfs 服务文件(sample-gluster-service.yaml)位于* /usr/share/heketi/templates/*directory。

从 /usr/share/heketi/templates/templates/ 目录不会为此类部署创建示例端点和服务文件供 ansible 部署使用。

注意

确保将示例 glusterfs 端点文件 / glusterfs 服务文件复制到您选择的位置,然后编辑复制的文件。例如:

# cp /usr/share/heketi/templates/sample-gluster-endpoints.yaml /<_path_>/gluster-endpoints.yaml
  1. 要指定您要创建的端点,请使用基于环境创建的端点更新复制的 sample-gluster-endpoints.yaml 文件。每个红帽 Gluster 存储受信存储池都需要自己的端点,其具有受信存储池中节点的 IP。

    # cat sample-gluster-endpoints.yaml
    apiVersion: v1
    kind: Endpoints
    metadata:
      name: glusterfs-cluster
    subsets:
      - addresses:
          - ip: 192.168.10.100
        ports:
          - port: 1
      - addresses:
          - ip: 192.168.10.101
        ports:
          - port: 1
      - addresses:
          - ip: 192.168.10.102
        ports:
    - port: 1
    名称
    端点的名称。
    ip
    Red Hat Gluster Storage 节点的 IP 地址。
  2. 执行以下命令来创建端点:

    # oc create -f <name_of_endpoint_file>

    例如:

    # oc create -f sample-gluster-endpoints.yaml
    endpoints "glusterfs-cluster" created
  3. 要验证端点是否已创建,请执行以下命令:

    # oc get endpoints

    例如:

    # oc get endpoints
    NAME                       ENDPOINTS                                                     AGE
    storage-project-router     192.168.121.233:80,192.168.121.233:443,192.168.121.233:1936   2d
    glusterfs-cluster          192.168.121.168:1,192.168.121.172:1,192.168.121.233:1         3s
    heketi                     10.1.1.3:8080                                                 2m
    heketi-storage-endpoints   192.168.121.168:1,192.168.121.172:1,192.168.121.233:1         3m
  4. 执行以下命令创建 gluster 服务:

    # oc create -f <name_of_service_file>

    例如:

    # cat sample-gluster-service.yaml
    apiVersion: v1
    kind: Service
    metadata:
      name: glusterfs-cluster
    spec:
      ports:
    - port: 1
    # oc create -f sample-gluster-service.yaml
    service "glusterfs-cluster" created
  5. 要验证该服务是否已创建,请执行以下命令:

    # oc get service

    例如:

    # oc get service
    NAME                       CLUSTER-IP      EXTERNAL-IP   PORT(S)                   AGE
    storage-project-router     172.30.94.109   <none>        80/TCP,443/TCP,1936/TCP   2d
    glusterfs-cluster          172.30.212.6    <none>        1/TCP                     5s
    heketi                     172.30.175.7    <none>        8080/TCP                  2m
    heketi-storage-endpoints   172.30.18.24    <none>        1/TCP                     3m
    注意

    必须为每个需要持久存储的项目创建端点和服务。

  6. 从 GlusterFS 创建一个带有 Replica 3 的 100G 持久性卷,并将描述此卷的持久卷规格输出到文件 pv001.json:

    $ heketi-cli volume create --size=100 --persistent-volume-file=pv001.json
    cat pv001.json
    {
      "kind": "PersistentVolume",
      "apiVersion": "v1",
      "metadata": {
        "name": "glusterfs-f8c612ee",
        "creationTimestamp": null
      },
      "spec": {
        "capacity": {
          "storage": "100Gi"
        },
        "glusterfs": {
          "endpoints": "TYPE ENDPOINT HERE",
          "path": "vol_f8c612eea57556197511f6b8c54b6070"
        },
        "accessModes": [
          "ReadWriteMany"
        ],
        "persistentVolumeReclaimPolicy": "Retain"
      },
      "status": {}
    重要

    您必须手动将 Labels 信息添加到 .json 文件中。

    以下是供参考的示例 YAML 文件:

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv-storage-project-glusterfs1
      labels:
        storage-tier: gold
    spec:
      capacity:
        storage: 12Gi
      accessModes:
        - ReadWriteMany
      persistentVolumeReclaimPolicy: Retain
      glusterfs:
        endpoints: TYPE END POINTS NAME HERE,
    path: vol_e6b77204ff54c779c042f570a71b1407
    名称
    卷的名称。
    storage
    分配给这个卷的存储量
    glusterfs
    使用的卷类型,在本例中是 glusterfs 插件
    端点
    定义创建受信存储池的端点名称
    路径
    从受信存储池访问的红帽 Gluster 存储卷。
    accessModes
    accessModes 用作与 PV 和 PVC 匹配的标签。它们目前不定义任何形式的访问控制。
    labels
    使用标签来标识卷之间共享的常见属性或特征。在本例中,我们定义了 gluster 卷,使其具有名为 storage-tier 的自定义属性(key),值设为 gold。个声明将能够选择一个带有 storage-tier=gold 的 PV,以匹配此 PV。
    注意
    • heketi-cli 也接受命令行中的端点名称(--persistent-volume-endpoint="TYPE ENDPOINT HERE")。然后,这可以被传送到 oc create -f - 以立即创建持久性卷。
    • 如果环境中有多个 Red Hat Gluster Storage 受信存储池,您可以检查使用 heketi-cli 卷列表 命令创建卷的受信存储池。此命令列出集群名称。然后,您可以相应地更新 pv001.json 文件中的端点信息。
    • 在创建具有副本计数的双节点设置为三个(replica 3)的 Heketi 卷时,Heketi 会显示一个错误"No space",因为没有空格在三个不同的节点上创建包含三个磁盘集。
    • 如果所有 heketi-cli 写操作(ex: volume create, cluster create.etc)失败,且读取操作(例如:拓扑信息,卷 info .etc)可以成功,则 gluster 卷以只读模式运行。
  7. 编辑 pv001.json 文件,然后在端点部分输入端点名称:

    cat pv001.json
    {
      "kind": "PersistentVolume",
      "apiVersion": "v1",
      "metadata": {
        "name": "glusterfs-f8c612ee",
        "creationTimestamp": null,
        "labels": {
          "storage-tier": "gold"
        }
      },
      "spec": {
        "capacity": {
          "storage": "12Gi"
        },
        "glusterfs": {
          "endpoints": "glusterfs-cluster",
          "path": "vol_f8c612eea57556197511f6b8c54b6070"
        },
        "accessModes": [
          "ReadWriteMany"
        ],
        "persistentVolumeReclaimPolicy": "Retain"
      },
      "status": {}
    }
  8. 运行以下命令来创建持久性卷:

    # oc create -f pv001.json

    例如:

    # oc create -f pv001.json
    persistentvolume "glusterfs-4fc22ff9" created
  9. 要验证持久性卷是否已创建,请执行以下命令:

    # oc get pv

    例如:

    # oc get pv
    
    NAME                 CAPACITY   ACCESSMODES   STATUS      CLAIM     REASON    AGE
    glusterfs-4fc22ff9   100Gi      RWX           Available                       4s
  10. 创建持久性卷声明文件。例如:

    # cat pvc.yaml
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: glusterfs-claim
    spec:
      accessModes:
        - ReadWriteMany
      resources:
        requests:
          storage: 100Gi
        selector:
          matchLabels:
    storage-tier: gold
  11. 执行以下命令将持久性卷绑定到持久性卷声明:

    # oc create -f pvc.yaml

    例如:

    # oc create -f pvc.yaml
    persistentvolumeclaim"glusterfs-claim" created
  12. 要验证持久性卷和持久性卷声明是否已绑定,请执行以下命令:

    # oc get pv
    # oc get pvc

    例如:

    # oc get pv
    
    NAME                 CAPACITY   ACCESSMODES   STATUS    CLAIM                  REASON    AGE
    glusterfs-4fc22ff9   100Gi      RWX           Bound     storage-project/glusterfs-claim             1m
    # oc get pvc
    
    NAME              STATUS    VOLUME               CAPACITY   ACCESSMODES   AGE
    glusterfs-claim   Bound     glusterfs-4fc22ff9   100Gi      RWX           11s
  13. 现在可在应用程序中使用声明。例如:

    # cat app.yaml
    
    apiVersion: v1
    kind: Pod
    metadata:
      name: busybox
    spec:
      containers:
        - image: busybox
          command:
            - sleep
            - "3600"
          name: busybox
          volumeMounts:
            - mountPath: /usr/share/busybox
              name: mypvc
      volumes:
        - name: mypvc
          persistentVolumeClaim:
    claimName: glusterfs-claim
    # oc create -f app.yaml
    pod "busybox" created

    有关在应用中使用 glusterfs 声明的更多信息,请参阅 https://access.redhat.com/documentation/en-us/openshift_container_platform/3.11/html-single/configuring_clusters/#install-config-storage-examples-gluster-example

  14. 要验证 pod 是否已创建,请执行以下命令:

    # oc get pods -n <storage_project_name>

    例如:

    # oc get pods -n storage-project
    
    NAME                               READY     STATUS    RESTARTS   AGE
    block-test-router-1-deploy         0/1       Running     0          4h
    busybox                            1/1       Running   0          43s
    glusterblock-provisioner-1-bjpz4   1/1       Running   0          4h
    glusterfs-7l5xf                    1/1       Running   0          4h
    glusterfs-hhxtk                    1/1       Running   3          4h
    glusterfs-m4rbc                    1/1       Running   0          4h
    heketi-1-3h9nb                     1/1       Running   0          4h
  15. 要验证持久性卷是否挂载到容器中,请执行以下命令:

    # oc rsh busybox
    / $ df -h
    Filesystem                Size      Used Available Use% Mounted on
    /dev/mapper/docker-253:0-1310998-81732b5fd87c197f627a24bcd2777f12eec4ee937cc2660656908b2fa6359129
                          100.0G     34.1M     99.9G   0% /
    tmpfs                     1.5G         0      1.5G   0% /dev
    tmpfs                     1.5G         0      1.5G   0% /sys/fs/cgroup
    192.168.121.168:vol_4fc22ff934e531dec3830cfbcad1eeae
                           99.9G     66.1M     99.9G   0% /usr/share/busybox
    tmpfs                     1.5G         0      1.5G   0% /run/secrets
    /dev/mapper/vg_vagrant-lv_root
                           37.7G      3.8G     32.0G  11% /dev/termination-log
    tmpfs                     1.5G     12.0K      1.5G   0% /var/run/secretgit s/kubernetes.io/serviceaccount
注意

如果您在挂载点上遇到权限被拒绝的错误,则参考 Gluster 卷安全性章节,网址为

3.1.2. 卷的动态置备

动态置备可让您将 Red Hat Gluster 存储卷置备到正在运行的应用程序容器中,而无需预获取卷。由于声明请求出现,该卷将动态创建,因此该卷的大小将调配给应用容器。

注意

当使用(默认)Ansible 安装程序和安装过程中创建的默认存储类(glusterfs-storage)部署 OpenShift Container Storage 时,不需要下方概述的步骤。

3.1.2.1. 配置卷的动态置备

要配置卷的动态置备,管理员必须定义描述集群中提供的存储的 StorageClass 对象。创建存储类后,必须先创建用于 heketi 身份验证的机密,然后才能继续创建持久性卷声明。

3.1.2.1.1. 为 Heketi 身份验证创建 Secret

要为 Heketi 身份验证创建 secret,请执行以下命令:

注意

如果在部署 Red Hat Openshift Container Storage 的过程中没有设置 admin-key 值(用于访问 heketi 来获取卷详情的 secret),则可以省略以下步骤。

  1. 执行以下命令为密码创建编码值:

    # echo -n "<key>" | base64

    其中 "key" 是部署 Red Hat Openshift Container Storage 时创建的 admin-key 的值

    例如:

    # echo -n "mypassword" | base64
    bXlwYXNzd29yZA==
  2. 创建 secret 文件。下面是一个 secret 文件示例:

    # cat glusterfs-secret.yaml
    
    apiVersion: v1
    kind: Secret
    metadata:
      name: heketi-secret
      namespace: default
    data:
      # base64 encoded password. E.g.: echo -n "mypassword" | base64
      key: bXlwYXNzd29yZA==
    type: kubernetes.io/glusterfs
  3. 通过执行以下命令在 Openshift 上注册 secret:

    # oc create -f glusterfs-secret.yaml
    secret "heketi-secret" created
3.1.2.1.2. 注册存储类

为持久性卷置备配置 StorageClass 对象时,管理员必须描述要使用的置备程序类型,以及置备属于类的 PersistentVolume 时使用的参数。

  1. 要创建存储类执行以下命令:

    # cat > glusterfs-storageclass.yaml
    
    
    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: gluster-container
    provisioner: kubernetes.io/glusterfs
    reclaimPolicy: Retain
    parameters:
      resturl: "http://heketi-storage-project.cloudapps.mystorage.com"
      restuser: "admin"
      volumetype: "replicate:3"
      clusterid: "630372ccdc720a92c681fb928f27b53f,796e6db1981f369ea0340913eeea4c9a"
      secretNamespace: "default"
      secretName: "heketi-secret"
      volumeoptions: "client.ssl on, server.ssl on"
      volumenameprefix: "test-vol"
    allowVolumeExpansion: true

    其中,

    resturl
    Gluster REST 服务/Heketi 服务 url,可按需调配 gluster 卷。常规格式必须是 IPaddress:Port,这是 GlusterFS 动态置备程序的一项必要参数。如果 Heketi 服务在 openshift/kubernetes 设置中公开,则可能的格式与 http://heketi-storage-project.cloudapps.mystorage.com 类似,其中 fqdn 是可解析的 heketi 服务 URL。
    restuser
    可访问受信存储池中创建卷的 Gluster REST 服务/Heketi 用户
    VolumeType

    它指定了正在使用的卷类型。

    注意

    distributed-Three-way replication 是唯一支持的卷类型。这包括标准的三向复制卷和仲裁器 2+1。

    clusterid

    它是集群 ID,在置备卷时会供 heketi 使用。它还可以是用逗号分开的集群 ID 列表。这是一个可选参数。

    注意

    要获取集群 ID,请执行以下命令:

    # heketi-cli cluster list
    secretNamespace + secretName

    识别包含与 Gluster REST 服务通信时使用的用户密码的 Secret 实例。所有参数都是可选的。当同时省略 secretNamespace 和 secretName 时,将使用空密码。

    注意

    当持久性卷被动态置备时,Gluster 插件会创建一个名为 gluster-dynamic-<claimname> 的端点和无头服务。当持久卷声明被删除时,此动态端点和服务将自动删除。

    volumeoptions

    这是一个可选参数。它允许您通过将 参数设置为 "client.ssl on, server.ssl" 来创建启用了加密的 glusterfs 卷。有关启用加密的详情,请参考 第 8 章 启用加密

    注意

    如果没有启用加密,请不要在 storageclass 中添加此参数。

    volumenameprefix

    这是一个可选参数。它描述了 heketi 创建的卷的名称。如需更多信息,请参阅 第 3.1.2.1.5 节 “(可选)为持久性卷提供自定义卷名称前缀”

    注意

    此参数的值无法在 storageclass 中包含 _。

    allowVolumeExpansion
    要提高 PV 声明值,请确保将 storageclass 文件中的 allowVolumeExpansion 参数设置为 true。如需更多信息,请参阅 第 3.1.2.1.7 节 “扩展持久性卷声明”
  2. 要将存储类注册到 Openshift,请执行以下命令:

    # oc create -f glusterfs-storageclass.yaml
    storageclass "gluster-container" created
  3. 要获得存储类的详情,请执行以下命令:

    # oc describe storageclass gluster-container
    
    Name: gluster-container
    IsDefaultClass: No
    Annotations: <none>
    Provisioner: kubernetes.io/glusterfs
    Parameters: resturl=http://heketi-storage-project.cloudapps.mystorage.com,restuser=admin,secretName=heketi-secret,secretNamespace=default
    No events.
3.1.2.1.3. 创建持久性卷声明

要创建持久性卷声明,请执行以下命令:

  1. 创建持久性卷声明文件。如下提供了示例持久性卷声明:

    # cat glusterfs-pvc-claim1.yaml
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: claim1
      annotations:
        volume.beta.kubernetes.io/storage-class: gluster-container
    spec:
      persistentVolumeReclaimPolicy: Retain
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 5Gi
    persistentVolumeReclaimPolicy

    这是一个可选参数。如果此参数设为 "Retain",则底层的持久性卷也会保留,即使删除了对应的持久性卷声明。

    注意

    当 PVC 被删除时,如果 "persistentVolumeReclaimPolicy:" 设置为 "Retain",则底层 heketi 和 gluster 卷不会被删除。要删除卷,您必须使用 heketi cli,然后删除 PV。

  2. 执行以下命令注册声明:

    # oc create -f glusterfs-pvc-claim1.yaml
    persistentvolumeclaim "claim1" created
  3. 要获取声明的详细信息,请执行以下命令:

    # oc describe pvc <_claim_name_>

    例如:

    # oc describe pvc claim1
    
    Name: claim1
    Namespace: default
    StorageClass: gluster-container
    Status: Bound
    Volume: pvc-54b88668-9da6-11e6-965e-54ee7551fd0c
    Labels: <none>
    Capacity: 4Gi
    Access Modes: RWO
    No events.
3.1.2.1.4. 验证申索创建

要验证是否创建了声明,请执行以下命令:

  1. 要获取持久性卷声明和持久性卷的详情,请执行以下命令:

    # oc get pv,pvc
    
    NAME                                          CAPACITY   ACCESSMODES   RECLAIMPOLICY   STATUS     CLAIM                    REASON    AGE
    pv/pvc-962aa6d1-bddb-11e6-be23-5254009fc65b   4Gi        RWO           Delete          Bound      storage-project/claim1             3m
    
    NAME         STATUS    VOLUME                                     CAPACITY   ACCESSMODES   AGE
    pvc/claim1   Bound     pvc-962aa6d1-bddb-11e6-be23-5254009fc65b   4Gi        RWO           4m
  2. 要验证端点和服务是否创建在声明创建过程中,请执行以下命令:

    # oc get endpoints,service
    
    NAME                          ENDPOINTS                                            AGE
    ep/storage-project-router     192.168.68.3:443,192.168.68.3:1936,192.168.68.3:80   28d
    ep/gluster-dynamic-claim1     192.168.68.2:1,192.168.68.3:1,192.168.68.4:1         5m
    ep/heketi                     10.130.0.21:8080                                     21d
    ep/heketi-storage-endpoints   192.168.68.2:1,192.168.68.3:1,192.168.68.4:1         25d
    
    NAME                           CLUSTER-IP       EXTERNAL-IP   PORT(S)                   AGE
    svc/storage-project-router     172.30.166.64    <none>        80/TCP,443/TCP,1936/TCP   28d
    svc/gluster-dynamic-claim1     172.30.52.17     <none>        1/TCP                     5m
    svc/heketi                     172.30.129.113   <none>        8080/TCP                  21d
    svc/heketi-storage-endpoints   172.30.133.212   <none>        1/TCP                     25d

您可以为创建的持久性卷提供自定义卷名称前缀。通过提供自定义卷名称前缀,用户现在可以基于以下方法轻松地搜索/过滤卷:

  • 任何作为 storageclass 文件中的字段值 "volnameprefix" 提供的字符串。
  • 持久性卷声明名称。
  • 项目/命名空间名称。

要设置名称,请确保您已将参数 volumenameprefix 添加到存储类文件中。如需更多信息,请参阅 第 3.1.2.1.2 节 “注册存储类”

注意

此参数的值无法在 storageclass 中包含 _。

要验证是否设置了自定义卷名称前缀,请执行以下命令:

# oc describe pv <pv_name>

例如:

# oc describe pv pvc-f92e3065-25e8-11e8-8f17-005056a55501
Name:            pvc-f92e3065-25e8-11e8-8f17-005056a55501
Labels:          <none>
Annotations:     Description=Gluster-Internal: Dynamically provisioned PV
                 gluster.kubernetes.io/heketi-volume-id=027c76b24b1a3ce3f94d162f843529c8
                 gluster.org/type=file
                 kubernetes.io/createdby=heketi-dynamic-provisioner
                 pv.beta.kubernetes.io/gid=2000
                 pv.kubernetes.io/bound-by-controller=yes
                 pv.kubernetes.io/provisioned-by=kubernetes.io/glusterfs
                 volume.beta.kubernetes.io/mount-options=auto_unmount
StorageClass:    gluster-container-prefix
Status:          Bound
Claim:           glusterfs/claim1
Reclaim Policy:  Delete
Access Modes:    RWO
Capacity:        1Gi
Message:
Source:
    Type:           Glusterfs (a Glusterfs mount on the host that shares a pod's lifetime)
    EndpointsName:  glusterfs-dynamic-claim1
    Path:           test-vol_glusterfs_claim1_f9352e4c-25e8-11e8-b460-005056a55501
    ReadOnly:       false
Events:             <none>

Path 的值会将自定义卷名称前缀附加到命名空间和声明名称,本例中为 "test-vol"。

3.1.2.1.6. 在 Pod 中使用 Claim

执行以下步骤以在 pod 中使用声明。

  1. 要在应用中使用声明,例如

    # cat app.yaml
    
    apiVersion: v1
    kind: Pod
    metadata:
      name: busybox
    spec:
      containers:
        - image: busybox
          command:
            - sleep
            - "3600"
          name: busybox
          volumeMounts:
            - mountPath: /usr/share/busybox
              name: mypvc
      volumes:
        - name: mypvc
          persistentVolumeClaim:
    claimName: claim1
    # oc create -f app.yaml
    pod "busybox" created

    有关在应用中使用 glusterfs 声明的更多信息,请参阅 https://access.redhat.com/documentation/en-us/openshift_container_platform/3.11/html-single/configuring_clusters/#install-config-storage-examples-gluster-example

  2. 要验证 pod 是否已创建,请执行以下命令:

    # oc get pods -n storage-project
    
    NAME                                READY     STATUS         RESTARTS   AGE
    storage-project-router-1-at7tf      1/1       Running        0          13d
    busybox                             1/1       Running        0          8s
    glusterfs-dc-192.168.68.2-1-hu28h   1/1       Running        0          7d
    glusterfs-dc-192.168.68.3-1-ytnlg   1/1       Running        0          7d
    glusterfs-dc-192.168.68.4-1-juqcq   1/1       Running        0          13d
    heketi-1-9r47c                      1/1       Running        0          13d
  3. 要验证持久性卷是否挂载到容器中,请执行以下命令:

    # oc rsh busybox
    / $ df -h
    Filesystem                Size      Used Available Use% Mounted on
    /dev/mapper/docker-253:0-666733-38050a1d2cdb41dc00d60f25a7a295f6e89d4c529302fb2b93d8faa5a3205fb9
                             10.0G     33.8M      9.9G   0% /
    tmpfs                    23.5G         0     23.5G   0% /dev
    tmpfs                    23.5G         0     23.5G   0% /sys/fs/cgroup
    /dev/mapper/rhgs-root
                             17.5G      3.6G     13.8G  21% /run/secrets
    /dev/mapper/rhgs-root
                             17.5G      3.6G     13.8G  21% /dev/termination-log
    /dev/mapper/rhgs-root
                             17.5G      3.6G     13.8G  21% /etc/resolv.conf
    /dev/mapper/rhgs-root
                             17.5G      3.6G     13.8G  21% /etc/hostname
    /dev/mapper/rhgs-root
                             17.5G      3.6G     13.8G  21% /etc/hosts
    shm                      64.0M         0     64.0M   0% /dev/shm
    192.168.68.2:vol_5b05cf2e5404afe614f8afa698792bae
                              4.0G     32.6M      4.0G   1% /usr/share/busybox
    tmpfs                    23.5G     16.0K     23.5G   0% /var/run/secrets/kubernetes.io/serviceaccount
    tmpfs                    23.5G         0     23.5G   0% /proc/kcore
    tmpfs                    23.5G         0     23.5G   0% /proc/timer_stats
3.1.2.1.7. 扩展持久性卷声明

要提高 PV 声明值,请确保将 storageclass 文件中的 allowVolumeExpansion 参数设置为 true。更多信息请参阅: 第 3.1.2.1.2 节 “注册存储类”

注意

您还可以通过 OpenShift Container Platform 3.11 Web 控制台重新定义 PV 的大小。

要扩展持久性卷声明值,请执行以下命令:

  1. 要检查现有的持久性卷大小,在应用程序 pod 中执行以下命令:

    # oc rsh busybox
    # df -h

    例如:

    # oc rsh busybox
    / # df -h
    Filesystem                Size      Used Available Use% Mounted on
    /dev/mapper/docker-253:0-100702042-0fa327369e7708b67f0c632d83721cd9a5b39fd3a7b3218f3ff3c83ef4320ce7
                             10.0G     34.2M      9.9G   0% /
    tmpfs                    15.6G         0     15.6G   0% /dev
    tmpfs                    15.6G         0     15.6G   0% /sys/fs/cgroup
    /dev/mapper/rhel_dhcp47--150-root
                             50.0G      7.4G     42.6G  15% /dev/termination-log
    /dev/mapper/rhel_dhcp47--150-root
                             50.0G      7.4G     42.6G  15% /run/secrets
    /dev/mapper/rhel_dhcp47--150-root
                             50.0G      7.4G     42.6G  15% /etc/resolv.conf
    /dev/mapper/rhel_dhcp47--150-root
                             50.0G      7.4G     42.6G  15% /etc/hostname
    /dev/mapper/rhel_dhcp47--150-root
                             50.0G      7.4G     42.6G  15% /etc/hosts
    shm                      64.0M         0     64.0M   0% /dev/shm
    10.70.46.177:test-vol_glusterfs_claim10_d3e15a8b-26b3-11e8-acdf-005056a55501
                              2.0G     32.6M      2.0G   2% /usr/share/busybox
    tmpfs                    15.6G     16.0K     15.6G   0% /var/run/secrets/kubernetes.io/serviceaccount
    tmpfs                    15.6G         0     15.6G   0% /proc/kcore
    tmpfs                    15.6G         0     15.6G   0% /proc/timer_list
    tmpfs                    15.6G         0     15.6G   0% /proc/timer_stats
    tmpfs                    15.6G         0     15.6G   0% /proc/sched_debug
    tmpfs                    15.6G         0     15.6G   0% /proc/scsi
    tmpfs                    15.6G         0     15.6G   0% /sys/firmware

    在本例中,持久性卷大小为 2Gi。

  2. 要编辑持久性卷声明值,请执行以下命令并编辑以下存储参数:

    resources:
        requests:
          storage: <storage_value>
    # oc edit pvc <claim_name>

    例如,将存储值扩展到 20Gi:

    # oc edit pvc claim3
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      annotations:
        pv.kubernetes.io/bind-completed: "yes"
        pv.kubernetes.io/bound-by-controller: "yes"
        volume.beta.kubernetes.io/storage-class: gluster-container2
        volume.beta.kubernetes.io/storage-provisioner: kubernetes.io/glusterfs
      creationTimestamp: 2018-02-14T07:42:00Z
      name: claim3
      namespace: storage-project
      resourceVersion: "283924"
      selfLink: /api/v1/namespaces/storage-project/persistentvolumeclaims/claim3
      uid: 8a9bb0df-115a-11e8-8cb3-005056a5a340
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 20Gi
      volumeName: pvc-8a9bb0df-115a-11e8-8cb3-005056a5a340
    status:
      accessModes:
      - ReadWriteOnce
      capacity:
        storage: 2Gi
    phase: Bound
  3. 要验证,在 app pod 中执行以下命令:

    # oc rsh busybox
    / # df -h

    例如:

    # oc rsh busybox
    # df -h
    Filesystem                Size      Used Available Use% Mounted on
    /dev/mapper/docker-253:0-100702042-0fa327369e7708b67f0c632d83721cd9a5b39fd3a7b3218f3ff3c83ef4320ce7
                             10.0G     34.2M      9.9G   0% /
    tmpfs                    15.6G         0     15.6G   0% /dev
    tmpfs                    15.6G         0     15.6G   0% /sys/fs/cgroup
    /dev/mapper/rhel_dhcp47--150-root
                             50.0G      7.4G     42.6G  15% /dev/termination-log
    /dev/mapper/rhel_dhcp47--150-root
                             50.0G      7.4G     42.6G  15% /run/secrets
    /dev/mapper/rhel_dhcp47--150-root
                             50.0G      7.4G     42.6G  15% /etc/resolv.conf
    /dev/mapper/rhel_dhcp47--150-root
                             50.0G      7.4G     42.6G  15% /etc/hostname
    /dev/mapper/rhel_dhcp47--150-root
                             50.0G      7.4G     42.6G  15% /etc/hosts
    shm                      64.0M         0     64.0M   0% /dev/shm
    10.70.46.177:test-vol_glusterfs_claim10_d3e15a8b-26b3-11e8-acdf-005056a55501
                             20.0G     65.3M     19.9G   1% /usr/share/busybox
    tmpfs                    15.6G     16.0K     15.6G   0% /var/run/secrets/kubernetes.io/serviceaccount
    tmpfs                    15.6G         0     15.6G   0% /proc/kcore
    tmpfs                    15.6G         0     15.6G   0% /proc/timer_list
    tmpfs                    15.6G         0     15.6G   0% /proc/timer_stats
    tmpfs                    15.6G         0     15.6G   0% /proc/sched_debug
    tmpfs                    15.6G         0     15.6G   0% /proc/scsi
    tmpfs                    15.6G         0     15.6G   0% /sys/firmware

    观察到大小已从 2Gi(早期)改为 20Gi。

3.1.2.1.8. 删除持久性卷声明
注意

如果在注册 storageclass 时,如果 "persistentVolumeReclaimPolicy" 参数被设置为 "Retain",则底层 PV 和对应卷即使 PVC 被删除也是如此。

  1. 要删除声明,请执行以下命令:

    # oc delete pvc <claim-name>

    例如:

    # oc delete pvc claim1
    persistentvolumeclaim "claim1" deleted
  2. 要验证是否删除了声明,请执行以下命令:

    # oc get pvc <claim-name>

    例如:

    # oc get pvc claim1
    No resources found.

    用户删除绑定到动态置备创建的持久性卷声明(除了删除持久性卷声明外),Kubernetes 也会删除持久卷、端点、服务和实际卷。如果需要验证它,请执行以下命令:

    • 要验证持久性卷是否已删除,请执行以下命令:

      # oc get pv <pv-name>

      例如:

      # oc get pv pvc-962aa6d1-bddb-11e6-be23-5254009fc65b
      No resources found.
    • 要验证端点是否已删除,请执行以下命令:

      # oc get endpoints <endpointname>

      例如:

      # oc get endpoints gluster-dynamic-claim1
      No resources found.
    • 要验证该服务是否已删除,请执行以下命令:

      # oc get service <servicename>

      例如:

      # oc get service gluster-dynamic-claim1
      No resources found.

3.1.3. 卷安全性

卷以 UID/GID 为 0(root) 提供。对于要写入卷的应用容器集,其 UID/GID 应当为 0(root)。使用卷安全功能,管理员现在可以创建一个唯一 GID 的卷,而应用程序 pod 可使用这种唯一 GID 写入卷

静态置备卷的卷安全性

要使用 GID 创建静态置备的卷,请执行以下命令:

$ heketi-cli volume create --size=100 --persistent-volume-file=pv001.json --gid=590

在以上命令中,会创建一个 GID 为 590 的 100G 持久卷,描述此卷规格的输出将添加到 pv001.json 文件中。

有关使用这个 GID 访问卷的详情,请参考 https://access.redhat.com/documentation/en-us/openshift_container_platform/3.11/html/configuring_clusters/persistent-storage-examples#install-config-storage-examples-gluster-example

动态置备卷的卷安全性

动态置备程序增加了两个新参数,即 gidMingidMax。这些值允许管理员为存储类中的卷配置 GID 范围。要设置 GID 值并为动态置备的卷提供卷安全性,请执行以下命令:

  1. 使用 GID 值创建存储类文件。例如:

    # cat glusterfs-storageclass.yaml
    
    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: gluster-container
    provisioner: kubernetes.io/glusterfs
    parameters:
      resturl: "http://heketi-storage-project.cloudapps.mystorage.com"
      restuser: "admin"
      secretNamespace: "default"
      secretName: "heketi-secret"
      gidMin: "2000"
    gidMax: "4000"
    注意

    如果没有提供 gidMingidMax 值,则动态置备的卷将在 2000 和 2147483647 之间拥有 GID。

  2. 创建持久性卷声明。更多信息请参阅: 第 3.1.2.1.3 节 “创建持久性卷声明”
  3. 在 pod 中使用声明。确保此 pod 是无特权的。更多信息请参阅: 第 3.1.2.1.6 节 “在 Pod 中使用 Claim”
  4. 要验证 GID 是否在指定的范围内,请执行以下命令:

    # oc rsh busybox
    $ id

    例如:

    $ id
    uid=1000060000 gid=0(root) groups=0(root),2001

    其中 2001 在上面的输出中,是持久性卷分配的 GID,它位于存储类中指定的范围内。您可以使用分配的 GID 写入此卷。

    注意

    删除持久性卷声明后,从池中释放持久性卷的 GID。

3.1.4. 在 heketi 中进行设备分层

heketi 支持在放置卷时使用简单的标记匹配方法,以使用某些设备。用户需要指定特定设备的键值对,并创建带有卷选项键 user.heketi.device-tag-match 键和一个简单的匹配规则的新卷。

步骤

  1. 在 heketi 设备上应用所需的标签。

    # heketi-cli device settags <device-name> <key>:<value>

    示例:

    # heketi-cli device settags 1fe1b83e5660efb53cc56433cedf7771 disktype:hdd
  2. 从设备中删除应用的标签。

    # heketi-cli device rmtags <device-name> <key>

    示例:

    # heketi-cli device rmtags 1fe1b83e5660efb53cc56433cedf7771 disktype
  3. 验证设备上添加的标签。

    # heketi-cli device info <device-name>

    示例:

    # heketi-cli device info 1fe1b83e5660efb53cc56433cedf7771

    输出示例:

    Device Id: 1fe1b83e5660efb53cc56433cedf7771
    State: online
    Size (GiB): 49
    Used (GiB): 41
    Free (GiB): 8
    Create Path: /dev/vdc
    Physical Volume UUID: GpAnb4-gY8e-p5m9-0UU3-lV3J-zQWY-zFgO92
    Known Paths: /dev/disk/by-id/virtio-bf48c436-04a9-48ed-9 /dev/disk/by-path/pci-0000:00:08.0 /dev/disk/by-path/virtio-pci-0000:00:08.0 /dev/vdc
    Tags:
      disktype: hdd    ---> added tag
  4. 使用带标记的设备创建卷。

     # heketi-cli volume create --size=<size in GiB> --gluster-volume-options'user.heketi.device-tag-match <key>=<value>’
    重要
    • 在创建卷时,您必须传递一个新的卷选项 user.heketi.device-tag-match,其中 选项的值是一个标签键,后跟 "=" 或 "!=",再加上一个标签值。
    • 所有匹配项都是完全匹配且区分大小写,而且只能指定一个 device-tag-match。

    示例:

    # heketi-cli volume create --size=5 --gluster-volume-options 'user.heketi.device-tag-match disktype=hdd’
    注意

    创建了卷后,卷选项列表就会修复。tag-match 规则与卷元数据保留,用于卷扩展和 brick 替换目的。

  5. 创建存储类。

    • 创建仅在硬盘上创建卷的存储类。

      # cat hdd-storageclass.yaml
      apiVersion: storage.k8s.io/v1
      kind: StorageClass
      metadata:
        annotations:
          storageclass.kubernetes.io/is-default-class: "false"
        name: glusterfs-storage-hdd
        selfLink: /apis/storage.k8s.io/v1/storageclasses/glusterfs-storage
      parameters:
        resturl: http://heketi-storage.glusterfs.svc:8080
        restuser: admin
        secretName: heketi-storage-admin-secret
        secretNamespace: glusterfs
        volumeoptions: "user.heketi.device-tag-match disktype=hdd"
      provisioner: kubernetes.io/glusterfs
      reclaimPolicy: Delete
      volumeBindingMode: Immediate
    • 创建一个存储类,它只使用更可靠的状态存储创建卷。

      重要

      您必须使用负标签匹配规则来排除硬盘设备。

      # cat sdd-storageclass.yaml
      apiVersion: storage.k8s.io/v1
      kind: StorageClass
      metadata:
        annotations:
          storageclass.kubernetes.io/is-default-class: "false"
        name: glusterfs-storage-dd
        selfLink: /apis/storage.k8s.io/v1/storageclasses/glusterfs-storage
      parameters:
        resturl: http://heketi-storage.glusterfs.svc:8080
        restuser: admin
        secretName: heketi-storage-admin-secret
        secretNamespace: glusterfs
        volumeoptions: "user.heketi.device-tag-match disktype!=hdd"
      provisioner: kubernetes.io/glusterfs
      reclaimPolicy: Delete
      volumeBindingMode: Immediate
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2026 Red Hat
返回顶部