第 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
要指定您要创建的端点,请使用基于环境创建的端点更新复制的 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 地址。
执行以下命令来创建端点:
# oc create -f <name_of_endpoint_file>例如:
# oc create -f sample-gluster-endpoints.yaml endpoints "glusterfs-cluster" created要验证端点是否已创建,请执行以下命令:
# 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执行以下命令创建 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要验证该服务是否已创建,请执行以下命令:
# 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注意必须为每个需要持久存储的项目创建端点和服务。
从 GlusterFS 创建一个带有 Replica 3 的 100G 持久性卷,并将描述此卷的持久卷规格输出到文件 pv001.json:
$ heketi-cli volume create --size=100 --persistent-volume-file=pv001.jsoncat 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 卷以只读模式运行。
编辑 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": {} }运行以下命令来创建持久性卷:
# oc create -f pv001.json例如:
# oc create -f pv001.json persistentvolume "glusterfs-4fc22ff9" created要验证持久性卷是否已创建,请执行以下命令:
# oc get pv例如:
# oc get pv NAME CAPACITY ACCESSMODES STATUS CLAIM REASON AGE glusterfs-4fc22ff9 100Gi RWX Available 4s创建持久性卷声明文件。例如:
# cat pvc.yaml apiVersion: v1 kind: PersistentVolumeClaim metadata: name: glusterfs-claim spec: accessModes: - ReadWriteMany resources: requests: storage: 100Gi selector: matchLabels: storage-tier: gold执行以下命令将持久性卷绑定到持久性卷声明:
# oc create -f pvc.yaml例如:
# oc create -f pvc.yaml persistentvolumeclaim"glusterfs-claim" created要验证持久性卷和持久性卷声明是否已绑定,请执行以下命令:
# 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现在可在应用程序中使用声明。例如:
# 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。
要验证 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要验证持久性卷是否挂载到容器中,请执行以下命令:
# 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),则可以省略以下步骤。
执行以下命令为密码创建编码值:
# echo -n "<key>" | base64其中 "key" 是部署 Red Hat Openshift Container Storage 时创建的 “admin-key” 的值
例如:
# echo -n "mypassword" | base64 bXlwYXNzd29yZA==创建 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通过执行以下命令在 Openshift 上注册 secret:
# oc create -f glusterfs-secret.yaml secret "heketi-secret" created
3.1.2.1.2. 注册存储类 复制链接链接已复制到粘贴板!
为持久性卷置备配置 StorageClass 对象时,管理员必须描述要使用的置备程序类型,以及置备属于类的 PersistentVolume 时使用的参数。
要创建存储类执行以下命令:
# 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 节 “扩展持久性卷声明”。
要将存储类注册到 Openshift,请执行以下命令:
# oc create -f glusterfs-storageclass.yaml storageclass "gluster-container" created要获得存储类的详情,请执行以下命令:
# 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. 创建持久性卷声明 复制链接链接已复制到粘贴板!
要创建持久性卷声明,请执行以下命令:
创建持久性卷声明文件。如下提供了示例持久性卷声明:
# 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。
执行以下命令注册声明:
# oc create -f glusterfs-pvc-claim1.yaml persistentvolumeclaim "claim1" created要获取声明的详细信息,请执行以下命令:
# 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. 验证申索创建 复制链接链接已复制到粘贴板!
要验证是否创建了声明,请执行以下命令:
要获取持久性卷声明和持久性卷的详情,请执行以下命令:
# 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要验证端点和服务是否创建在声明创建过程中,请执行以下命令:
# 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
3.1.2.1.5. (可选)为持久性卷提供自定义卷名称前缀 复制链接链接已复制到粘贴板!
您可以为创建的持久性卷提供自定义卷名称前缀。通过提供自定义卷名称前缀,用户现在可以基于以下方法轻松地搜索/过滤卷:
- 任何作为 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 中使用声明。
要在应用中使用声明,例如
# 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。
要验证 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要验证持久性卷是否挂载到容器中,请执行以下命令:
# 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 的大小。
要扩展持久性卷声明值,请执行以下命令:
要检查现有的持久性卷大小,在应用程序 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。
要编辑持久性卷声明值,请执行以下命令并编辑以下存储参数:
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要验证,在 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 被删除也是如此。
要删除声明,请执行以下命令:
# oc delete pvc <claim-name>例如:
# oc delete pvc claim1 persistentvolumeclaim "claim1" deleted要验证是否删除了声明,请执行以下命令:
# 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。
动态置备卷的卷安全性
动态置备程序增加了两个新参数,即 gidMin 和 gidMax。这些值允许管理员为存储类中的卷配置 GID 范围。要设置 GID 值并为动态置备的卷提供卷安全性,请执行以下命令:
使用 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"注意如果没有提供
gidMin和gidMax值,则动态置备的卷将在 2000 和 2147483647 之间拥有 GID。- 创建持久性卷声明。更多信息请参阅: 第 3.1.2.1.3 节 “创建持久性卷声明”
- 在 pod 中使用声明。确保此 pod 是无特权的。更多信息请参阅: 第 3.1.2.1.6 节 “在 Pod 中使用 Claim”
要验证 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 键和一个简单的匹配规则的新卷。
步骤
在 heketi 设备上应用所需的标签。
# heketi-cli device settags <device-name> <key>:<value>示例:
# heketi-cli device settags 1fe1b83e5660efb53cc56433cedf7771 disktype:hdd从设备中删除应用的标签。
# heketi-cli device rmtags <device-name> <key>示例:
# heketi-cli device rmtags 1fe1b83e5660efb53cc56433cedf7771 disktype验证设备上添加的标签。
# 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使用带标记的设备创建卷。
# 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 替换目的。
-
在创建卷时,您必须传递一个新的卷选项
创建存储类。
创建仅在硬盘上创建卷的存储类。
# cat hdd-storageclass.yamlapiVersion: 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.yamlapiVersion: 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