轉移資料

資料可在下列項目之間轉移:

  1. 永久磁碟區要求 (PVC) 和物件儲存空間
  2. 物件儲存空間和物件儲存空間 (在 GDC 中)

GDC 的物件儲存空間與 S3 相容,在 Kubernetes YAML 中稱為 s3 型別。

資料來源/目的地類型

  1. 物件儲存空間 (稱為「s3」):GDC 上的物件儲存空間
  2. 本機儲存空間 (稱為「本機」):附加 PVC 上的儲存空間

從物件儲存空間複製到物件儲存空間

請確認您已完成下列事前準備事項:

  • 具備來源讀取權限的 S3 端點,以及具備目的地寫入權限的 S3 端點。
  • 如果憑證沒有值區建立權限,且目的地值區不存在,移轉作業就會失敗。如果發生這種情況,請確認目的地 bucket 是否存在。
  • 在叢集或命名空間內建立 Job,以及建立或讀取 Secret 的權限。如需權限範例,請參閱下文。

建立工作

如要建立工作,請完成下列步驟:

  1. 建立命名空間:

    apiVersion: v1
    kind: Namespace
    metadata:
      name: transfer-ns
    
  2. 建立憑證:

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

    這些憑證與您在物件儲存空間部分取得的憑證相同。

  3. 建立供移轉作業使用的服務帳戶 (SA),然後使用角色和角色繫結,為該帳戶新增讀取和寫入密鑰的權限。如果預設命名空間 SA 或自訂 SA 已具備這些權限,則不需要新增權限。

    ---
    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. 取得物件儲存系統的 CA 憑證。您可以向 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. 選用:建立 LoggingTarget,在 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. 建立工作:

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

監控資料轉移作業

例項化 Job 後,您可以使用 kubectl 指令 (例如 kubectl describe) 監控其狀態。如要驗證轉移作業,請列出目的地值區內的物件,確認資料已轉移。資料移轉工具不會管移轉作業涉及的端點位置。

執行以下指令:

kubectl describe transfer-job -n transfer-ns

上述指令會顯示工作狀態。

這項工作會提示 Pod 轉移資料。你可以取得 Pod 的名稱,並查看記錄檔,確認轉移期間是否發生任何錯誤。

如要查看 Pod 記錄,請執行下列指令:

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

成功的工作記錄:

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"

查看記錄可瞭解資料移轉速度 (與使用的頻寬、移轉的位元組、發生錯誤的檔案數和移轉的檔案數不同)。

將區塊儲存空間複製到物件儲存空間

請確認你符合下列先決條件:

  • S3 端點,以及具有至少「寫入」權限的 S3 金鑰 ID 和私密存取金鑰,可存取要移轉資料的專屬值區。
  • 可連線至 S3 端點的正常運作叢集。
  • 在叢集內建立 Job 和 Secret 的權限。
  • 如要複製區塊儲存空間,您需要一個附加 PersistentVolumeClaim (PVC) 的 Pod,並將該 Pod 備份至物件儲存空間,以及檢查執行中工作和 PVC 的權限。
  • 如要複製區塊儲存空間,請在一段時間內不要寫入 PersistentVolume (PV)。
  • 如要從物件儲存空間端點還原區塊儲存空間,請具備足夠容量的 PV 分配權限。

如要將 PV 複製到物件儲存空間,必須將磁碟區附加至現有 Pod。在轉移期間,Pod 不得執行任何寫入作業。為避免從工作卸載已掛接的 PV,資料移轉程序會在與 Pod 相同的機器上執行移轉工作,並使用 hostPath 掛接在磁碟上公開磁碟區,為準備轉移作業,您必須先找出 Pod 執行的節點,以及 Pod UID 和 PVC 類型等其他中繼資料,以便參照節點上的適當路徑。您必須將這項中繼資料代入下一節所述的 YAML 範例檔案。

收集中繼資料

如要收集建立資料轉移工作所需的中繼資料,請完成下列步驟:

  1. 找出排定 Pod 的節點:

    kubectl get pod POD_NAME -o jsonpath='{.spec.nodeName}'
    

    請記錄這項指令的輸出內容,做為資料移轉作業 YAML 檔案中使用的 NODE_NAME

  2. 找出 Pod UID:

    kubectl get pod POD_NAME -o 'jsonpath={.metadata.uid}'
    

    請記錄這項指令的輸出內容,做為資料移轉作業 YAML 檔案中使用的 POD_UID

  3. 找出 PVC 名稱:

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

    請記錄這項指令的輸出內容,做為資料移轉作業 YAML 檔案中使用的 PVC_NAME

  4. 找出 PVC 儲存空間佈建器:

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

    記錄這項指令的輸出內容,做為資料移轉工作 YAML 檔案中使用的 PROVISIONER_TYPE

建立密鑰

如要跨叢集將檔案複製到物件儲存空間,您必須先在 Kubernetes 叢集中例項化密碼。您必須使用相符的金鑰,工具才能提取密鑰資料的憑證。

如要在現有命名空間中執行轉移作業,請參閱下列範例,瞭解如何在 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

建立 Job

使用您在上一個章節中收集的資料,透過資料移轉工具建立工作。資料轉移作業具有 hostPath 掛接,可參照感興趣的 PV 路徑,以及相關節點的 nodeSelector

以下是資料移轉工作的範例:

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

S3 資料移轉相同,您必須在 Kubernetes 叢集中建立包含目的地端點存取金鑰的 Secret,且資料移轉作業必須透過服務帳戶執行,該帳戶需具備足夠的權限,才能從 API 伺服器讀取 Secret。使用對 Job 執行的標準 kubectl 指令,監控移轉狀態。

將區塊儲存空間移轉至物件儲存空間時,請注意下列詳細資料:

  • 根據預設,符號連結會追蹤並複製到物件儲存空間,但會執行深層而非淺層複製。還原時,系統會毀損符號連結。
  • 與物件儲存空間複製作業一樣,複製到值區的子目錄會造成破壞性影響。確認 bucket 僅供磁碟區使用。

從物件儲存空間還原至區塊儲存空間

分配 PV

如要從物件儲存端點還原區塊儲存空間,請按照下列步驟操作:

  1. 在還原作業中,將永久磁碟區分配給目標。使用 PVC 配置磁碟區,如下列範例所示:

    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. 檢查 PVC 的狀態:

    kubectl get pvc restore-pvc -n restore-ns
    

    PVC 處於 Bound 狀態後,即可在重新補水的 Pod 中使用。

  3. 如果 StatefulSet 最終會耗用 PV,您必須比對已算繪的 StatefulSet PVC。StatefulSet 產生的 Pod 會耗用已補水的磁碟區。以下範例顯示名為 ss 的 StatefulSet 中的磁碟區聲明範本。

      volumeClaimTemplates:
      - metadata:
          name: pvc-name
        spec:
          accessModes: [ "ReadWriteOnce" ]
          storageClassName: "default"
          resources:
            requests:
              storage: 1Gi
    
  4. 預先配置 PVC,並命名為 ss-pvc-name-0ss-pvc-name-1,確保產生的 Pod 會使用預先配置的磁碟區。

讓 PV 保持最新狀態

PVC 繫結至 PV 後,請啟動 Job 來填入 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

工作執行完畢後,物件儲存空間 bucket 中的資料就會填入磁碟區。另一個 Pod 可以使用相同的標準機制掛接磁碟區,進而取用資料。