Las transferencias de datos pueden ocurrir entre los siguientes elementos:
- Reclamación de volumen persistente (PVC) y almacenamiento de objetos
- Almacenamiento de objetos y almacenamiento de objetos (dentro de GDC)
El almacenamiento de objetos en GDC es compatible con S3 y se conoce como tipo s3
en los archivos YAML de Kubernetes.
Tipos de fuentes y destinos de datos
- Almacenamiento de objetos (denominado "s3"): Almacenamiento de objetos presente en GDC
- Almacenamiento local (denominado "local"): Almacenamiento en PVCs adjuntos
Cómo copiar datos del almacenamiento de objetos a otro almacenamiento de objetos
Asegúrate de cumplir con los siguientes requisitos previos:
- Un extremo de S3 con permisos de lectura para la fuente y un extremo de S3 con permisos de escritura para el destino.
- Si no tienes permiso para crear buckets con las credenciales, la transferencia fallará si no existe el bucket de destino. Asegúrate de que el bucket de destino exista si ese es el caso.
- Privilegios para crear Jobs y crear o leer Secrets dentro de tu clúster o espacio de nombres Consulta el siguiente ejemplo de permisos.
Crea un trabajo
Para crear un trabajo, sigue estos pasos:
Crea un espacio de nombres:
apiVersion: v1 kind: Namespace metadata: name: transfer-ns
Crea credenciales:
--- apiVersion: v1 kind: Secret metadata: name: src-secret namespace: transfer-ns data: access-key-id: NkFDTUg3WDBCVDlQMVpZMU5MWjU= # base 64 encoded version of key access-key: VkRkeWJsbFgzb2FZanMvOVpnSi83SU5YUjk3Y0Q2TUdxZ2d4Q3dpdw== # base 64 encoded version of secret key --- apiVersion: v1 kind: Secret metadata: name: dst-secret namespace: transfer-ns data: access-key-id: NkFDTUg3WDBCVDlQMVpZMU5MWjU= # base 64 encoded version of key access-key: VkRkeWJsbFgzb2FZanMvOVpnSi83SU5YUjk3Y0Q2TUdxZ2d4Q3dpdw== # base 64 encoded version of secret key ---
Estas credenciales son las mismas que obtuviste en la sección de almacenamiento de objetos.
Crea una cuenta de servicio (SA) que use tu transferencia y, luego, agrega permisos a la cuenta para leer y escribir secretos con roles y vinculaciones de roles. No es necesario que agregues permisos si tu SA predeterminada del espacio de nombres o tu SA personalizada ya tienen estos permisos.
--- apiVersion: v1 kind: ServiceAccount metadata: name: transfer-service-account namespace: transfer-ns --- apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: read-secrets-role namespace: transfer-ns rules: - apiGroups: [""] resources: ["secrets"] verbs: ["get", "watch", "list"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: read-secrets-rolebinding namespace: transfer-ns subjects: - kind: ServiceAccount name: transfer-service-account namespace: transfer-ns roleRef: kind: Role name: read-secrets-role apiGroup: rbac.authorization.k8s.io ---
Obtén los certificados de CA para tus sistemas de almacenamiento de objetos. Puedes obtener los mismos certificados de tu AO o PA.
--- apiVersion: v1 kind: Secret metadata: name: src-cert namespace: transfer-ns data: ca.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURBekNDQWV1Z0F3SUJBZ0lSQUpHM2psOFZhTU85a1FteGdXUFl3N3d3RFFZSktvWklodmNOQVFFTEJRQXcKR3pFWk1CY0dBMVVFQXhNUVltOXZkSE4wY21Gd0xYZGxZaTFqWVRBZUZ3MHlNekF5TVRVd01USXlNakZhRncweQpNekExTVRZd01USXlNakZhTUJzeEdUQVhCZ05WQkFNVEVHSnZiM1J6ZEhKaGNDMTNaV0l0WTJFd2dnRWlNQTBHCkNTcUdTSWI== # base 64 encoded version of certificate --- apiVersion: v1 kind: Secret metadata: name: dst-cert namespace: transfer-ns data: ca.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURBekNDQWV1Z0F3SUJBZ0lSQUtoaEJXWWo3VGZlUUZWUWo0U0RpckV3RFFZSktvWklodmNOQVFFTEJRQXcKR3pFWk1CY0dBMVVFQXhNUVltOXZkSE4wY21Gd0xYZGxZaTFqWVRBZUZ3MHlNekF6TURZeU16TTROVEJhRncweQpNekEyTURReU16TTROVEJhTUJzeEdUQVhCZ05WQkFNVEVHSnZiM1J6ZEhKaGNDMTNaV0l0WTJFd2dnRWlNQTBHCkNTcUdTSWIzRFFF== # base 64 encoded version of certificate. Can be same OR different than source certificate. ---
Opcional: Crea un LoggingTarget para ver los registros del servicio de transferencia en Loki.
apiVersion: logging.gdc.goog/v1 kind: LoggingTarget metadata: namespace: transfer-ns # Same namespace as your transfer job name: logtarg1 spec: # Choose matching pattern that identifies pods for this job # Optional # Relationship between different selectors: AND selector: # Choose pod name prefix(es) to consider for this job # Observability platform will scrape all pods # where names start with specified prefix(es) # Should contain [a-z0-9-] characters only # Relationship between different list elements: OR matchPodNames: - transfer-job # Choose the prefix here that matches your transfer job name serviceName: transfer-service
Crea el trabajo:
--- apiVersion: batch/v1 kind: Job metadata: name: transfer-job namespace: transfer-ns spec: template: spec: serviceAccountName: transfer-service-account #service account created earlier containers: - name: storage-transfer-pod # image: gcr.io/private-cloud-staging/storage-transfer:latest imagePullPolicy: Always #will always pull the latest image command: - /storage-transfer args: - '--src_endpoint=objectstorage.zone1.google.gdch.test' #Your endpoint here - '--dst_endpoint=objectstorage.zone1.google.gdch.test' #Your endpoint here - '--src_path=aecvd-bucket1' #Please use Fully Qualified Name - '--dst_path=aklow-bucket2' #Please use Fully Qualified Name - '--src_credentials=transfer-ns/src-secret' #Created earlier - '--dst_credentials=transfer-ns/dst-secret' #Created earlier - '--dst_ca_certificate_reference=transfer-ns/dst-cert' #Created earlier - '--src_ca_certificate_reference=transfer-ns/src-cert' #Created earlier - '--src_type=s3' - '--dst_type=s3' - '--bandwidth_limit=10M' #Optional of the form '10K', '100M', '1G' bytes per second restartPolicy: OnFailure #Will restart on failure. ---
Supervisa la transferencia de datos
Después de crear una instancia del trabajo, puedes supervisar su estado con comandos de kubectl
, como kubectl describe
. Para verificar la transferencia, enumera los objetos dentro de tu bucket de destino para validar que tus datos se transfirieron. La herramienta de transferencia de datos es independiente de la ubicación de los extremos involucrados en la transferencia.
Ejecuta lo siguiente:
kubectl describe transfer-job -n transfer-ns
El comando anterior te indica el estado del trabajo.
El trabajo solicita a un pod que transfiera los datos. Puedes obtener el nombre del Pod y consultar los registros para ver si hay errores durante la transferencia.
Para ver los registros del pod, ejecuta el siguiente comando:
kubectl logs transfer-job-<pod_id_suffix_obtained_from_describe_operation_on_job> -n transfer-ns
Registros de trabajos exitosos:
DEBUG : Starting main for transfer
I0607 21:34:39.183106 1 transfer.go:103] "msg"="Starting transfer " "destination"="sample-bucket" "source"="/data"
2023/06/07 21:34:39 NOTICE: Bandwidth limit set to {100Mi 100Mi}
I0607 21:34:49.238901 1 transfer.go:305] "msg"="Job finished polling " "Finished"=true "Number of Attempts"=2 "Success"=true
I0607 21:34:49.239675 1 transfer.go:153] "msg"="Transfer completed." "AvgSpeed"="10 KB/s" "Bytes Moved"="10.0 kB" "Errors"=0 "Files Moved"=10 "FilesComparedAtSourceAndDest"=3 "Time since beginning of transfer"="1.0s"
Ver los registros te permite conocer la velocidad de transferencia de datos, que no es la misma que el ancho de banda utilizado, los bytes transferidos, la cantidad de archivos con errores y los archivos transferidos.
Copia el almacenamiento en bloques al almacenamiento de objetos
Asegúrate de cumplir con los siguientes requisitos previos:
- Un extremo de S3 con un ID de clave de S3 y una clave de acceso secreta con, al menos, permisos de ESCRITURA para el bucket dedicado al que deseas transferir datos.
- Un clúster en funcionamiento con conectividad al extremo de S3
- Privilegios para crear trabajos y Secrets dentro de tu clúster
- Para la replicación del almacenamiento de bloques, un Pod con un
PersistentVolumeClaim
(PVC) adjunto del que deseas crear una copia de seguridad en el almacenamiento de objetos y privilegios para inspeccionar los trabajos y los PVC en ejecución. - Para la replicación del almacenamiento en bloque, es un período durante el cual no se realizan escrituras en el
PersistentVolume
(PV). - Para la restauración del almacenamiento en bloque desde un extremo de almacenamiento de objetos, privilegios para asignar un PV con capacidad suficiente.
Para replicar un PV en el almacenamiento de objetos, debes adjuntar un volumen a un Pod existente. Durante la ventana de transferencia, el Pod no debe realizar ninguna escritura. Para evitar que el PV montado se separe del trabajo, el proceso de transferencia de datos ejecuta el trabajo de transferencia en la misma máquina que el Pod y usa un montaje hostPath para exponer el volumen en el disco. En preparación para la transferencia, primero debes encontrar el nodo en el que se ejecuta el Pod y los metadatos adicionales, como el UID del Pod y el tipo de PVC, para hacer referencia a la ruta de acceso adecuada en el nodo. Debes sustituir estos metadatos en el archivo YAML de ejemplo que se describe en la siguiente sección.
Recopila metadatos
Para recopilar los metadatos necesarios para crear el trabajo de transferencia de datos, sigue estos pasos:
Busca el nodo que tiene el Pod programado:
kubectl get pod POD_NAME -o jsonpath='{.spec.nodeName}'
Registra el resultado de este comando como NODE_NAME para usarlo en el archivo YAML del trabajo de transferencia de datos.
Busca el UID del Pod:
kubectl get pod POD_NAME -o 'jsonpath={.metadata.uid}'
Registra el resultado de este comando como POD_UID para usarlo en el archivo YAML del trabajo de transferencia de datos.
Busca el nombre del PVC:
kubectl get pvc www-web-0 -o 'jsonpath={.spec.volumeName}'
Registra el resultado de este comando como PVC_NAME para usarlo en el archivo YAML del trabajo de transferencia de datos.
Busca el aprovisionador de almacenamiento de PVC:
kubectl get pvc www-web-0 -o jsonpath='{.metadata.annotations.volume\.v1\.kubernetes\.io\/storage-provisioner}'
Registra el resultado de este comando como PROVISIONER_TYPE para usarlo en el archivo YAML del trabajo de transferencia de datos.
Crea secretos
Para replicar archivos en el almacenamiento de objetos en todos los clústeres, primero debes crear instancias de los secretos dentro de tu clúster de Kubernetes. Debes usar claves coincidentes para los datos secretos para que la herramienta extraiga las credenciales.
Para realizar la transferencia en un espacio de nombres existente, consulta el siguiente ejemplo de creación de Secrets en un espacio de nombres transfer
:
apiVersion: v1
kind: Secret
metadata:
name: src-secret
namespace: transfer
data:
access-key-id: c3JjLWtleQ== # echo -n src-key| base64 -w0
access-key: c3JjLXNlY3JldA== # echo -n src-secret| base64 -w0
---
apiVersion: v1
kind: Secret
metadata:
name: dst-secret
namespace: transfer
data:
access-key-id: ZHN0LWtleQ== # echo -n dst-key| base64 -w0
access-key: ZHN0LXNlY3JldA== # echo -n dst-secret| base64 -w0
Crea el trabajo
Con los datos que recopilaste en la sección anterior, crea un trabajo con la herramienta de transferencia de datos. El trabajo de transferencia de datos tiene un montaje hostPath
que hace referencia a la ruta de acceso del PV de interés y un nodeSelector
para el nodo pertinente.
El siguiente es un ejemplo de un trabajo de transferencia de datos:
apiVersion: batch/v1
kind: Job
metadata:
name: transfer-job
namespace: transfer
spec:
template:
spec:
nodeSelector: NODE_NAME
serviceAccountName: data-transfer-sa
containers:
- name: storage-transfer-pod
image: storage-transfer
command:
- /storage-transfer
args:
- --dst_endpoint=https://your-dst-endpoint.com
- --src_path=/pvc-data
- --dst_path=transfer-dst-bucket
- --dst_credentials=transfer/dst-secret
- --src_type=local
- --dst_type=s3
volumeMounts:
- mountPath: /pvc-data
name: pvc-volume
volumes:
- name: pvc-volume
hostPath:
path: /var/lib/kubelet/pods/POD_UID/volumes/PROVISIONER_TYPE/PVC_NAME
restartPolicy: Never
Al igual que con la transferencia de datos de S3, debes crear un Secret que contenga las claves de acceso para el extremo de destino en el clúster de Kubernetes, y el trabajo de transferencia de datos debe ejecutarse con una cuenta de servicio con privilegios adecuados para leer el Secret del servidor de la API. Supervisa el estado de la transferencia con los comandos estándar de kubectl
que operan en el trabajo.
Ten en cuenta los siguientes detalles cuando transfieras almacenamiento en bloque a almacenamiento de objetos:
- De forma predeterminada, los vínculos simbólicos se siguen y replican en el almacenamiento de objetos, pero se realiza una copia profunda en lugar de una superficial. Cuando se restablece, destruye los vínculos simbólicos.
- Al igual que con la replicación del almacenamiento de objetos, la clonación en un subdirectorio del bucket es destructiva. Asegúrate de que el bucket esté disponible exclusivamente para tu volumen.
Restablece desde el almacenamiento de objetos al almacenamiento de bloques
Asigna un PV
Para restablecer el almacenamiento en bloque desde un extremo de almacenamiento de objetos, sigue estos pasos:
Asigna un volumen persistente al destino en la restauración. Usa un 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: "default" accessModes: ReadWriteOnce resources: requests: storage: 1Gi # Need sufficient capacity for full restoration.
Verifica el estado del PVC:
kubectl get pvc restore-pvc -n restore-ns
Una vez que el PVC se encuentra en estado
Bound
, está listo para consumirse dentro del Pod que lo rehidrata.Si un conjunto con estado finalmente consume el PV, debes hacer coincidir las PVC renderizadas del conjunto con estado. Los Pods que produce StatefulSet consumen los volúmenes hidratados. En el siguiente ejemplo, se muestran plantillas de reclamo de volumen en un StatefulSet llamado
ss
.volumeClaimTemplates: - metadata: name: pvc-name spec: accessModes: [ "ReadWriteOnce" ] storageClassName: "default" resources: requests: storage: 1Gi
Asigna previamente PVC con nombres como
ss-pvc-name-0
yss-pvc-name-1
para garantizar que los Pods resultantes consuman los volúmenes asignados previamente.
Hidrata el PV
Después de que el PVC se vincule a un PV, inicia el trabajo para propagar 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: storage-transfer
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 finaliza la ejecución del trabajo, los datos del bucket de almacenamiento de objetos completan el volumen. Un Pod independiente puede consumir los datos con los mismos mecanismos estándar para montar un volumen.