As transferências de dados podem ocorrer entre o seguinte:
- Reivindicação de volume persistente (PVC) e armazenamento de objetos
- Armazenamento de objetos e armazenamento de objetos (no GDC)
O armazenamento de objetos no GDC é compatível com S3 e é denominado tipo s3
nos ficheiros YAML do Kubernetes.
Tipos de origens/destinos de dados
- Armazenamento de objetos (denominado "s3"): armazenamento de objetos presente no GDC
- Armazenamento local (denominado "local"): armazenamento em PVCs anexados
Copiar do armazenamento de objetos para o armazenamento de objetos
Certifique-se de que cumpre os seguintes pré-requisitos:
- Um ponto final do S3 com autorizações de leitura para a origem e um ponto final do S3 com autorizações de escrita para o destino.
- Se não tiver autorização para criar contentores com as credenciais, a transferência falha se o contentor de destino não existir. Certifique-se de que o contentor de destino existe, se for esse o caso.
- Privilégios para criar tarefas e criar ou ler segredos no cluster ou no espaço de nomes. Veja o exemplo seguinte para autorizações.
Crie um trabalho
Para criar uma tarefa, siga estes passos:
Crie um espaço de nomes:
apiVersion: v1 kind: Namespace metadata: name: transfer-ns
Crie credenciais:
--- 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 credenciais são as mesmas que obteve na secção de armazenamento de objetos.
Crie uma conta de serviço (SA) que seja usada pela sua transferência e, em seguida, adicione autorizações à conta para ler e escrever segredos através de funções e associações de funções. Não precisa de adicionar autorizações se a SA do espaço de nomes predefinido ou a SA personalizada já tiverem estas autorizações.
--- 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 ---
Obtenha os certificados da AC para os seus sistemas de armazenamento de objetos. Pode obter os mesmos certificados junto do seu AO/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: crie um LoggingTarget para ver os registos do serviço de transferência no 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
Crie o trabalho:
--- 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. ---
Monitorize a transferência de dados
Depois de instanciar a tarefa, pode monitorizar o respetivo estado através de comandos, como kubectl describe
.kubectl
Para validar a transferência, liste os objetos no contentor de destino para validar se os dados foram transferidos. A ferramenta de transferência de dados é independente da localização dos pontos finais envolvidos na transferência.
Execute o seguinte:
kubectl describe transfer-job -n transfer-ns
O comando anterior indica o estado da tarefa.
A tarefa pede a um pod para transferir os dados. Pode obter o nome do pod e consultar os registos para ver se existem erros durante a transferência.
Para ver os registos do pod, execute o seguinte comando:
kubectl logs transfer-job-<pod_id_suffix_obtained_from_describe_operation_on_job> -n transfer-ns
Registos de tarefas bem-sucedidas:
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"
A visualização dos registos permite-lhe ver a velocidade de transferência de dados, que não é a mesma que a largura de banda usada, os bytes movidos, o número de ficheiros com erros e os ficheiros movidos.
Copie o armazenamento em bloco para o armazenamento de objetos
Certifique-se de que cumpre os seguintes pré-requisitos:
- Um ponto final do S3 com um ID da chave do S3 e uma chave de acesso secreta com, pelo menos, autorizações de ESCRITA para o contentor dedicado para o qual quer transferir dados.
- Um cluster funcional com conetividade ao ponto final do S3.
- Privilégios para criar tarefas e segredos no cluster.
- Para a replicação do armazenamento de blocos, um pod com um volume persistente (PVC) anexado que quer fazer uma cópia de segurança para o armazenamento de objetos e privilégios para inspecionar tarefas e PVCs em execução.
PersistentVolumeClaim
- Para a replicação do armazenamento de blocos, existe um período durante o qual não são feitas escritas no
PersistentVolume
(PV). - Para a restauração do armazenamento de blocos a partir de um ponto final de armazenamento de objetos, privilégios para atribuir um PV com capacidade suficiente.
Para replicar um PV para o armazenamento de objetos, tem de anexar um volume a um pod existente. Durante a janela de transferência, o POD não pode fazer nenhuma gravação. Para evitar separar o PV montado da tarefa, o processo de transferência de dados funciona executando a tarefa de transferência na mesma máquina que o pod e usando uma montagem hostPath para expor o volume no disco. Em preparação para a transferência, tem de encontrar primeiro o nó no qual o pod está a ser executado e metadados adicionais, como o UID do pod e o tipo de PVC, para referenciar o caminho adequado no nó. Tem de substituir estes metadados no ficheiro YAML de exemplo descrito na secção seguinte.
Recolha metadados
Para recolher os metadados necessários para criar a tarefa de transferência de dados, siga estes passos:
Encontre o nó que tem o pod agendado:
kubectl get pod POD_NAME -o jsonpath='{.spec.nodeName}'
Registe o resultado deste comando como o NODE_NAME a usar no ficheiro YAML da tarefa de transferência de dados.
Encontre o UID do pod:
kubectl get pod POD_NAME -o 'jsonpath={.metadata.uid}'
Registe o resultado deste comando como o POD_UID a usar no ficheiro YAML da tarefa de transferência de dados.
Encontre o nome do PVC:
kubectl get pvc www-web-0 -o 'jsonpath={.spec.volumeName}'
Registe o resultado deste comando como o PVC_NAME a usar no ficheiro YAML da tarefa de transferência de dados.
Encontre o aprovisionador de armazenamento de PVC:
kubectl get pvc www-web-0 -o jsonpath='{.metadata.annotations.volume\.v1\.kubernetes\.io\/storage-provisioner}'
Registe o resultado deste comando como o PROVISIONER_TYPE a usar no ficheiro YAML da tarefa de transferência de dados.
Crie segredos
Para replicar o ficheiro para o armazenamento de objetos em vários clusters, primeiro tem de instanciar os segredos no cluster do Kubernetes. Tem de usar chaves correspondentes para os dados secretos para que a ferramenta extraia as credenciais.
Para fazer a transferência num espaço de nomes existente, consulte o seguinte exemplo de criação de segredos num espaço de nomes 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
Crie o trabalho
Com os dados que recolheu na secção anterior, crie uma tarefa com a ferramenta de transferência de dados. A tarefa de transferência de dados tem uma montagem hostPath
que faz referência ao caminho do PV de interesse e um nodeSelector
para o nó relevante.
Segue-se um exemplo de uma tarefa de transferência de dados:
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
Tal como na transferência de dados do S3, tem de criar um segredo
que contenha as chaves de acesso para o ponto final de destino no cluster
do Kubernetes, e a tarefa de transferência de dados tem de ser executada com uma conta de serviço com
privilégios adequados para ler o segredo do servidor da API. Monitorize o estado
da transferência com comandos kubectl
padrão que operam na tarefa.
Considere os seguintes detalhes ao transferir armazenamento em blocos para armazenamento de objetos:
- Por predefinição, os links simbólicos seguem e são replicados para o armazenamento de objetos, mas é feita uma cópia profunda em vez de superficial. Após o restauro, destrói os links simbólicos.
- Tal como na replicação do armazenamento de objetos, a clonagem para uma subdiretoria do contentor é destrutiva. Certifique-se de que o contentor está disponível exclusivamente para o seu volume.
Faça a restauração do armazenamento de objetos para o armazenamento de blocos
Atribua um PV
Para restaurar o armazenamento em blocos a partir de um ponto final de armazenamento de objetos, siga estes passos:
Atribua um volume persistente para segmentar na restauração. Use um PVC para atribuir o volume, conforme mostrado no exemplo seguinte:
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.
Verifique o estado do PVC:
kubectl get pvc restore-pvc -n restore-ns
Depois de o PVC estar no estado
Bound
, está pronto para ser consumido no pod que o reidrata.Se um conjunto com estado consumir eventualmente o PV, tem de fazer corresponder os PVCs do conjunto com estado renderizados. Os pods que o StatefulSet produz consomem os volumes hidratados. O exemplo seguinte mostra modelos de reivindicação de volume num StatefulSet denominado
ss
.volumeClaimTemplates: - metadata: name: pvc-name spec: accessModes: [ "ReadWriteOnce" ] storageClassName: "default" resources: requests: storage: 1Gi
Pré-atribua PVCs com nomes como
ss-pvc-name-0
ess-pvc-name-1
para garantir que os pods resultantes consomem os volumes pré-atribuídos.
Hidrate o PV
Depois de o PVC estar associado a um PV, inicie a tarefa para preencher o 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
Após a conclusão da execução da tarefa, os dados do contentor de armazenamento de objetos preenchem o volume. Um Pod separado pode consumir os dados através dos mesmos mecanismos padrão para montar um volume.