Transferir dados

O dispositivo com isolamento físico do Google Distributed Cloud (GDC) transfere dados arbitrários para e de um ambiente com isolamento físico do Google Distributed Cloud. As transferências podem ser iniciadas manualmente ou definidas para ocorrer automaticamente em um intervalo definido.

Exemplos de transferências:

  • Baixar atualizações de software ou cargas de trabalho atualizadas do cliente
  • Fazer upload de dados de clientes, métricas de dispositivos ou registros de segurança, auditoria e operações de dispositivos
  • Snapshots de dados de backup

A ferramenta storage-transfer transfere dados e é distribuída em uma imagem para uso em contêineres em execução no cluster.

Fontes de dados

A ferramenta Storage Transfer Service oferece flexibilidade com as condições operacionais do dispositivo isolado fisicamente do GDC. As APIs compatíveis com o S3 podem acessar destinos de armazenamento interno e expostos externamente. A ferramenta também é compatível com fontes do sistema de arquivos local e do Cloud Storage.

O operador é responsável por manter o controle das chaves de acesso e de quaisquer outras credenciais, secrets ou dados sensíveis necessários para a autenticação e conexão do dispositivo isolado do GDC a redes externas. O operador também é responsável pela configuração da rede externa.

Consulte Criar buckets de armazenamento para criar e acessar o armazenamento externo.

Armazenamento local

O armazenamento local está contido no ambiente de contêiner do pod e inclui o sistema de arquivos temporário ou volumes montados. A ServiceAccount vinculada ao pod precisa ter acesso a todos os destinos de montagem ao montar volumes.

Armazenamento do S3

O armazenamento disponível na rede pode ser acessado pela API compatível com S3. O serviço pode ser externo ou exposto apenas na rede do cluster. Você precisa fornecer um URL acessível e credenciais padronizadas ativadas usando um secret do Kubernetes.

Os dados definidos de armazenamento de objetos e de vários nós são acessados pela API S3. Consulte as seções relevantes para configurar o armazenamento de vários nós e o armazenamento de objetos no appliance isolado do GDC.

Armazenamento em nuvem

Você precisa fornecer um URL acessível e credenciais padronizadas montadas usando um Secret.

Se você estiver acessando um bucket do Cloud Storage com controles de acesso uniformes, defina a flag --bucket-policy-only como true.

Credenciais

Um Secret do Kubernetes é necessário para usar o serviço de transferência do Cloud Storage para definições de origem ou destino do S3 ou do GCS. Eles podem ser fornecidos com uma conta de serviço remota ou uma conta de usuário.

Ao usar secrets em uma definição de Job ou CronJob, o JobSpec precisa ser anexado a uma ServiceAccount do Kubernetes que tenha acesso aos secrets.

Crie uma ServiceAccount usada pela transferência e adicione permissões a ela para ler e gravar secrets usando papéis e vinculações de papéis. Você pode optar por não criar uma ServiceAccount se a ServiceAccount padrão do namespace ou a ServiceAccount personalizada já tiver permissões.

  apiVersion: v1
  kind: ServiceAccount
  metadata:
    name: transfer-service-account
    namespace: NAMESPACE
  ---
  apiVersion: rbac.authorization.k8s.io/v1
  kind: Role
  metadata:
    name: read-secrets-role
    namespace: NAMESPACE
  rules:
  - apiGroups: [""]
    resources: ["secrets"]
    verbs: ["get", "watch", "list"]
  ---
  apiVersion: rbac.authorization.k8s.io/v1
  kind: RoleBinding
  metadata:
    name: read-secrets-rolebinding
    namespace: NAMESPACE
  subjects:
  - kind: ServiceAccount
    name: transfer-service-account
    namespace: NAMESPACE
    roleRef:
      kind: Role
      name: read-secrets-role
      apiGroup: rbac.authorization.k8s.io

Contas de serviço remotas

Para conseguir credenciais da conta de serviço do Cloud Storage e fazer uma transferência, acesse https://developers.google.com/workspace/guides/create-credentials#create_credentials_for_a_service_account. Essas credenciais precisam ser armazenadas em um secret no campo service-account-key.

Veja um exemplo:

apiVersion: v1
data:
  service-account-key: BASE_64_ENCODED_VERSION_OF_CREDENTIAL_FILE_CONTENTS
kind: Secret
metadata:
  name: gcs-secret
  namespace: NAMESPACE
type: Opaque

Contas de usuário

É possível usar uma conta de usuário para autenticação com buckets compatíveis com o S3, não com o Cloud Storage. É necessário especificar o argumento --src_type ou --dst_type como s3.

kubectl create secret -n NAMESPACE generic S3_CREDENTIAL_SECRET_NAME \
    --from-literal=access-key-id=ACCESS_KEY_ID
    --from-literal=access-key=ACCESS_KEY

Substitua:

  • NAMESPACE: o nome do namespace em que você vai criar a definição de job.
  • SECRET_NAME: o nome do secret que você está criando.
  • ACCESS_KEY_ID: o valor encontrado no campo Chave de acesso no console do Google Cloud . Ao configurar o Object Storage, isso é chamado de access-key-id.
  • ACCESS_KEY: o valor encontrado no campo Secret no console do Google Cloud . Ao configurar para o Object Storage, essa é a secret-key ou o Secret.

Certificados

Forneça certificados para validação no job com um secret do Kubernetes que contenha uma chave de dados ca.crt.

  apiVersion: v1
  kind: Secret
  metadata:
    name: SRC_CERTIFICATE_SECRET_NAME
    namespace: NAMESPACE
  data:
    ca.crt : BASE_64_ENCODED_SOURCE_CERTIFICATE
  ---
  apiVersion: v1
  kind: Secret
  metadata:
    name: DST_CERTIFICATE_SECRET_NAME
    namespace: NAMESPACE
  data:
    ca.crt : BASE_64_ENCODED_DESTINATION_CERTIFICATE # Can be same OR different than source certificate.

Os certificados podem ser fornecidos por referência à ferramenta usando os argumentos src_ca_certificate_reference e dst_ca_certificate_reference no formato NAMESPACE/SECRET_NAME. Exemplo:

...
      containers:
      - name: storage-transfer-pod
        image: gcr.io/private-cloud-staging/storage-transfer:latest
        command:
        - /storage-transfer
        args:
        ...
        - --src_ca_certificate_reference=NAMESPACE/SRC_CERTIFICATE_SECRET_NAME
        - --dst_ca_certificate_reference=NAMESPACE/DST_CERTIFICATE_SECRET_NAME

Para o armazenamento S3 no appliance, use diretamente o segredo trust-store-root-ext como o certificado da CA. Exemplo:

containers:
      - name: storage-transfer-pod
        image: gcr.io/private-cloud-staging/storage-transfer:latest
        command:
        - /storage-transfer
        args:
        - --src_type=s3
        - --src_ca_certificate_reference=NAMESPACE/trust-store-root-ext

Opcional: defina um LoggingTarget para ver os registros no Loki

Por padrão, os registros dos jobs só podem ser visualizados nos recursos do Kubernetes e não estão disponíveis na pilha de observabilidade. Eles precisam ser configurados com um LoggingTarget para serem visualizados.

  apiVersion: logging.gdc.goog/v1alpha1
  kind: LoggingTarget
  metadata:
    namespace: NAMESPACE # 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:
        - data-transfer-job # Choose the prefix here that matches your transfer job name
    serviceName: transfer-service

Definir um job integrado

Os usuários gerenciam os próprios recursos de Job. Para transferências de dados de uso único, defina um Job. O job cria um pod para executar o contêiner storage-transfer.

Exemplo de job:

apiVersion: batch/v1
kind: Job
metadata:
  name: data-transfer-job
  namespace: NAMESPACE
spec:
  template:
    spec:
      restartPolicy: Never
      serviceAccountName: transfer-service-account,
      containers:
      - name: storage-transfer-pod
        image: gcr.io/private-cloud-staging/storage-transfer:latest
        command:
        - /storage-transfer
        args:
        - --src_path=/src
        - --src_type=local
        - --dst_endpoint=https://your-dst-endpoint.com
        - --dst_credentials=NAMESPACE/CREDENTIAL_SECRET_NAME
        - --dst_path=/FULLY_QUALIFIED_BUCKET_NAME/BUCKET_PATH
        - --dst_type=gcs
        - --bucket_policy_only=true
        - --bandwidth_limit=10M #Optional of the form '10K', '100M', '1G' bytes per second
        volumeMounts:
        - mountPath: /src
          name: data
      volumes:
      - name: data
        persistentVolumeClaim:
          claimName: data-transfer-source

Definir um CronJob integrado

Os usuários gerenciam os próprios recursos definidos do CronJob. Usar um CronJob integrado permite transferências de dados programadas regularmente.

Exemplo de um CronJob que realiza uma transferência de dados automatizada:

apiVersion: batch/v1
kind: CronJob
metadata:
  name: data-transfer-cronjob
  namespace: NAMESPACE
spec:
  schedule: "* * * * *"
  concurrencyPolicy: Forbid
  jobTemplate:
    spec:
      template:
        spec:
          serviceAccountName: transfer-service-account
          containers:
          - name: storage-transfer-pod
            image: gcr.io/private-cloud-staging/storage-transfer:latest
            command:
            - /storage-transfer
            args:
            - --src_path=LOCAL_PATH
            - --src_type=local
            - --dst_endpoint=https://your-dst-endpoint.com
            - --dst_credentials=NAMESPACE/CREDENTIAL_SECRET_NAME
            - --dst_path=/FULLY_QUALIFIED_BUCKET_NAME/BUCKET_PATH
            - --dst_type=gcs
            - --bucket_policy_only=true
            volumeMounts:
            - mountPath: LOCAL_PATH
              name: source
          restartPolicy: Never
          volumes:
          - name: source
            persistentVolumeClaim:
              claimName: data-transfer-source

O Google recomenda definir concurrencyPolicy como Forbid para evitar disputas de dados. O CronJob, o Secret e o PersistentVolumeClaim precisam estar no mesmo namespace.

Priorizar jobs de dados

É possível definir a prioridade dos jobs de dados de várias maneiras que não são mutuamente exclusivas. É possível definir programações de jobs menos frequentes na definição do CronJob.

Os jobs também podem ser ordenados usando InitContainers (https://kubernetes.io/docs/concepts/workloads/pods/init-containers/) que sempre são executados na ordem de definição. No entanto, todos os contêineres precisam ser executados com sucesso. Use InitContainers para dar maior prioridade a um job ou gerenciar a disputa de dados definindo dois ou mais InitContainers com definições de origem e destino espelhadas.

Um exemplo de jobTemplate que realiza a transferência de dados ordenada:

apiVersion: batch/v1
kind: CronJob
metadata:
  name: ordered-data-transfer-cronjob
  namespace: NAMESPACE
spec:
  schedule: "* * * * *"
  concurrencyPolicy: Forbid
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: job-complete
            image: whalesay
            command: ["sh", "-c", "echo Job Completed."]
          initContainers:
          - name: A-to-B
            image: gcr.io/private-cloud-staging/storage-transfer:latest
            command: [/storage-transfer]
            args:
            - --src_type=s3
            - --src_endpoint=ENDPOINT_A
            - --src_path=/example-bucket
            - --src_credentials=NAMESPACE/CREDENTIAL_SECRET_NAME
            - --src_ca_certificate_reference=NAMESPACE/SRC_CERTIFICATE_SECRET_NAME
            - --dst_type=s3
            - --dst_endpoint=ENDPOINT_B
            - --dst_credentials=NAMESPACE/CREDENTIAL_SECRET_NAME
            - --dst_ca_certificate_reference=NAMESPACE/DST_CERTIFICATE_SECRET_NAME
            - --dst_path=/example-bucket
          - name: B-to-A
            image: gcr.io/private-cloud-staging/storage-transfer:latest
            command: [/storage-transfer]
            args:
            - --src_type=s3
            - --src_endpoint=ENDPOINT_B
            - --src_credentials=NAMESPACE/CREDENTIAL_SECRET_NAME
            - --src_ca_certificate_reference=NAMESPACE/SRC_CERTIFICATE_SECRET_NAME
            - --src_path=/example-bucket
            - --dst_type=s3
            - --dst_endpoint=ENDPOINT_A
            - --dst_credentials=NAMESPACE/CREDENTIAL_SECRET_NAME
            - --dst_ca_certificate_reference=NAMESPACE/DST_CERTIFICATE_SECRET_NAME
            - --dst_path=/example-bucket

O contêiner A-to-B é executado antes de B-to-A. Este exemplo realiza uma bisync e uma ordenação de jobs.