Descarregue os dados

As transferências de dados podem ocorrer entre o seguinte:

  1. Reivindicação de volume persistente (PVC) e armazenamento de objetos
  2. 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

  1. Armazenamento de objetos (denominado "s3"): armazenamento de objetos presente no GDC
  2. 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:

  1. Crie um espaço de nomes:

    apiVersion: v1
    kind: Namespace
    metadata:
      name: transfer-ns
    
  2. 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.

  3. 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
    
    ---
    
  4. 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.
    
    ---
    
    
  5. 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
    
  6. 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:

  1. 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.

  2. 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.

  3. 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.

  4. 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:

  1. 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.
    
  2. 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.

  3. 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
    
  4. Pré-atribua PVCs com nomes como ss-pvc-name-0 e ss-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.