Todos los productos
Search
Centro de documentos

Container Service for Kubernetes:Mount a dynamic OSS volume using ossfs 2.0 in an ACK cluster

Última actualización: Sep 04, 2026

Monte un bucket de Object Storage Service (OSS) como volumen persistente (PV) en un clúster ACK mediante ossfs 2.0, el cliente basado en FUSE (Filesystem in Userspace) optimizado para cargas de trabajo de lectura y escritura secuencial. Con el aprovisionamiento dinámico, una StorageClass actúa como plantilla que crea y vincula automáticamente un PV al crear una PersistentVolumeClaim (PVC). De este modo, su aplicación puede leer y escribir datos en OSS a través de interfaces POSIX estándar sin necesidad de gestionar los PV manualmente.

ossfs 2.0 destaca por su alto rendimiento en operaciones secuenciales, lo que lo hace ideal para entrenamiento de IA, inference y procesamiento de big data. Para consultar las pruebas de rendimiento, véase ossfs 2.0 client performance benchmarks.

Antes de empezar

Revise las siguientes restricciones estrictas antes de comenzar. ossfs 2.0 no es adecuado para todas las cargas de trabajo; continuar sin verificar estos puntos le hará perder tiempo.

Deténgase aquí si aplica alguno de los siguientes casos:

  • Escrituras aleatorias o concurrentes: ossfs 2.0 no garantiza la consistencia de los datos en operaciones de escritura aleatoria o concurrente. Utilice ossfs 1.0 para bases de datos, edición colaborativa o cualquier carga de trabajo que modifique el contenido de los archivos en el mismo lugar.

  • Versión de Kubernetes inferior a 1.26: La autenticación RRSA requiere Kubernetes 1.26 o posterior. Upgrade your cluster si es necesario.

  • Versión del plugin CSI inferior a 1.33.1: Ambos métodos de autenticación requieren la versión 1.33.1 o posterior del plugin CSI. Update csi-plugin and csi-provisioner si es necesario.

Antes de empezar, asegúrese de contar con lo siguiente:

  • Un clúster ACK con el plugin CSI instalado.

  • Un bucket OSS en la misma cuenta de Alibaba Cloud que su clúster. Para montar un bucket entre cuentas distintas, utilice la autenticación RRSA; consulte FAQ about ossfs 2.0 volumes para más detalles.

Notas de uso

  • Los cambios en los datos son inmediatos: Cualquier modificación o eliminación de archivos en un punto de montaje de ossfs, ya sea desde dentro de un pod o desde el nodo host, se sincroniza inmediatamente con el bucket OSS de origen. Habilite versioning para protegerse contra la pérdida accidental de datos.

  • Verificaciones de estado: Configure un liveness probe en los pods que utilizan volúmenes OSS para comprobar la disponibilidad del punto de montaje. Si el montaje presenta fallas, Kubernetes reinicia automáticamente el pod.

  • Cargas multiparte: Los archivos mayores a 10 MB se cargan automáticamente mediante carga multiparte. Si se interrumpe una carga, las partes incompletas permanecen en el bucket y generan costos de almacenamiento. Configure una lifecycle rule para limpiarlas automáticamente o delete them manually.

Elegir un método de autenticación

RRSA

AccessKey

Tipo de credencial

Temporal, con rotación automática (vía OIDC + STS)

Clave estática de largo plazo

Alcance de permisos

Aislamiento a nivel de pod

Compartido entre todos los pods que usan el mismo Secret

Adecuado para

Entornos de producción y multiinquilino

Solo desarrollo y pruebas

Riesgo por exposición de clave

Bajo: las credenciales caducan automáticamente

Alto: la clave debe revocarse y rotarse manualmente

Rotación de claves

Automática

Manual; requiere actualizar el Secret y reiniciar los pods

Utilice RRSA para entornos de producción. La autenticación AccessKey es aceptable solo para desarrollo y pruebas; una clave estática expuesta o mal configurada requiere revocación manual y provoca una interrupción del servicio durante la rotación.

Ambos métodos siguen el mismo flujo de trabajo general:

  1. Configurar las credenciales (rol RAM para RRSA, o usuario RAM + Secret para AccessKey).

  2. Crear una StorageClass.

  3. Crear una PVC.

  4. Montar el volumen en su aplicación.

Método 1: Autenticación mediante RRSA

RRSA (RAM Roles for Service Accounts) proporciona aislamiento de permisos a nivel de pod mediante credenciales temporales con rotación automática a través de OpenID Connect (OIDC) y Security Token Service (STS). Para más contexto, consulte Use RRSA to authorize different pods to access different cloud services.

Nota

Si utilizó RRSA con una versión del plugin CSI anterior a la 1.30.4, consulte [\[Product Changes\] Version upgrade and mounting process optimization of ossfs in CSI](https://www.alibabacloud.com/help/en/document_detail/2842828.html) para conocer los cambios necesarios en la autorización del rol RAM.

Paso 1: Crear un rol RAM

Omita este paso si ya montó un volumen OSS en este clúster mediante RRSA.

  1. Enable the RRSA feature en la ACK console.

  2. Create a RAM role for an OIDC Identity Provider. Utilice los siguientes parámetros para el rol de ejemplo demo-role-for-rrsa:

    Parámetro

    Valor

    Identity Provider Type

    Seleccione OIDC

    Identity Provider

    Seleccione el proveedor asociado a su clúster, por ejemplo ack-rrsa-<cluster_id>

    oidc:iss

    Mantenga el valor predeterminado

    oidc:aud

    Mantenga el valor predeterminado

    oidc:sub — Key

    Seleccione oidc:sub

    oidc:sub — Operator

    Seleccione StringEquals

    oidc:sub — Value

    Introduzca system:serviceaccount:ack-csi-fuse:csi-fuse-ossfs. El namespace ack-csi-fuse es fijo y no se puede personalizar. El nombre de la cuenta de servicio csi-fuse-ossfs sí puede modificarse; consulte FAQ about ossfs 2.0 volumes.

    Role Name

    Introduzca demo-role-for-rrsa

Paso 2: Otorgar permisos de OSS al rol RAM

  1. Create a custom policy para otorgar acceso a OSS al rol. Reemplace mybucket con el nombre real de su bucket.

    • Acceso de solo lectura

      {
          "Statement": [
              {
                  "Action": [
                      "oss:Get*",
                      "oss:List*"
                  ],
                  "Effect": "Allow",
                  "Resource": [
                      "acs:oss:*:*:mybucket",
                      "acs:oss:*:*:mybucket/*"
                  ]
              }
          ],
          "Version": "1"
      }
    • Acceso de lectura y escritura

      {
          "Statement": [
              {
                  "Action": "oss:*",
                  "Effect": "Allow",
                  "Resource": [
                      "acs:oss:*:*:mybucket",
                      "acs:oss:*:*:mybucket/*"
                  ]
              }
          ],
          "Version": "1"
      }
  2. (Opcional) Si los objetos del bucket están cifrados con una clave maestra de cliente (CMK) en Key Management Service (KMS), otorgue también acceso a KMS. Consulte Encryption.

  3. Grant the custom policy to the demo-role-for-rrsa role.

    Nota

    Para reutilizar un rol RAM existente que ya tenga acceso a OSS, modifique su política de confianza. Consulte Use an existing RAM role and grant the required permissions to the RAM role.

Paso 3: Crear una StorageClass

  1. Cree el archivo ossfs2-sc-rrsa.yaml:

    Parámetro Obligatorio Descripción Valor predeterminado / comportamiento si se omite
    bucket Sí El nombre del bucket OSS que se va a montar —
    path Sí La ruta base dentro del bucket. Con volumeAs: sharepath, cada PV obtiene un subdirectorio único bajo esta ruta, como /ack/<pv-name> Monta la raíz del bucket si se deja en blanco
    url Sí El endpoint del bucket OSS. Utilice un endpoint interno (http://oss-<region>-internal.aliyuncs.com) si el clúster y el bucket están en la misma región o conectados mediante Virtual Private Cloud (VPC). Utilice un endpoint público (http://oss-<region>.aliyuncs.com) para acceso entre regiones.
    Nota

    El formato de endpoint interno vpc100-oss-<region>.aliyuncs.com está obsoleto; cambie al nuevo formato.

    —
    fuseType Sí Debe establecerse en ossfs2 para usar el cliente ossfs 2.0 —
    authType Sí Establezca en rrsa —
    roleName Sí El rol RAM que se asumirá. Para asignar permisos diferentes por PV, cree un rol RAM separado para cada conjunto de permisos y especifíquelo aquí —
    volumeAs No Establezca en sharepath para que cada PV cree un subdirectorio separado bajo path —
    otherOpts No Opciones de montaje adicionales con el formato -o <flag> -o <flag>. Para ver todas las opciones disponibles, consulte ossfs 2.0 mount options Sin opciones adicionales
    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: ossfs2-sc
    parameters:
      bucket: cnfs-oss-test          # The name of your OSS bucket.
      path: /subpath                 # The subdirectory to mount. Leave blank to mount the bucket root.
      url: oss-cn-hangzhou-internal.aliyuncs.com  # Internal endpoint (same region or VPC); use public endpoint for cross-region.
      authType: rrsa
      roleName: demo-role-for-rrsa  # The RAM role created in Step 1.
      fuseType: ossfs2              # Must be ossfs2 to use the ossfs 2.0 client.
      volumeAs: sharepath           # Each PV gets a unique subdirectory under path, e.g., /subpath/ack/<pv-name>.
      otherOpts: "-o close_to_open=false"  # false (default): cache metadata for lower latency. true: fetch fresh metadata on every file open (increases latency and API costs).
    provisioner: ossplugin.csi.alibabacloud.com  # Fixed value.
    reclaimPolicy: Retain           # Only Retain is supported. Deleting the PVC does not delete the PV or OSS data.
    volumeBindingMode: Immediate    # OSS volumes have no zone-based node affinity requirements.

    La siguiente tabla describe los campos de parameters:

  2. Aplique la StorageClass:

    kubectl create -f ossfs2-sc-rrsa.yaml
  3. Compruebe que se creó la StorageClass:

    kubectl get sc ossfs2-sc

    Salida esperada:

    NAME        PROVISIONER                      RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
    ossfs2-sc   ossplugin.csi.alibabacloud.com   Retain          Immediate                                  10s

Paso 4: Crear una PVC

La creación de la PVC desencadena el aprovisionamiento automático del PV subyacente.

  1. Cree el archivo ossfs2-pvc-dynamic.yaml:

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: pvc-ossfs2
      namespace: default
    spec:
      accessModes:
        - ReadWriteMany
      resources:
        requests:
          storage: 20Gi
      storageClassName: ossfs2-sc
  2. Cree la PVC:

    kubectl create -f ossfs2-pvc-dynamic.yaml
  3. Compruebe que la PVC está vinculada al PV creado automáticamente:

    kubectl get pvc pvc-ossfs2

    Salida esperada:

    NAME        STATUS   VOLUME                   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    pvc-ossfs2  Bound    d-bp17y03tpy2b8x******   20Gi       RWX            ossfs2-sc      25s

Paso 5: Montar el volumen en su aplicación

  1. Cree el archivo ossfs2-test.yaml. El siguiente StatefulSet monta la PVC en /data:

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: ossfs2-test
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: ossfs2-test
      template:
        metadata:
          labels:
            app: ossfs2-test
        spec:
          containers:
          - name: nginx
            image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
            ports:
            - containerPort: 80
            volumeMounts:
            - name: pvc-ossfs2
              mountPath: /data
          volumes:
            - name: pvc-ossfs2
              persistentVolumeClaim:
                claimName: pvc-ossfs2
  2. Despliegue la aplicación:

    kubectl create -f ossfs2-test.yaml
  3. Compruebe que el pod se está ejecutando:

    kubectl get pod -l app=ossfs2-test

    Salida esperada:

    NAME            READY   STATUS    RESTARTS   AGE
    ossfs2-test-0   1/1     Running   0          2m
  4. Verifique el acceso de lectura y escritura al punto de montaje:

    # Write a test file
    kubectl exec -it ossfs2-test-0 -- touch /data/test.txt
    # List files at the mount point
    kubectl exec -it ossfs2-test-0 -- ls /data

    La salida debe incluir test.txt, lo que confirma que el volumen está montado y permite escritura.

Método 2: Autenticación mediante AccessKey

Importante

Este método utiliza una clave estática de largo plazo. Úselo únicamente para desarrollo y pruebas. Para producción, utilice RRSA authentication en su lugar.

Si se revoca la AccessKey referenciada por un PV o cambian sus permisos, todos los pods que usan ese volumen pierden el acceso inmediatamente. Para restaurar el acceso: actualice las credenciales en el Secret y luego reinicie los pods. Esto provoca una breve interrupción del servicio y debe realizarse durante una ventana de mantenimiento.

Paso 1: Crear un usuario RAM y almacenar las credenciales en un Secret

Crear un usuario RAM y otorgar permisos de OSS

  1. Create a RAM user si no tiene uno.

  2. Create a custom policy para otorgar acceso a OSS. Reemplace mybucket con el nombre real de su bucket.

    • Acceso de solo lectura

      {
          "Statement": [
              {
                  "Action": [
                      "oss:Get*",
                      "oss:List*"
                  ],
                  "Effect": "Allow",
                  "Resource": [
                      "acs:oss:*:*:mybucket",
                      "acs:oss:*:*:mybucket/*"
                  ]
              }
          ],
          "Version": "1"
      }
    • Acceso de lectura y escritura

      {
          "Statement": [
              {
                  "Action": "oss:*",
                  "Effect": "Allow",
                  "Resource": [
                      "acs:oss:*:*:mybucket",
                      "acs:oss:*:*:mybucket/*"
                  ]
              }
          ],
          "Version": "1"
      }
  3. (Opcional) Si los objetos del bucket están cifrados con una CMK en KMS, otorgue también acceso a KMS. Consulte Encryption.

  4. Grant the custom policy to the RAM user.

  5. Create an AccessKey pair para el usuario RAM.

Almacenar la AccessKey en un Secret de Kubernetes

Ejecute el siguiente comando. Reemplace los valores de marcador de posición con su ID de AccessKey y Secret reales:

kubectl create -n default secret generic oss-secret \
  --from-literal='akId=<your-access-key-id>' \
  --from-literal='akSecret=<your-access-key-secret>'

Paso 2: Crear una StorageClass

  1. Cree el archivo ossfs2-sc.yaml:

    Configuración del Secret

    Parámetro

    Obligatorio

    Descripción

    csi.storage.k8s.io/node-publish-secret-name

    Sí

    El nombre del Secret que almacena la AccessKey

    csi.storage.k8s.io/node-publish-secret-namespace

    Sí

    El namespace donde se encuentra el Secret

    Configuración del volumen

    Parámetro Obligatorio Descripción Valor predeterminado / comportamiento si se omite
    fuseType Sí Debe establecerse en ossfs2 para usar el cliente ossfs 2.0 —
    bucket Sí El nombre del bucket OSS que se va a montar —
    path No La ruta de montaje dentro del bucket, relativa a la raíz del bucket Monta la raíz del bucket si se deja en blanco
    url Sí El endpoint del bucket OSS. Utilice un endpoint interno (http://oss-<region>-internal.aliyuncs.com) para acceso en la misma región o conectado por VPC, o un endpoint público (http://oss-<region>.aliyuncs.com) para acceso entre regiones.
    Nota

    El formato de endpoint interno vpc100-oss-<region>.aliyuncs.com está obsoleto.

    —
    otherOpts No Opciones de montaje adicionales con el formato -o <flag> -o <flag>. Para ver todas las opciones disponibles, consulte ossfs 2.0 mount options Sin opciones adicionales
    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: ossfs2-sc
    parameters:
      csi.storage.k8s.io/node-publish-secret-name: oss-secret       # The Secret created above.
      csi.storage.k8s.io/node-publish-secret-namespace: default      # The namespace where the Secret lives.
      fuseType: ossfs2              # Must be ossfs2 to use the ossfs 2.0 client.
      bucket: cnfs-oss-test         # The name of your OSS bucket.
      path: /subpath                # The subdirectory to mount. Leave blank to mount the bucket root.
      url: oss-cn-hangzhou-internal.aliyuncs.com  # Internal endpoint (same region or VPC); use public endpoint for cross-region.
      otherOpts: "-o close_to_open=false"  # false (default): cache metadata for lower latency. true: fetch fresh metadata on every file open (increases latency and API costs).
    provisioner: ossplugin.csi.alibabacloud.com  # Fixed value.
    reclaimPolicy: Retain           # Only Retain is supported. Deleting the PVC does not delete the PV or OSS data.
    volumeBindingMode: Immediate    # OSS volumes have no zone-based node affinity requirements.
  2. Cree la StorageClass:

    kubectl create -f ossfs2-sc.yaml

Paso 3: Crear una PVC

  1. Cree el archivo ossfs2-pvc-dynamic.yaml:

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: pvc-ossfs2
      namespace: default
    spec:
      accessModes:
        - ReadWriteMany
      resources:
        requests:
          storage: 20Gi
      storageClassName: ossfs2-sc
  2. Cree la PVC:

    kubectl create -f ossfs2-pvc-dynamic.yaml
  3. Compruebe que la PVC está vinculada:

    kubectl get pvc pvc-ossfs2

    Salida esperada:

    NAME        STATUS   VOLUME                   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    pvc-ossfs2  Bound    d-bp17y03tpy2b8x******   20Gi       RWX            ossfs2-sc      25s

Paso 4: Montar el volumen en su aplicación

  1. Cree el archivo ossfs2-test.yaml:

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: ossfs2-test
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: ossfs2-test
      template:
        metadata:
          labels:
            app: ossfs2-test
        spec:
          containers:
          - name: nginx
            image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
            ports:
            - containerPort: 80
            volumeMounts:
            - name: pvc-ossfs2
              mountPath: /data
          volumes:
            - name: pvc-ossfs2
              persistentVolumeClaim:
                claimName: pvc-ossfs2
  2. Despliegue la aplicación:

    kubectl create -f ossfs2-test.yaml
  3. Compruebe que el pod se está ejecutando:

    kubectl get pod -l app=ossfs2-test

    Salida esperada:

    NAME            READY   STATUS    RESTARTS   AGE
    ossfs2-test-0   1/1     Running   0          2m
  4. Verifique el acceso de lectura y escritura:

    # Write a test file
    kubectl exec -it ossfs2-test-0 -- touch /data/test.txt
    # List files at the mount point
    kubectl exec -it ossfs2-test-0 -- ls /data

    La salida debe incluir test.txt, lo que confirma que el volumen está montado y permite escritura.

Aplicación en producción

Categoría

Mejores prácticas

Seguridad

Utilice RRSA, ya que proporciona credenciales temporales con rotación automática y aislamiento de permisos a nivel de pod, eliminando el riesgo de exposición de claves estáticas. Otorgue únicamente los permisos mínimos necesarios (solo lectura o lectura/escritura, limitados a un bucket específico).

Rendimiento

Utilice un endpoint interno cuando el clúster y el bucket estén en la misma región para evitar costos de transferencia de datos públicos y reducir la latencia. Para cargas de trabajo que leen muchos archivos pequeños, mantenga close_to_open=false (predeterminado) para reducir las llamadas a la API de metadatos. Establezca close_to_open=true solo si otro sistema actualiza frecuentemente los objetos en el bucket y su pod necesita visibilidad inmediata. Para ajustes adicionales, consulte ossfs 2.0 mount options.

Adecuación de carga de trabajo

ossfs 2.0 está optimizado para cargas de trabajo con muchas lecturas y de solo anexión: entrenamiento de IA, inference, procesamiento de big data y conducción autónoma. No es adecuado para cargas de trabajo con escrituras aleatorias, como bases de datos o edición colaborativa.

Costos

Configure una regla de ciclo de vida en su bucket OSS para eliminar automáticamente las cargas multiparte incompletas. Esto evita la acumulación de costos de almacenamiento por cargas interrumpidas de archivos grandes.

Operaciones

Configure un liveness probe en sus pods para comprobar la disponibilidad del punto de montaje; Kubernetes reiniciará el pod automáticamente si falla el montaje. Configure container storage monitoring para rastrear el rendimiento del volumen y recibir alertas antes de que los problemas afecten su carga de trabajo.

Preguntas frecuentes