5.4.3. 从 openshift-storage 命名空间中访问旧的应用程序数据
当使用 Multicloud Object Gateway(MCG)NamespaceStore 文件系统(NSFS)功能时,您需要具有数据位于 openshift-storage
命名空间中的 PVC。几乎在所有情形中,您需要访问的数据不在 openshift-storage
命名空间中,而是位于传统应用程序使用的命名空间中。
要访问存储在另一个命名空间中的数据,您需要在 openshift-storage
命名空间中创建一个指向传统应用使用的同一 CephFS 卷的 PVC。
流程
使用
scc
显示应用程序命名空间:$ oc get ns <application_namespace> -o yaml | grep scc
<application_namespace>
指定应用程序命名空间的名称。
例 5.1. 示例
$ oc get ns testnamespace -o yaml | grep scc
例 5.2. 输出示例
openshift.io/sa.scc.mcs: s0:c26,c5 openshift.io/sa.scc.supplemental-groups: 1000660000/10000 openshift.io/sa.scc.uid-range: 1000660000/10000
进入应用程序命名空间:
$ oc project <application_namespace>
例 5.3. 示例
$ oc project testnamespace
确保 ReadWriteMany(RWX) PVC 挂载到您要使用 MCG NSFS 功能从 noobaa S3 端点使用的 pod 上:
$ oc get pvc
例 5.4. 输出示例
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE cephfs-write-workload-generator-no-cache-pv-claim Bound pvc-aa58fb91-c3d2-475b-bbee-68452a613e1a 10Gi RWX ocs-storagecluster-cephfs 12s
$ oc get pod
例 5.5. 输出示例
NAME READY STATUS RESTARTS AGE cephfs-write-workload-generator-no-cache-1-cv892 1/1 Running 0 11s
检查 pod 中的持久性卷(PV)的挂载点。
从 pod 获取 PV 的卷名称:
$ oc get pods <pod_name> -o jsonpath='{.spec.volumes[]}'
<pod_name>
指定 pod 的名称。
例 5.6. 示例
$ oc get pods cephfs-write-workload-generator-no-cache-1-cv892 -o jsonpath='{.spec.volumes[]}'
例 5.7. 输出示例
{"name":"app-persistent-storage","persistentVolumeClaim":{"claimName":"cephfs-write-workload-generator-no-cache-pv-claim"}}
在本例中,PVC 的卷名称为
cephfs-write-workload-generator-no-cache-pv-claim
。
列出 pod 中的所有挂载,并检查您在上一步中标识的卷的挂载点:
$ oc get pods <pod_name> -o jsonpath='{.spec.containers[].volumeMounts}'
例 5.8. 示例
$ oc get pods cephfs-write-workload-generator-no-cache-1-cv892 -o jsonpath='{.spec.containers[].volumeMounts}'
例 5.9. 输出示例
[{"mountPath":"/mnt/pv","name":"app-persistent-storage"},{"mountPath":"/var/run/secrets/kubernetes.io/serviceaccount","name":"kube-api-access-8tnc5","readOnly":true}]
确认 pod 中的 RWX PV 的挂载点:
$ oc exec -it <pod_name> -- df <mount_path>
<mount_path>
指定您在上一步中标识的挂载点的路径。
例 5.10. 示例
$ oc exec -it cephfs-write-workload-generator-no-cache-1-cv892 -- df /mnt/pv
例 5.11. 输出示例
main Filesystem 1K-blocks Used Available Use% Mounted on 172.30.202.87:6789,172.30.120.254:6789,172.30.77.247:6789:/volumes/csi/csi-vol-cc416d9e-dbf3-11ec-b286-0a580a810213/edcfe4d5-bdcb-4b8e-8824-8a03ad94d67c 10485760 0 10485760 0% /mnt/pv
确保 UID 和 SELinux 标签与旧命名空间使用的标签相同:
$ oc exec -it <pod_name> -- ls -latrZ <mount_path>
例 5.12. 示例
$ oc exec -it cephfs-write-workload-generator-no-cache-1-cv892 -- ls -latrZ /mnt/pv/
例 5.13. 输出示例
total 567 drwxrwxrwx. 3 root root system_u:object_r:container_file_t:s0:c26,c5 2 May 25 06:35 . -rw-r--r--. 1 1000660000 root system_u:object_r:container_file_t:s0:c26,c5 580138 May 25 06:35 fs_write_cephfs-write-workload-generator-no-cache-1-cv892-data.log drwxrwxrwx. 3 root root system_u:object_r:container_file_t:s0:c26,c5 30 May 25 06:35 ..
获取您要从
openshift-storage
命名空间访问的旧应用程序 RWX PV 的信息:$ oc get pv | grep <pv_name>
<pv_name>
指定 PV 的名称。
例 5.14. 示例
$ oc get pv | grep pvc-aa58fb91-c3d2-475b-bbee-68452a613e1a
例 5.15. 输出示例
pvc-aa58fb91-c3d2-475b-bbee-68452a613e1a 10Gi RWX Delete Bound testnamespace/cephfs-write-workload-generator-no-cache-pv-claim ocs-storagecluster-cephfs 47s
确保来自
openshift-storage
命名空间中的 PVC 可以被访问,以便一个或多个 noobaa-endpoint pod 可以访问 PVC。从
volumeAttributes
找到subvolumePath
和volumeHandle
的值。您可以从传统应用程序 PV 的 YAML 描述中获取这些值:$ oc get pv <pv_name> -o yaml
例 5.16. 示例
$ oc get pv pvc-aa58fb91-c3d2-475b-bbee-68452a613e1a -o yaml
例 5.17. 输出示例
apiVersion: v1 kind: PersistentVolume metadata: annotations: pv.kubernetes.io/provisioned-by: openshift-storage.cephfs.csi.ceph.com creationTimestamp: "2022-05-25T06:27:49Z" finalizers: - kubernetes.io/pv-protection name: pvc-aa58fb91-c3d2-475b-bbee-68452a613e1a resourceVersion: "177458" uid: 683fa87b-5192-4ccf-af2f-68c6bcf8f500 spec: accessModes: - ReadWriteMany capacity: storage: 10Gi claimRef: apiVersion: v1 kind: PersistentVolumeClaim name: cephfs-write-workload-generator-no-cache-pv-claim namespace: testnamespace resourceVersion: "177453" uid: aa58fb91-c3d2-475b-bbee-68452a613e1a csi: controllerExpandSecretRef: name: rook-csi-cephfs-provisioner namespace: openshift-storage driver: openshift-storage.cephfs.csi.ceph.com nodeStageSecretRef: name: rook-csi-cephfs-node namespace: openshift-storage volumeAttributes: clusterID: openshift-storage fsName: ocs-storagecluster-cephfilesystem storage.kubernetes.io/csiProvisionerIdentity: 1653458225664-8081-openshift-storage.cephfs.csi.ceph.com subvolumeName: csi-vol-cc416d9e-dbf3-11ec-b286-0a580a810213 subvolumePath: /volumes/csi/csi-vol-cc416d9e-dbf3-11ec-b286-0a580a810213/edcfe4d5-bdcb-4b8e-8824-8a03ad94d67c volumeHandle: 0001-0011-openshift-storage-0000000000000001-cc416d9e-dbf3-11ec-b286-0a580a810213 persistentVolumeReclaimPolicy: Delete storageClassName: ocs-storagecluster-cephfs volumeMode: Filesystem status: phase: Bound
使用您在上一步中确定的
subvolumePath
和volumeHandle
值在openshift-storage
命名空间中创建一个新的 PV 和 PVC 对象,指向与旧应用程序 PV 相同的 CephFS 卷:例 5.18. YAML 文件示例
$ cat << EOF >> pv-openshift-storage.yaml apiVersion: v1 kind: PersistentVolume metadata: name: cephfs-pv-legacy-openshift-storage spec: storageClassName: "" accessModes: - ReadWriteMany capacity: storage: 10Gi 1 csi: driver: openshift-storage.cephfs.csi.ceph.com nodeStageSecretRef: name: rook-csi-cephfs-node namespace: openshift-storage volumeAttributes: # Volume Attributes can be copied from the Source testnamespace PV "clusterID": "openshift-storage" "fsName": "ocs-storagecluster-cephfilesystem" "staticVolume": "true" # rootpath is the subvolumePath: you copied from the Source testnamespace PV "rootPath": /volumes/csi/csi-vol-cc416d9e-dbf3-11ec-b286-0a580a810213/edcfe4d5-bdcb-4b8e-8824-8a03ad94d67c volumeHandle: 0001-0011-openshift-storage-0000000000000001-cc416d9e-dbf3-11ec-b286-0a580a810213-clone 2 persistentVolumeReclaimPolicy: Retain volumeMode: Filesystem --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: cephfs-pvc-legacy namespace: openshift-storage spec: storageClassName: "" accessModes: - ReadWriteMany resources: requests: storage: 10Gi 3 volumeMode: Filesystem # volumeName should be same as PV name volumeName: cephfs-pv-legacy-openshift-storage EOF
使用上一步中指定的 YAML 文件,在
openshift-storage
命名空间中创建 PV 和 PVC:$ oc create -f <YAML_file>
<YAML_file>
指定 YAML 文件的名称。
例 5.19. 示例
$ oc create -f pv-openshift-storage.yaml
例 5.20. 输出示例
persistentvolume/cephfs-pv-legacy-openshift-storage created persistentvolumeclaim/cephfs-pvc-legacy created
确保 PVC 在
openshift-storage
命名空间中可用:$ oc get pvc -n openshift-storage
例 5.21. 输出示例
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE cephfs-pvc-legacy Bound cephfs-pv-legacy-openshift-storage 10Gi RWX 14s
进入
openshift-storage
项目:$ oc project openshift-storage
例 5.22. 输出示例
Now using project "openshift-storage" on server "https://api.cluster-5f6ng.5f6ng.sandbox65.opentlc.com:6443".
创建 NSFS 命名空间存储:
$ noobaa namespacestore create nsfs <nsfs_namespacestore> --pvc-name='<cephfs_pvc_name>' --fs-backend='CEPH_FS'
<nsfs_namespacestore>
- 指定 NSFS 命名空间存储的名称。
<cephfs_pvc_name>
在
openshift-storage
命名空间中指定 CephFS PVC 的名称。例 5.23. 示例
$ noobaa namespacestore create nsfs legacy-namespace --pvc-name='cephfs-pvc-legacy' --fs-backend='CEPH_FS'
确保 noobaa-endpoint pod 重启,并在 NSFS 命名空间存储中成功挂载 PVC,例如
/nsfs/legacy-namespace
挂载点:$ oc exec -it <noobaa_endpoint_pod_name> -- df -h /nsfs/<nsfs_namespacestore>
<noobaa_endpoint_pod_name>
指定 noobaa-endpoint pod 的名称。
例 5.24. 示例
$ oc exec -it noobaa-endpoint-5875f467f5-546c6 -- df -h /nsfs/legacy-namespace
例 5.25. 输出示例
Filesystem Size Used Avail Use% Mounted on 172.30.202.87:6789,172.30.120.254:6789,172.30.77.247:6789:/volumes/csi/csi-vol-cc416d9e-dbf3-11ec-b286-0a580a810213/edcfe4d5-bdcb-4b8e-8824-8a03ad94d67c 10G 0 10G 0% /nsfs/legacy-namespace
创建一个 MCG 用户帐户:
$ noobaa account create <user_account> --full_permission --allow_bucket_create=true --new_buckets_path='/' --nsfs_only=true --nsfs_account_config=true --gid <gid_number> --uid <uid_number> --default_resource='legacy-namespace'
<user_account>
- 指定 MCG 用户帐户的名称。
<gid_number>
- 指定 GID 号。
<uid_number>
指定 UID 号。
例 5.26. 示例
重要使用与传统应用的相同
UID
和GID
。您可以从前面的输出中找到它。$ noobaa account create leguser --full_permission --allow_bucket_create=true --new_buckets_path='/' --nsfs_only=true --nsfs_account_config=true --gid 0 --uid 1000660000 --default_resource='legacy-namespace'
创建一个 MCG 存储桶。
在 legacy 应用 pod 的 CephFS PV 和 PVC 的 NSFS 共享中为 S3 创建一个专用文件夹:
$ oc exec -it <pod_name> -- mkdir <mount_path>/nsfs
例 5.27. 示例
$ oc exec -it cephfs-write-workload-generator-no-cache-1-cv892 -- mkdir /mnt/pv/nsfs
使用
nsfs/
路径创建 MCG 存储桶:$ noobaa api bucket_api create_bucket '{ "name": "<bucket_name>", "namespace":{ "write_resource": { "resource": "<nsfs_namespacestore>", "path": "nsfs/" }, "read_resources": [ { "resource": "<nsfs_namespacestore>", "path": "nsfs/" }] } }'
例 5.28. 示例
$ noobaa api bucket_api create_bucket '{ "name": "legacy-bucket", "namespace":{ "write_resource": { "resource": "legacy-namespace", "path": "nsfs/" }, "read_resources": [ { "resource": "legacy-namespace", "path": "nsfs/" }] } }'
检查位于传统应用程序和
openshift-storage
命名空间中的 PVC 中的文件夹的 SELinux 标签:$ oc exec -it <noobaa_endpoint_pod_name> -n openshift-storage -- ls -ltraZ /nsfs/<nsfs_namespacstore>
例 5.29. 示例
$ oc exec -it noobaa-endpoint-5875f467f5-546c6 -n openshift-storage -- ls -ltraZ /nsfs/legacy-namespace
例 5.30. 输出示例
total 567 drwxrwxrwx. 3 root root system_u:object_r:container_file_t:s0:c0,c26 2 May 25 06:35 . -rw-r--r--. 1 1000660000 root system_u:object_r:container_file_t:s0:c0,c26 580138 May 25 06:35 fs_write_cephfs-write-workload-generator-no-cache-1-cv892-data.log drwxrwxrwx. 3 root root system_u:object_r:container_file_t:s0:c0,c26 30 May 25 06:35 ..
$ oc exec -it <pod_name> -- ls -latrZ <mount_path>
例 5.31. 示例
$ oc exec -it cephfs-write-workload-generator-no-cache-1-cv892 -- ls -latrZ /mnt/pv/
例 5.32. 输出示例
total 567 drwxrwxrwx. 3 root root system_u:object_r:container_file_t:s0:c26,c5 2 May 25 06:35 . -rw-r--r--. 1 1000660000 root system_u:object_r:container_file_t:s0:c26,c5 580138 May 25 06:35 fs_write_cephfs-write-workload-generator-no-cache-1-cv892-data.log drwxrwxrwx. 3 root root system_u:object_r:container_file_t:s0:c26,c5 30 May 25 06:35 ..
在这些示例中,您可以看到 SELinux 标签不是不是导致权限被拒绝或访问问题的结果。
确保旧的应用程序和
openshift-storage
pod 在文件中使用相同的 SELinux 标签。您可以以两种方式之一进行:
删除 NSFS 命名空间存储:
删除 MCG 存储桶:
$ noobaa bucket delete <bucket_name>
例 5.33. 示例
$ noobaa bucket delete legacy-bucket
删除 MCG 用户帐户:
$ noobaa account delete <user_account>
例 5.34. 示例
$ noobaa account delete leguser
删除 NSFS 命名空间存储:
$ noobaa namespacestore delete <nsfs_namespacestore>
例 5.35. 示例
$ noobaa namespacestore delete legacy-namespace
删除 PV 和 PVC:
重要在删除 PV 和 PVC 前,请确保 PV 配置了保留策略。
$ oc delete pv <cephfs_pv_name>
$ oc delete pvc <cephfs_pvc_name>
<cephfs_pv_name>
- 指定 legacy 应用的 CephFS PV 名称。
<cephfs_pvc_name>
指定传统应用的 CephFS PVC 名称。
例 5.36. 示例
$ oc delete pv cephfs-pv-legacy-openshift-storage
$ oc delete pvc cephfs-pvc-legacy
5.4.3.1. 更改传统应用程序项目中的默认 SELinux 标签,使其与 openshift-storage 项目中的默认 SELinux 标签匹配
使用
sa.scc.mcs
显示当前的openshift-storage
命名空间:$ oc get ns openshift-storage -o yaml | grep sa.scc.mcs
例 5.37. 输出示例
openshift.io/sa.scc.mcs: s0:c26,c0
编辑旧的应用程序命名空间,并使用
openshift-storage
命名空间的sa.scc.mcs
中的值修改sa.scc.mcs
:$ oc edit ns <appplication_namespace>
例 5.38. 示例
$ oc edit ns testnamespace
$ oc get ns <application_namespace> -o yaml | grep sa.scc.mcs
例 5.39. 示例
$ oc get ns testnamespace -o yaml | grep sa.scc.mcs
例 5.40. 输出示例
openshift.io/sa.scc.mcs: s0:c26,c0
-
重启旧的应用容器集。重新标记所有文件,现在 SELinux 标签与
openshift-storage
部署相匹配。