Trasferimento dei dati

Il dispositivo appliance con air gap di Google Distributed Cloud (GDC) trasferisce dati arbitrari da e verso un ambiente con air gap di Google Distributed Cloud. I trasferimenti possono essere avviati manualmente o impostati per essere eseguiti automaticamente a un intervallo prestabilito.

Esempi di trasferimenti:

  • Scaricare aggiornamenti software o workload dei clienti aggiornati
  • Carica dati dei clienti, metriche dei dispositivi o log di sicurezza, controllo e operazioni dei dispositivi
  • Snapshot dei dati di backup

Lo strumento storage-transfer trasferisce i dati e viene distribuito su un'immagine da utilizzare per l'esecuzione di container sul cluster.

Origini dati

Lo strumento di trasferimento dello spazio di archiviazione offre flessibilità per le condizioni operative dell'appliance GDC air-gapped. Le API compatibili con S3 possono accedere a target di archiviazione interni ed esposti esternamente. Lo strumento supporta anche le origini del file system locale e Cloud Storage.

L'operatore è responsabile del mantenimento del controllo delle chiavi di accesso e di qualsiasi altra credenziale, segreto o dato sensibile richiesto per l'autenticazione per connettere l'appliance GDC air-gapped a reti esterne. L'operatore è anche responsabile della configurazione della rete esterna.

Consulta Creare bucket di archiviazione per creare e accedere allo spazio di archiviazione esterno.

Archiviazione locale

Lo spazio di archiviazione locale è contenuto nell'ambiente container del pod e include il file system temporaneo o i volumi montati. Il service account associato al pod deve avere accesso a tutti i target di montaggio durante il montaggio dei volumi.

Spazio di archiviazione S3

Lo spazio di archiviazione disponibile in rete è accessibile tramite l'API compatibile con S3. Il servizio può essere esterno o esposto solo all'interno della rete del cluster. Devi fornire un URL accessibile e credenziali standardizzate montate utilizzando un secret di Kubernetes.

Si accede ai dati definiti di archiviazione di oggetti e multi-nodo tramite l'API S3. Consulta le sezioni pertinenti per configurare l'archiviazione multimodale e l'archiviazione di oggetti all'interno dell'appliance GDC air-gapped.

Spazio di archiviazione sul cloud

Devi fornire un URL accessibile e credenziali standardizzate montate utilizzando un secret.

Se accedi a un bucket Cloud Storage con controlli dell'accesso uniformi, devi impostare il flag --bucket-policy-only su true.

Credenziali

È necessario un secret Kubernetes per utilizzare il servizio di trasferimento dello spazio di archiviazione per le definizioni di origine o destinazione S3 o GCS. Questi possono essere forniti con un account di servizio remoto o un account utente.

Quando utilizzi i secret in una definizione di Job o CronJob, JobSpec deve essere collegato a un ServiceAccount Kubernetes che abbia accesso ai secret.

Crea un service account utilizzato dal trasferimento, quindi aggiungi le autorizzazioni al service account per leggere e scrivere i secret utilizzando ruoli e associazioni di ruoli. Puoi scegliere di non creare un ServiceAccount se il ServiceAccount dello spazio dei nomi predefinito o il ServiceAccount personalizzato dispone già delle autorizzazioni.

  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

Service account remoti

Per ottenere le credenziali account di servizio Cloud Storage per eseguire un trasferimento, consulta la pagina https://developers.google.com/workspace/guides/create-credentials#create_credentials_for_a_service_account. Queste credenziali devono essere archiviate in un secret nel campo service-account-key.

Ecco un esempio:

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

Account utente

Puoi utilizzare un account utente per l'autenticazione con i bucket compatibili con S3, non con i bucket Cloud Storage. Devi specificare l'argomento --src_type o --dst_type come 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

Sostituisci quanto segue:

  • NAMESPACE: il nome dello spazio dei nomi in cui creerai la definizione del job.
  • SECRET_NAME: il nome del secret che stai creando.
  • ACCESS_KEY_ID: il valore trovato nel campo Chiave di accesso nella console Google Cloud . Quando configuri l'archiviazione di oggetti, questo valore viene chiamato access-key-id.
  • ACCESS_KEY: il valore trovato nel campo Secret nella console Google Cloud . Quando configuri Object Storage, questo è il secret-key o Secret.

Certificati

Fornisci i certificati per la convalida nel job con un secret Kubernetes contenente una chiave di dati 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.

I certificati possono essere forniti facendo riferimento allo strumento utilizzando gli argomenti src_ca_certificate_reference e dst_ca_certificate_reference nel formato NAMESPACE/SECRET_NAME. Ad esempio:

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

Per l'archiviazione S3 nell'appliance, puoi utilizzare direttamente il segreto trust-store-root-ext come certificato CA. Ad esempio:

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

(Facoltativo) Definisci un LoggingTarget per visualizzare i log in Loki

Per impostazione predefinita, i log dei job sono visibili solo nelle risorse Kubernetes e non sono disponibili nello stack di osservabilità e devono essere configurati con un LoggingTarget per essere visibili.

  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

Definisci un job integrato

Gli utenti gestiscono le proprie risorse di lavoro. Per i trasferimenti di dati monouso, definisci un Job. Il job crea un pod per eseguire il container storage-transfer.

Un esempio di 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

Definisci un CronJob integrato

Gli utenti gestiscono le proprie risorse CronJob definite. L'utilizzo di un CronJob integrato consente trasferimenti di dati pianificati regolarmente.

Un esempio di CronJob che esegue un trasferimento dei dati automatizzato:

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

Google consiglia di impostare concurrencyPolicy su Forbid per evitare la contesa dei dati. CronJob, Secret e PersistentVolumeClaim devono trovarsi nello stesso spazio dei nomi.

Dai la priorità ai job di dati

L'impostazione della priorità per i job di dati può essere eseguita in diversi modi non mutualmente esclusivi. Puoi impostare pianificazioni dei job meno frequenti nella definizione di CronJob.

I job possono essere ordinati anche utilizzando InitContainers (https://kubernetes.io/docs/concepts/workloads/pods/init-containers/) che vengono sempre eseguiti nell'ordine di definizione. Tuttavia, tutti i container devono essere eseguiti correttamente. Utilizza InitContainers per dare una priorità più alta a un job o gestire la contesa dei dati definendo due o più InitContainers con definizioni di origine e destinazione speculari.

Un esempio di jobTemplate che esegue il trasferimento dei dati in ordine:

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

Il container A-to-B viene eseguito prima di B-to-A. Questo esempio consente sia la sincronizzazione bidirezionale sia l'ordinamento dei lavori.