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:
Configurar las credenciales (rol RAM para RRSA, o usuario RAM + Secret para AccessKey).
Crear una StorageClass.
Crear una PVC.
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.
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.
-
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:suboidc:sub — Operator
Seleccione StringEquals
oidc:sub — Value
Introduzca
system:serviceaccount:ack-csi-fuse:csi-fuse-ossfs. El namespaceack-csi-fusees fijo y no se puede personalizar. El nombre de la cuenta de serviciocsi-fuse-ossfssí 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
-
Create a custom policy para otorgar acceso a OSS al rol. Reemplace
mybucketcon 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" }
-
(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.
-
Grant the custom policy to the demo-role-for-rrsa role.
NotaPara 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
-
Cree el archivo
ossfs2-sc-rrsa.yaml:Parámetro Obligatorio Descripción Valor predeterminado / comportamiento si se omite bucketSí El nombre del bucket OSS que se va a montar — pathSí 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 urlSí 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.NotaEl formato de endpoint interno
vpc100-oss-<region>.aliyuncs.comestá obsoleto; cambie al nuevo formato.— fuseTypeSí Debe establecerse en ossfs2para usar el cliente ossfs 2.0— authTypeSí Establezca en rrsa— roleNameSí 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í — volumeAsNo Establezca en sharepathpara que cada PV cree un subdirectorio separado bajopath— otherOptsNo Opciones de montaje adicionales con el formato -o <flag> -o <flag>. Para ver todas las opciones disponibles, consulte ossfs 2.0 mount optionsSin 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: -
Aplique la StorageClass:
kubectl create -f ossfs2-sc-rrsa.yaml -
Compruebe que se creó la StorageClass:
kubectl get sc ossfs2-scSalida 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.
-
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 -
Cree la PVC:
kubectl create -f ossfs2-pvc-dynamic.yaml -
Compruebe que la PVC está vinculada al PV creado automáticamente:
kubectl get pvc pvc-ossfs2Salida 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
-
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 -
Despliegue la aplicación:
kubectl create -f ossfs2-test.yaml -
Compruebe que el pod se está ejecutando:
kubectl get pod -l app=ossfs2-testSalida esperada:
NAME READY STATUS RESTARTS AGE ossfs2-test-0 1/1 Running 0 2m -
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 /dataLa salida debe incluir
test.txt, lo que confirma que el volumen está montado y permite escritura.
Método 2: Autenticación mediante AccessKey
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
Create a RAM user si no tiene uno.
-
Create a custom policy para otorgar acceso a OSS. Reemplace
mybucketcon 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" }
-
(Opcional) Si los objetos del bucket están cifrados con una CMK en KMS, otorgue también acceso a KMS. Consulte Encryption.
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
-
Cree el archivo
ossfs2-sc.yaml:Configuración del Secret
Parámetro
Obligatorio
Descripción
csi.storage.k8s.io/node-publish-secret-nameSí
El nombre del Secret que almacena la AccessKey
csi.storage.k8s.io/node-publish-secret-namespaceSí
El namespace donde se encuentra el Secret
Configuración del volumen
Parámetro Obligatorio Descripción Valor predeterminado / comportamiento si se omite fuseTypeSí Debe establecerse en ossfs2para usar el cliente ossfs 2.0— bucketSí El nombre del bucket OSS que se va a montar — pathNo 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 urlSí 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.NotaEl formato de endpoint interno
vpc100-oss-<region>.aliyuncs.comestá obsoleto.— otherOptsNo Opciones de montaje adicionales con el formato -o <flag> -o <flag>. Para ver todas las opciones disponibles, consulte ossfs 2.0 mount optionsSin 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. -
Cree la StorageClass:
kubectl create -f ossfs2-sc.yaml
Paso 3: Crear una PVC
-
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 -
Cree la PVC:
kubectl create -f ossfs2-pvc-dynamic.yaml -
Compruebe que la PVC está vinculada:
kubectl get pvc pvc-ossfs2Salida 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
-
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 -
Despliegue la aplicación:
kubectl create -f ossfs2-test.yaml -
Compruebe que el pod se está ejecutando:
kubectl get pod -l app=ossfs2-testSalida esperada:
NAME READY STATUS RESTARTS AGE ossfs2-test-0 1/1 Running 0 2m -
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 /dataLa 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 |
|
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. |