5.4.3. 从 openshift-storage 命名空间中访问旧的应用程序数据


当使用 Multicloud Object Gateway(MCG)NamespaceStore 文件系统(NSFS)功能时,您需要具有数据位于 openshift-storage 命名空间中的 PVC。几乎在所有情形中,您需要访问的数据不在 openshift-storage 命名空间中,而是位于传统应用程序使用的命名空间中。

要访问存储在另一个命名空间中的数据,您需要在 openshift-storage 命名空间中创建一个指向传统应用使用的同一 CephFS 卷的 PVC。

流程

  1. 使用 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
  2. 进入应用程序命名空间:

    $ oc project <application_namespace>

    例 5.3. 示例

    $ oc project testnamespace
  3. 确保 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
  4. 检查 pod 中的持久性卷(PV)的挂载点。

    1. 从 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

    2. 列出 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}]
  5. 确认 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
  6. 确保 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 ..
  7. 获取您要从 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
  8. 确保来自 openshift-storage 命名空间中的 PVC 可以被访问,以便一个或多个 noobaa-endpoint pod 可以访问 PVC。

    1. volumeAttributes 找到 subvolumePathvolumeHandle 的值。您可以从传统应用程序 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
    2. 使用您在上一步中确定的 subvolumePathvolumeHandle 值在 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
      1
      openshift-storage 命名空间中创建的 PV 的存储容量必须与原始 PV 相同。
      2
      您在 openshift-storage 中创建的目标 PV 的卷处理需要与原始应用程序 PV 不同,例如,在卷句柄末尾添加 -clone
      3
      openshift-storage 命名空间中创建的 PVC 的存储容量必须与原始 PVC 相同。
    3. 使用上一步中指定的 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
    4. 确保 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
    5. 进入 openshift-storage 项目:

      $ oc project openshift-storage

      例 5.22. 输出示例

      Now using project "openshift-storage" on server "https://api.cluster-5f6ng.5f6ng.sandbox65.opentlc.com:6443".
    6. 创建 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'
    7. 确保 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
    8. 创建一个 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. 示例

      重要

      使用与传统应用的相同 UIDGID。您可以从前面的输出中找到它。

      $ 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'
    9. 创建一个 MCG 存储桶。

      1. 在 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
      2. 使用 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/" }]
          }
        }'
    10. 检查位于传统应用程序和 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 标签不是不是导致权限被拒绝或访问问题的结果。

  9. 确保旧的应用程序和 openshift-storage pod 在文件中使用相同的 SELinux 标签。

    您可以以两种方式之一进行:

  10. 删除 NSFS 命名空间存储:

    1. 删除 MCG 存储桶:

      $ noobaa bucket delete <bucket_name>

      例 5.33. 示例

      $ noobaa bucket delete legacy-bucket
    2. 删除 MCG 用户帐户:

      $ noobaa account delete <user_account>

      例 5.34. 示例

      $ noobaa account delete leguser
    3. 删除 NSFS 命名空间存储:

      $ noobaa namespacestore delete <nsfs_namespacestore>

      例 5.35. 示例

      $ noobaa namespacestore delete legacy-namespace
  11. 删除 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 标签匹配

  1. 使用 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
  2. 编辑旧的应用程序命名空间,并使用 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
  3. 重启旧的应用容器集。重新标记所有文件,现在 SELinux 标签与 openshift-storage 部署相匹配。
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.