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 o S3 e é denominado tipo s3 nos YAMLs 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 anexadas

Copiar do armazenamento de objetos para o armazenamento de objetos

Certifique-se de que tem 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 empregos e criar ou ler segredos no seu cluster ou espaço de nomes. Consulte o exemplo seguinte para ver as autorizações.

Crie um emprego

Para criar um emprego, 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) usada pela sua transferência e, em seguida, adicione autorizações à conta para ler e escrever segredos através de funções e vinculaçõ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á tiver 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 emprego:

    ---
    
    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 criar uma instância do emprego, pode monitorizar o respetivo estado através de kubectl comandos, como kubectl describe. Para validar a transferência, liste os objetos no contentor de destino para validar se os seus 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 do emprego.

O emprego pede a um pod que transfira 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:

kubectl logs transfer-job-<pod_id_suffix_obtained_from_describe_operation_on_job> -n transfer-ns

Registos de empregos bem-sucedidos:

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 de 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 de blocos 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 em funcionamento com conectividade ao ponto final do S3.
  • Privilégios para criar empregos e segredos no seu cluster.
  • Para a replicação do armazenamento de blocos, um pod com uma PersistentVolumeClaim (PVC) anexada da qual quer fazer uma cópia de segurança para o armazenamento de objetos e privilégios para inspecionar empregos e PVCs em execução.
  • Para a replicação do armazenamento de blocos, uma janela durante a qual não são feitas escritas no PersistentVolume (PV).
  • Para o restauro do armazenamento de blocos a partir de um ponto final do 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 da transferência, o pod não pode fazer escritas. Para evitar desanexar o PV montado do emprego, o processo de transferência de dados funciona executando o emprego 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, primeiro, tem de encontrar 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 o emprego 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 NODE_NAME para usar no ficheiro YAML do emprego 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 para usar no ficheiro YAML do emprego de transferência de dados.

  3. Encontre o nome da PVC:

    kubectl get pvc www-web-0 -o 'jsonpath={.spec.volumeName}'
    

    Registe o resultado deste comando como PVC_NAME para usar no ficheiro YAML do emprego de transferência de dados.

  4. Encontre o fornecedor de armazenamento da PVC:

    kubectl get pvc www-web-0 -o jsonpath='{.metadata.annotations.volume\.v1\.kubernetes\.io\/storage-provisioner}'
    

    Registe o resultado deste comando como PROVISIONER_TYPE para usar no ficheiro YAML do emprego de transferência de dados.

Crie segredos

Para replicar ficheiros para o armazenamento de objetos entre clusters, primeiro, tem de criar uma instância dos segredos no seu cluster do Kubernetes. Tem de usar chaves correspondentes para os dados do segredo para que a ferramenta extraia as credenciais.

Para fazer a transferência num espaço de nomes existente, consulte o exemplo seguinte 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 emprego

Com os dados que recolheu na secção anterior, crie um emprego com a ferramenta de transferência de dados. O emprego de transferência de dados tem uma montagem hostPath que referencia o caminho do PV de interesse e um nodeSelector para o nó relevante.

Segue-se um exemplo de um emprego 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 acontece com a 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 o emprego de transferência de dados tem de ser executado 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 no emprego.

Tenha em atenção os seguintes detalhes ao transferir o armazenamento de blocos para o armazenamento de objetos:

  • Por predefinição, as ligações simbólicas são seguidas e replicadas para o armazenamento de objetos, mas é feita uma cópia profunda em vez de superficial. Após o restauro, destrói as ligações simbólicas.
  • Tal como acontece com a 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.

Restaure do armazenamento de objetos para o armazenamento de blocos

Atribua um PV

Para restaurar o armazenamento de blocos a partir de um ponto final do armazenamento de objetos, siga estes passos:

  1. Atribua um volume persistente a segmentar no restauro. Use uma 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 da PVC:

    kubectl get pvc restore-pvc -n restore-ns
    

    Quando a PVC está no estado Bound, está pronta para ser usada no pod que a reidrata.

  3. Se um conjunto com estado consumir o PV, tem de corresponder às PVCs do StatefulSet processadas. 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. Atribua previamente PVCs com nomes como ss-pvc-name-0 e ss-pvc-name-1 para garantir que os pods resultantes consomem os volumes atribuídos previamente.

Hidrate o PV

Depois de a PVC estar vinculada a um PV, inicie o emprego 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

Depois de o emprego terminar a execução, 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.