Gestionar el almacenamiento de objetos

Directrices para asignar nombres a los segmentos de almacenamiento

Los nombres de los segmentos deben cumplir las siguientes convenciones de nomenclatura:

  • Ser único en el proyecto. Un proyecto añade un prefijo único al nombre del segmento para asegurarse de que no haya conflictos en la organización. En el improbable caso de que coincidan el prefijo y el nombre de un contenedor en distintas organizaciones, no se podrá crear el contenedor y se mostrará un error bucket name in use.
  • Tener entre 1 y 57 caracteres.
  • No incluyas información personal identificable.
  • Cumplir los requisitos de DNS.
  • Empieza por una letra y solo puede contener letras, números y guiones.

Instalar la CLI de la herramienta s3cmd

La herramienta s3cmd es una herramienta de línea de comandos para gestionar el almacenamiento de objetos.

  1. Para descargar la herramienta, ve al directorio desde el que se extrajo el paquete de GDC.
  2. Ejecuta los siguientes comandos para extraer la imagen s3cmd, s3cmd.tar.tar.gz, en un directorio temporal vacío:

    tmpdir=$(mktemp -d)
    
    gdcloud artifacts extract oci/ $tmpdir \
      --image-name=$(gdcloud artifacts tree oci | grep s3cmd.tar | sed 's/^.* //')
    
  3. scp el archivo tar en un equipo cliente en el que uses s3cmd para las operaciones con objetos. Descomprime e instala la imagen.

Elige uno de los siguientes métodos de instalación para instalar la herramienta s3cmd:

Instalar mediante un archivo tar

  1. Para descomprimir el archivo e instalar el paquete s3cmd, ejecuta los siguientes comandos. Debes tener el módulo distutils de Python para instalar el paquete. El módulo suele formar parte del paquete principal de Python o puedes instalarlo con tu gestor de paquetes.

    tar xvf /tmp/gpc-system-tar-files/s3cmd.tar.tar.gz
    cd /tmp/gpc-system-tar-files/s3cmd
    sudo python3 setup.py install
    
  2. Opcional: Limpia los archivos descargados:

    rm /tmp/gpc-system-tar-files/s3cmd.tar.tar.gz
    rm -r /tmp/gpc-system-tar-files/s3cmd
    

Instalar con una imagen de Docker

  1. Para instalar la imagen s3cmd, ejecuta los siguientes comandos:

    docker load --input s3cmd-docker.tar
    export S3CFG=/EMPTY_FOLDER_PATH/
    alias s3cmd="docker run -it --net=host --mount=type=bind,source=/$S3CFG/,target=/g/
    s3cmd-docker:latest -c /g/s3cfg"
    
  2. Opcional: Limpia los archivos descargados:

    rm s3cmd-docker.tar
    
  3. Añade la exportación y el alias al archivo .bashrc para que se conserven después de reiniciar el cliente.

Configurar la herramienta s3cmd

Usa la herramienta s3cmd para realizar operaciones basadas en objetos.

Ejecuta el comando s3cmd --configure y especifica lo siguiente:

  1. Clave de acceso: introduce la clave de acceso obtenida del secreto en Obtener credenciales de acceso.
  2. Clave secreta: introduce la clave secreta obtenida del secreto en Obtener credenciales de acceso.
  3. Región predeterminada: pulsa ENTER.
  4. Endpoint de S3: introduce el endpoint que te proporcione tu operador de infraestructura (IO).
  5. Para usar el estilo de nomenclatura de DNS, introduce s3://%(bucket).
  6. Opcional: Introduce una contraseña de cifrado para proteger los archivos en tránsito.
  7. En Ruta a GPG, introduce /usr/bin/gpg.
  8. Introduce Yes para usar el protocolo HTTPS.
  9. Pulsa Enter para omitir el nombre del servidor proxy.

Crear segmentos de almacenamiento

Antes de empezar

Un espacio de nombres de proyecto gestiona los recursos de los contenedores en el clúster de administrador raíz. Debes tener un proyecto para crear un segmento. Para crear un proyecto, consulta el artículo Crear un proyecto. Debes tener los permisos de segmento adecuados para realizar las siguientes operaciones. Consulta cómo conceder acceso a un contenedor.

Crear un segmento

Para crear un segmento, aplica una especificación de segmento al espacio de nombres de tu proyecto:

    kubectl apply -f bucket.yaml

A continuación, se muestra un ejemplo de especificación de un contenedor:

    apiVersion: object.gdc.goog/v1alpha1
    kind: Bucket
    metadata:
      name: BUCKET_NAME
      namespace: NAMESPACE_NAME
    spec:
      description: DESCRIPTION
      storageClass: standard-rwo
      bucketPolicy :
        lockingPolicy :
          defaultObjectRetentionDays: RETENTION_DAY_COUNT

Para obtener más información, consulta la referencia de la API Bucket.

Mostrar segmentos de almacenamiento

Para enumerar todos los contenedores a los que tienes acceso en un arrendatario de almacenamiento de objetos determinado, sigue estos pasos:

  1. Ejecuta los siguientes comandos para enumerar todos los segmentos:

    kubectl get buckets --all-namespaces
    kubectl get buckets --namespace NAMESPACE_NAME
    

Eliminar segmentos de almacenamiento

Puedes eliminar segmentos de almacenamiento con la CLI. Los contenedores deben estar vacíos para poder eliminarlos.

  1. Usa el comando GET o DESCRIBE en la sección Ver configuración del contenedor para obtener el nombre completo del contenedor.

  2. Si el contenedor no está vacío, vacíelo:

    s3cmd rm --recursive -—force s3://FULLY_QUALIFIED_BUCKET_NAME
    
  3. Elimina el segmento vacío:

    kubectl delete buckets/BUCKET_NAME --namespace NAMESPACE_NAME
    

Ver la configuración del segmento

Usa cualquiera de los dos comandos para ver los detalles de configuración de un contenedor:

    kubectl describe buckets/BUCKET_NAME --namespace NAMESPACE_NAME
    kubectl get buckets/BUCKET_NAME --namespace NAMESPACE_NAME -o yaml

Definir un periodo de conservación de objetos

De forma predeterminada, puede eliminar objetos en cualquier momento. Habilita el bloqueo de objetos con un periodo de retención para evitar que se eliminen todos los objetos del segmento durante el número de días especificado. No puedes eliminar un segmento hasta que hayas eliminado todos los objetos después del periodo de conservación.

Debes habilitar el bloqueo de objetos al crear el segmento. No puedes habilitar ni inhabilitar el bloqueo de objetos después de crear un segmento. Sin embargo, puede modificar el periodo de conservación de objetos predeterminado.

Puedes crear un contenedor con o sin el bloqueo de objetos habilitado. Si has habilitado el bloqueo de objetos, especificar un periodo de conservación predeterminado es opcional.

Para modificar el periodo de retención, actualiza el campo Bucket.spec.bucketPolicy.lockingPolicy.defaultObjectRetentionDays del recurso de contenedor.

A continuación, se muestra un ejemplo de cómo actualizar el campo en el recurso de contenedor:

apiVersion: object.gdc.goog/v1alpha1
kind: Bucket
metadata:
  name: BUCKET_NAME
  namespace: NAMESPACE_NAME
spec:
  description: "This bucket has a default retention period specified."
  storageClass: standard-rwo
  bucketPolicy :
    lockingPolicy :
      defaultObjectRetentionDays: RETENTION_DAY_COUNT
---
apiVersion: object.gdc.goog/v1alpha1
kind: Bucket
metadata:
  name: BUCKET_NAME
  namespace: NAMESPACE_NAME
spec:
  description: "This would enable object locking but not specify a default retention period."
  storageClass: standard-rwo
  bucketPolicy :
    lockingPolicy :
---
apiVersion: object.gdc.goog/v1alpha1
kind: Bucket
metadata:
  name: BUCKET_NAME
  namespace: NAMESPACE_NAME
spec:
  description: "This bucket does not have locking or retention enabled."
  storageClass: standard-rwo

Las actualizaciones del periodo de conservación se aplican a los objetos creados en el segmento después de la actualización. En el caso de los objetos creados anteriormente, el periodo de conservación no cambia.

Cuando habilitas el bloqueo de objetos, si intentas sobrescribir un objeto, se añade una nueva versión del objeto. Puedes recuperar ambas versiones del objeto. Para obtener información sobre cómo mostrar versiones de objetos, consulta ListObjectVersions en la documentación de Amazon Web Services: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectVersions.html

Para crear un segmento de escritura única y lectura múltiple (WORM), consulta la sección Segmento WORM.

Conceder acceso al segmento

Puedes dar acceso a un cubo a otros usuarios o cuentas de servicio creando y aplicando RoleBindings con roles predefinidos.

Funciones predefinidas

  • project-bucket-object-viewer: este rol permite a un usuario enumerar todos los segmentos del proyecto, enumerar los objetos de esos segmentos y leer objetos y metadatos de objetos. Este rol no te permite realizar operaciones de escritura en objetos, como subir, sobrescribir o eliminar.

  • project-bucket-object-admin: este rol permite a un usuario enumerar todos los segmentos del proyecto y realizar operaciones de lectura y escritura en objetos, como subir, sobrescribir o eliminar.

  • project-bucket-admin: este rol permite a los usuarios gestionar todos los contenedores del espacio de nombres indicado, así como todos los objetos de esos contenedores.

Para ver una lista completa de los permisos concedidos a estos roles, consulta la sección Permisos de roles predefinidos.

Para obtener los permisos que necesitas para crear enlaces de roles de proyecto, pide al administrador de gestión de identidades y accesos del proyecto que te conceda el rol Administrador de gestión de identidades y accesos de proyectos (project-iam-admin).

A continuación, se muestra un ejemplo de cómo crear un RoleBinding para conceder acceso a un usuario y a una cuenta de servicio:

  1. Crea un archivo YAML en tu sistema, como rolebinding-object-admin-all-buckets.yaml.

     apiVersion: rbac.authorization.k8s.io/v1
     kind: RoleBinding
     metadata:
       namespace: NAMESPACE_NAME
       name: readwrite-all-buckets
     roleRef:
       kind: Role
       name: project-bucket-object-admin
       apiGroup: rbac.authorization.k8s.io
     subjects:
     - kind: ServiceAccount
       namespace: NAMESPACE_NAME
       name: SA_NAME
     - kind: User
       namespace: NAMESPACE_NAME
       name: bob@example.com  # Could be bob or bob@example.com based on your organization settings.
       apiGroup: rbac.authorization.k8s.io
     ```
    
  2. Aplica el archivo YAML:

    kubectl apply \
    -f rolebinding-object-admin-all-buckets.yaml
    

Obtener credenciales de acceso a un segmento

Cuando concedes acceso a un bucket, las credenciales de acceso se crean en un secreto.

El formato del nombre del secreto es object-storage-key-SUBJECT_TYPE-SUBJECT_HASH.

  • Los valores de SUBJECT_TYPE son los siguientes:
    • user: el usuario.
    • sa: el ServiceAccount.
  • SUBJECT_HASH es el hash SHA256 codificado en base32 del nombre del asunto.

Por ejemplo, el usuario bob@foo.com tiene el secreto llamado:

object-storage-key-user-oy6jdqd6bxfoqcecn2ozv6utepr5bgh355vfku7th5pmejqubdja

Acceder al secreto de usuario

En el caso de un asunto de usuario, el secreto se encuentra en el espacio de nombres object-storage-access-keys del clúster de administrador raíz.

  1. Busca el nombre secreto:

    kubectl auth can-i --list --namespace object-storage-access-keys | grep object-storage-key-
    

    Recibirás un resultado similar al siguiente:

    secrets        []        [object-storage-key-nl-user-oy6jdqd6bxfoqcecn2ozv6utepr5bgh355vfku7th5pmejqubdja,object-storage-key-std-user-oy6jdqd6bxfoqcecn2ozv6utepr5bgh355vfku7th5pmejqubdja]        [get]
    
  2. Obtén el contenido del secreto correspondiente para acceder a los contenedores:

    kubectl get -o yaml --namespace object-storage-access-keys secret
    object-storage-key-rm-user-oy6jdqd6bxfoqcecn2ozv6utepr5bgh355vfku7th5pmejqubdja
    

    Recibirás un resultado similar al siguiente:

    data:
      access-key-id: MEhYM08wWUMySjcyMkVKTFBKRU8=
      create-time: MjAyMi0wNy0yMiAwMTowODo1OS40MTQyMTE3MDMgKzAwMDAgVVRDIG09KzE5OTAuMzQ3OTE2MTc3
      secret-access-key: Ump0MVRleVN4SmhCSVJhbmlnVDAwbTJZc0IvRlJVendqR0JuYVhiVA==
    
  3. Decodifica el ID de clave de acceso y el secreto:

    echo "MEhYM08wWUMySjcyMkVKTFBKRU8=" | base64 -d \
        && echo \
        && echo "Ump0MVRleVN4SmhCSVJhbmlnVDAwbTJZc0IvRlJVendqR0JuYVhiVA==" | base64 -d
    

    Recibirás un resultado similar al siguiente:

    0HX3O0YC2J722EJLPJEO
    Rjt1TeySxJhBIRanigT00m2YsB/FRUzwjGBnaXbT
    
  4. Sigue las instrucciones de la sección Configurar s3cmd con la información resultante.

Acceder al secreto de la cuenta de servicio

En el caso de un asunto de cuenta de servicio, el secreto está en el mismo espacio de nombres que el contenedor. Para encontrar el nombre, ejecuta el siguiente comando:

  kubectl get --namespace NAMESPACE_NAME secrets -o=jsonpath=
  '{.items[?(@.metadata.annotations.object\.gdc\.goog/subject=="SA_NAME")].metadata.name}'

Recibirás un resultado similar al siguiente:

  object-storage-key-rm-sa-mng3olp3vsynhswzasowzu3jgzct2ert72pjp6wsbzqhdwckwzbq

Puedes hacer referencia al secreto en tu pod como variables de entorno (https://kubernetes.io/docs/concepts/configuration/secret/#using-secrets-as-environment-variables) o archivos (https://kubernetes.io/docs/concepts/configuration/secret/#using-secrets-as-files-from-a-pod).

Permisos de rol predefinidos

Permisos project-bucket-object-viewer

Este rol concede permisos para obtener y enumerar objetos y metadatos de objetos en el segmento.

El rol project-bucket-object-viewer tiene los siguientes permisos:

  • Permisos de la API de cubos:

    1. Obtener
    2. Lista
    3. Ver
  • Permisos de almacenamiento de objetos de S3:

    1. GetObject
    2. GetObjectAcl
    3. GetObjectVersion
    4. ListBucket
    5. ListBucketVersions
    6. ListBucketMultipartUploads
    7. ListMultipartUploadParts

Permisos project-bucket-object-admin

Este rol concede permisos para colocar y eliminar objetos, versiones de objetos y etiquetas en el segmento. Además, también concede todos los permisos de project-bucket-object-viewer.

El rol project-bucket-object-admin tiene los siguientes permisos de almacenamiento de objetos:

  • Permisos de almacenamiento de objetos de S3:

    1. AbortMultipartUpload
    2. DeleteObject
    3. DeleteObjectVersion
    4. PutObject
    5. RestoreObject

Permisos project-bucket-admin

Este rol concede permisos para crear, actualizar o eliminar recursos Bucket en el espacio de nombres del proyecto. Además, también otorga todos los permisos de project-bucket-object-admin.

El rol project-bucket-object-admin tiene los siguientes permisos:

  • Permisos de la API de cubos:

    1. Crear
    2. Actualizar
    3. Eliminar

Crear un segmento WORM

Un segmento WORM se asegura de que nada sobrescriba los objetos y los conserva durante un periodo mínimo. El registro de auditoría es un ejemplo de caso práctico de un contenedor WORM.

Sigue estos pasos para crear un segmento WORM:

  1. Configura un periodo de conservación al crear el segmento. Por ejemplo, el siguiente ejemplo de contenedor tiene un periodo de conservación de 365 días.

    apiVersion: object.gdc.goog/v1alpha1
    kind: Bucket
    metadata:
      name: foo logging-bucket
      namespace: foo-service
    spec:
      description: "Audit logs for foo"
      storageClass: standard-rwo
      bucketPolicy :
        lockingPolicy :
          defaultObjectRetentionDays: 365
    
  2. Asigna el rol project-bucket-object-viewer a todos los usuarios que necesiten acceso de solo lectura:

    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      namespace: foo-service
      name: object-readonly-access
    roleRef:
      kind: Role
      name: project-bucket-object-viewer
      apiGroup: rbac.authorization.k8s.io
    subjects:
    - kind: ServiceAccount
      namespace: foo-service
      name: foo-log-processor
    - kind: User
      name: bob@example.com
      apiGroup: rbac.authorization.k8s.io
    
  3. Concede el rol project-bucket-object-admin a los usuarios que necesiten escribir contenido en el contenedor:

    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      namespace: foo-service
      name: object-write-access
    roleRef:
      kind: Role
      name: project-bucket-object-viewer
      apiGroup: rbac.authorization.k8s.io
    subjects:
    - kind: ServiceAccount
      namespace: foo-service
      name: foo-service-account
    

Restaurar datos del almacenamiento de objetos en el sistema de archivos del almacenamiento en bloques

Asignar un volumen persistente

Para restaurar archivos de un endpoint de almacenamiento de objetos, sigue estos pasos:

  1. Asigna un volumen persistente (PV) al destino de la restauración. Usa una reclamación de volumen persistente (PVC) para asignar el volumen, como se muestra en el siguiente ejemplo:

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: restore-pvc
      namespace: restore-ns
    spec:
      storageClassName: standard-rwo
      accessModes:
    ReadWriteOnce
      resources:
        requests:
          storage: 1Gi # Need sufficient capacity for full restoration.
    
  2. Comprueba el estado del PVC:

    kubectl get pvc restore-pvc -n restore-ns
    

    Cuando el PVC está en estado Bound, se puede usar en el pod que lo rehidrata.

  3. Si un conjunto Stateful acaba consumiendo el PV, debes hacer coincidir los PVC de StatefulSet renderizados. Los pods que StatefulSet produce consumen los volúmenes hidratados. En el siguiente ejemplo se muestran plantillas de reclamación de volumen en un StatefulSet llamado ss.

      volumeClaimTemplates:
      - metadata:
          name: pvc-name
        spec:
          accessModes: [ "ReadWriteOnce" ]
          storageClassName: standard-rwo
          resources:
            requests:
              storage: 1Gi
    
  4. Preasigna PVCs con nombres como ss-pvc-name-0 y ss-pvc-name-1 para asegurarte de que los pods resultantes consuman los volúmenes preasignados.

Hidratar el volumen persistente (PV)

Una vez que el PVC se haya vinculado a un PV, inicia el Job para rellenar el PV:

apiVersion: batch/v1
kind: Job
metadata:
  name: transfer-job
  namespace: transfer
spec:
  template:
    spec:
      serviceAccountName: data-transfer-sa
      volumes:
      - name: data-transfer-restore-volume
        persistentVolumeClaim:
          claimName: restore-pvc
      containers:
      - name: storage-transfer-pod
        image: gcr.io/private-cloud-staging/storage-transfer:latest
        command: /storage-transfer
        args:
        - --src_endpoint=https://your-src-endpoint.com
        - --src_path=/your-src-bucket
        - --src_credentials=transfer/src-secret
        - --dst_path=/restore-pv-mnt-path
        - --src_type=s3
        - --dst_type=local
      volumeMounts:
      - mountPath: /restore-pv-mnt-path
        name: data-transfer-restore-volume

Una vez que se haya ejecutado Job, los datos del contenedor de almacenamiento de objetos se incluirán en el volumen. Otro pod puede consumir los datos usando los mismos mecanismos estándar para montar un volumen.