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.
- Para descargar la herramienta, ve al directorio desde el que se extrajo el paquete de GDC.
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/^.* //')
scp
el archivo tar en un equipo cliente en el que usess3cmd
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
Para descomprimir el archivo e instalar el paquete
s3cmd
, ejecuta los siguientes comandos. Debes tener el módulodistutils
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
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
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"
Opcional: Limpia los archivos descargados:
rm s3cmd-docker.tar
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:
- Clave de acceso: introduce la clave de acceso obtenida del secreto en Obtener credenciales de acceso.
- Clave secreta: introduce la clave secreta obtenida del secreto en Obtener credenciales de acceso.
- Región predeterminada: pulsa
ENTER
. - Endpoint de S3: introduce el endpoint que te proporcione tu operador de infraestructura (IO).
- Para usar el estilo de nomenclatura de DNS, introduce
s3://%(bucket)
. - Opcional: Introduce una contraseña de cifrado para proteger los archivos en tránsito.
- En Ruta a GPG, introduce
/usr/bin/gpg
. - Introduce
Yes
para usar el protocolo HTTPS. - 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:
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.
Usa el comando
GET
oDESCRIBE
en la sección Ver configuración del contenedor para obtener el nombre completo del contenedor.Si el contenedor no está vacío, vacíelo:
s3cmd rm --recursive -—force s3://FULLY_QUALIFIED_BUCKET_NAME
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:
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 ```
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
: elServiceAccount
.
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.
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]
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==
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
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:
- Obtener
- Lista
- Ver
Permisos de almacenamiento de objetos de S3:
GetObject
GetObjectAcl
GetObjectVersion
ListBucket
ListBucketVersions
ListBucketMultipartUploads
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:
AbortMultipartUpload
DeleteObject
DeleteObjectVersion
PutObject
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:
- Crear
- Actualizar
- 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:
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
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
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:
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.
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.Si un conjunto
Stateful
acaba consumiendo el PV, debes hacer coincidir los PVC de StatefulSet renderizados. Los pods queStatefulSet
produce consumen los volúmenes hidratados. En el siguiente ejemplo se muestran plantillas de reclamación de volumen en un StatefulSet llamadoss
.volumeClaimTemplates: - metadata: name: pvc-name spec: accessModes: [ "ReadWriteOnce" ] storageClassName: standard-rwo resources: requests: storage: 1Gi
Preasigna PVCs con nombres como
ss-pvc-name-0
yss-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.