轉移資料

Google Distributed Cloud (GDC) 實體隔離設備裝置可將任意資料傳輸至 Google Distributed Cloud 實體隔離環境,或從該環境傳輸資料。你可以手動啟動轉移作業,也可以設定在特定時間間隔自動執行。

轉移範例:

  • 下載軟體更新或更新後的客戶工作負載
  • 上傳顧客數位資料、裝置指標或裝置安全性、稽核和作業記錄
  • 備份資料快照

儲存空間移轉工具會移轉資料,並發布在映像檔中,供叢集上執行的容器使用。

資料來源

儲存空間轉移工具可彈性調整 GDC 氣隙隔離裝置的運作條件。與 S3 相容的 API 可存取外部公開和內部儲存空間目標。這項工具也支援本機檔案系統和 Cloud Storage 來源。

營運商有責任控管存取金鑰,以及將 GDC 無網路連線裝置連線至外部網路時,所需的任何其他憑證、祕密或機密資料。作業人員也負責設定外部網路。

如要建立及存取外部儲存空間,請參閱建立儲存空間值區

本機儲存空間

本機儲存空間位於 Pod 的容器環境中,包括暫時性檔案系統或已掛接的磁碟區。掛接磁碟區時,繫結至 Pod 的 ServiceAccount 必須有權存取所有掛接目標。

S3 儲存空間

您可透過 S3 相容 API 存取網路可用儲存空間。服務可以對外開放,也可以只在叢集網路內公開。您必須提供可存取的網址,以及透過 Kubernetes Secret 掛接的標準化憑證。

透過 S3 API 存取多節點和物件儲存空間定義的資料。如要設定 GDC 氣隙式裝置中的多節點儲存空間物件儲存空間,請參閱相關章節。

雲端儲存空間

您必須提供可存取的網址,以及透過 Secret 掛載的標準化憑證。

如果存取具有統一存取權控管的 Cloud Storage 值區,則必須將 --bucket-policy-only 旗標設為 true

憑證

如要使用儲存空間移轉服務,定義 S3GCS 來源或目的地,必須提供 Kubernetes Secret。這些憑證可透過遠端服務帳戶或使用者帳戶提供。

在 Job 或 CronJob 定義中使用密鑰時,JobSpec 必須附加至可存取密鑰的 Kubernetes ServiceAccount。

建立移轉作業使用的 ServiceAccount,然後使用角色和角色繫結,將讀取及寫入密鑰的權限新增至 ServiceAccount。如果預設命名空間 ServiceAccount 或自訂 ServiceAccount 已具備權限,您可以選擇不建立 ServiceAccount。

  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

遠端服務帳戶

如要取得 Cloud Storage 服務帳戶憑證來進行移轉,請參閱 https://developers.google.com/workspace/guides/create-credentials#create_credentials_for_a_service_account。這些憑證必須儲存在 service-account-key 欄位的密碼中。

範例如下:

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

使用者帳戶

您可以使用使用者帳戶向 S3 相容值區 (而非 Cloud Storage 值區) 進行驗證。您必須將 --src_type--dst_type 引數指定為 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

更改下列內容:

  • NAMESPACE:您要在其中建立 Job 定義的命名空間名稱。
  • SECRET_NAME:您要建立的 Secret 名稱。
  • ACCESS_KEY_ID: Google Cloud 控制台「存取金鑰」欄位中的值。設定 Object Storage 時,這稱為 access-key-id
  • ACCESS_KEY: Google Cloud 控制台「Secret」(密鑰) 欄位中的值。設定 Object Storage 時,這是 secret-key 或 Secret。

憑證

在工作中提供驗證憑證,並使用包含 ca.crt 資料金鑰的 Kubernetes 密鑰。

  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.

您可以透過 NAMESPACE/SECRET_NAME 格式中的 src_ca_certificate_referencedst_ca_certificate_reference 引數,參照工具提供憑證。例如:

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

如果是設備中的 S3 儲存空間,可以直接使用 trust-store-root-ext 密碼做為 CA 憑證。例如:

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

選用:定義 LoggingTarget,在 Loki 中查看記錄

根據預設,只有在 Kubernetes 資源中才能查看 Job 的記錄,且無法在可觀測性堆疊中查看,必須使用 LoggingTarget 進行設定才能查看。

  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

定義內建工作

使用者可管理自己的 Job 資源。如要進行一次性資料轉移,請定義 Job。Job 會建立 Pod,執行 storage-transfer 容器。

工作範例:

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

定義內建 CronJob

使用者可管理自行定義的 CronJob 資源。使用內建的 CronJob 可定期排定資料移轉作業。

以下是可自動轉移資料的 CronJob 範例:

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 建議將 concurrencyPolicy 設為 Forbid,避免資料爭用。 CronJob、Secret 和 PersistentVolumeClaim 必須位於相同命名空間。

決定資料工作的優先順序

設定資料工作優先順序的方法有很多種,而且互不衝突。您可以在 CronJob 定義中設定較不頻繁的工作時間表。

您也可以使用 InitContainers (https://kubernetes.io/docs/concepts/workloads/pods/init-containers/) 排序工作,這些容器一律會依定義順序執行。不過,所有容器都必須順利執行。使用 InitContainers 可優先處理某項工作,或定義兩個以上的 InitContainers,並使用鏡像來源和目的地定義,管理資料爭用情形。

以下是可實現有序資料轉移的 jobTemplate 範例:

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

容器 A-to-B 會在 B-to-A 之前執行。這個範例同時達成雙向同步和工作排序。