Transfer data

Transfer data dapat terjadi antara:

  1. Klaim Volume Persisten (PVC) dan penyimpanan objek
  2. Penyimpanan objek dan penyimpanan objek (dalam GDC)

Penyimpanan objek di GDC kompatibel dengan S3 dan disebut sebagai jenis s3 dalam YAML Kubernetes.

Jenis sumber dan tujuan data

  1. Penyimpanan objek (disebut sebagai 's3'): Penyimpanan objek yang ada di GDC
  2. Penyimpanan lokal (disebut sebagai 'lokal'): Penyimpanan di PVC terlampir

Menyalin dari penyimpanan objek ke penyimpanan objek

Pastikan Anda memenuhi prasyarat berikut:

  • Endpoint S3 dengan izin baca untuk sumber, dan endpoint s3 dengan izin tulis untuk tujuan.
  • Jika Anda tidak memiliki izin pembuatan bucket dengan kredensial, transfer akan gagal jika bucket tujuan tidak ada. Pastikan bucket tujuan ada jika demikian.
  • Hak istimewa untuk membuat Tugas dan membuat atau membaca Secret di dalam cluster atau namespace Anda. Lihat contoh berikut untuk izin.

Menyiapkan transfer data

Untuk menyiapkan transfer data, selesaikan langkah-langkah berikut:

Buat namespace transfer

Buat namespace tempat tugas transfer akan berjalan:

apiVersion: v1
kind: Namespace
metadata:
  name: NAMESPACE

Mengonfigurasi kredensial

Siapkan kredensial Anda untuk transfer. Ikuti opsi yang paling sesuai dengan skenario transfer Anda.

Transfer GDC ke GDC

Untuk transfer yang terjadi sepenuhnya dalam semesta GDC yang sama, rahasia sudah ada. Perhatikan bahwa metode ini khusus untuk transfer dalam satu semesta, bukan untuk transfer antar-semesta yang berbeda.

  1. Untuk mendapatkan Secret kredensial S3, ikuti petunjuk untuk memberikan akses bucket.

  2. Buat akun layanan (SA) di namespace tujuan untuk tugas transfer Anda. Kemudian, tambahkan izin untuk mengizinkan akun ini membaca Secret di namespace sumber dan tujuan menggunakan RoleBinding lintas namespace.

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

Transfer GDC ke non-GDC

Untuk transfer yang melibatkan sistem eksternal, Anda harus menentukan kredensial akses secara eksplisit.

  1. Buat kredensial di namespace tujuan:

    ---
    apiVersion: v1
    kind: Secret
    metadata:
      name: src-secret
      namespace: NAMESPACE
    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: NAMESPACE
    data:
      access-key-id: NkFDTUg3WDBCVDlQMVpZMU5MWjU= # base 64 encoded version of key
      access-key: VkRkeWJsbFgzb2FZanMvOVpnSi83SU5YUjk3Y0Q2TUdxZ2d4Q3dpdw== # base 64 encoded version of secret key
    ---
    
  2. Buat akun layanan (SA) yang digunakan oleh transfer Anda, lalu tambahkan izin ke akun untuk membaca dan menulis rahasia menggunakan peran dan binding peran. Anda tidak perlu menambahkan izin jika SA namespace default atau SA kustom Anda sudah memiliki izin ini.

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

Mendapatkan sertifikat CA

Dapatkan sertifikat CA untuk sistem penyimpanan objek Anda. Anda bisa mendapatkan sertifikat yang sama dari AO atau PA dengan mengikuti petunjuk untuk mengambil paket kepercayaan.

---

apiVersion: v1
kind: Secret
metadata:
  name: src-cert
  namespace: NAMESPACE
data:
  ca.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURBekNDQWV1Z0F3SUJBZ0lSQUpHM2psOFZhTU85a1FteGdXUFl3N3d3RFFZSktvWklodmNOQVFFTEJRQXcKR3pFWk1CY0dBMVVFQXhNUVltOXZkSE4wY21Gd0xYZGxZaTFqWVRBZUZ3MHlNekF5TVRVd01USXlNakZhRncweQpNekExTVRZd01USXlNakZhTUJzeEdUQVhCZ05WQkFNVEVHSnZiM1J6ZEhKaGNDMTNaV0l0WTJFd2dnRWlNQTBHCkNTcUdTSWI== # base 64 encoded version of certificate

---

apiVersion: v1
kind: Secret
metadata:
  name: dst-cert
  namespace: NAMESPACE
data:
  ca.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURBekNDQWV1Z0F3SUJBZ0lSQUtoaEJXWWo3VGZlUUZWUWo0U0RpckV3RFFZSktvWklodmNOQVFFTEJRQXcKR3pFWk1CY0dBMVVFQXhNUVltOXZkSE4wY21Gd0xYZGxZaTFqWVRBZUZ3MHlNekF6TURZeU16TTROVEJhRncweQpNekEyTURReU16TTROVEJhTUJzeEdUQVhCZ05WQkFNVEVHSnZiM1J6ZEhKaGNDMTNaV0l0WTJFd2dnRWlNQTBHCkNTcUdTSWIzRFFF== # base 64 encoded version of certificate. Can be same OR different than source certificate.

---

(Opsional) Buat LoggingTarget

Buat LoggingTarget untuk melihat log transfer-service di Loki.

apiVersion: logging.gdc.goog/v1
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:
      - transfer-job # Choose the prefix here that matches your transfer job name
  serviceName: transfer-service

Buat workload transfer

Anda dapat menjalankan transfer sebagai operasi satu kali menggunakan Job, atau menjadwalkannya untuk berjalan berulang kali menggunakan CronJob.

Pilih metode yang paling sesuai dengan kasus penggunaan Anda:

Membuat Tugas Sekali Saja

Gunakan konfigurasi ini untuk transfer data manual tunggal.

---
apiVersion: batch/v1
kind: Job
metadata:
  name: transfer-job
  namespace: NAMESPACE
spec:
  template:
    spec:
      serviceAccountName: transfer-service-account # The service account created in the previous step
      containers:
        - name: storage-transfer-pod
          image: gcr.io/private-cloud-staging/storage-transfer:latest
          imagePullPolicy: Always
          command:
            - /storage-transfer
          args:
            # The S3 endpoints for your source and destination
            - '--src_endpoint=SRC_ENDPOINT'
            - '--dst_endpoint=DST_ENDPOINT'
            # The Fully Qualified Names (FQN) of the buckets
            - '--src_path=SRC_BUCKET_FQN/'
            - '--dst_path=DST_BUCKET_FQN/'
            # Cross-namespace mapping: point directly to the live credentials using NAMESPACE/SECRET_NAME
            - '--src_credentials=NAMESPACE/SRC_SECRET_NAME'
            - '--dst_credentials=NAMESPACE/DST_SECRET_NAME'
            # Point to the CA certificate Secret created in the destination namespace
            - '--src_ca_certificate_reference=NAMESPACE/CA_CERT_SECRET'
            - '--dst_ca_certificate_reference=NAMESPACE/CA_CERT_SECRET'
            - '--src_type=s3'
            - '--dst_type=s3'
            - '--bandwidth_limit=BANDWIDTH_LIMIT' # Optional. Examples: '10K', '100M', '1G'
      restartPolicy: OnFailure
---

Membuat CronJob terjadwal

Gunakan konfigurasi ini untuk terus menyinkronkan bucket tujuan dengan bucket sumber Anda sesuai jadwal tetap.

---
apiVersion: batch/v1
kind: CronJob
metadata:
  name: transfer-cronjob
  namespace: NAMESPACE
spec:
  schedule: "0 * * * *"  # Runs at the top of every hour. Adjust the cron schedule as needed.
  concurrencyPolicy: Forbid
  successfulJobsHistoryLimit: 3
  failedJobsHistoryLimit: 5
  jobTemplate:
    spec:
      template:
        spec:
          serviceAccountName: transfer-service-account # The service account created in the previous step
          containers:
            - name: storage-transfer-pod
              image: gcr.io/private-cloud-staging/storage-transfer:latest
              imagePullPolicy: Always
              command:
                - /storage-transfer
              args:
                # The S3 endpoints for your source and destination
                - '--src_endpoint=SRC_ENDPOINT'
                - '--dst_endpoint=DST_ENDPOINT'
                # The Fully Qualified Names (FQN) of the buckets
                - '--src_path=SRC_BUCKET_FQN/'
                - '--dst_path=DST_BUCKET_FQN/'
                # Cross-namespace mapping: point directly to the live credentials using NAMESPACE/SECRET_NAME
                - '--src_credentials=NAMESPACE/SRC_SECRET_NAME'
                - '--dst_credentials=NAMESPACE/DST_SECRET_NAME'
                # Point to the CA certificate Secret created in the destination namespace
                - '--src_ca_certificate_reference=NAMESPACE/CA_CERT_SECRET'
                - '--dst_ca_certificate_reference=NAMESPACE/CA_CERT_SECRET'
                - '--src_type=s3'
                - '--dst_type=s3'
                - '--bandwidth_limit=BANDWIDTH_LIMIT' # Optional. Examples: '10K', '100M', '1G'
          restartPolicy: OnFailure
---

Memantau transfer data Anda

Setelah membuat instance Job, Anda dapat memantau statusnya menggunakan perintah kubectl, seperti kubectl describe. Untuk memverifikasi transfer, buat daftar objek di dalam bucket tujuan Anda untuk memvalidasi bahwa data Anda telah ditransfer. Alat transfer data tidak bergantung pada lokasi endpoint yang terlibat dalam transfer.

Jalankan perintah berikut untuk memeriksa status beban kerja Anda:

# If you created a one-time Job:
kubectl describe job transfer-job -n NAMESPACE

# If you created a scheduled CronJob:
kubectl describe cronjob transfer-cronjob -n NAMESPACE

Perintah sebelumnya memberi tahu Anda status tugas.

Tugas ini akan meminta pod untuk mentransfer data. Anda bisa mendapatkan nama pod dan melihat log untuk mengetahui apakah ada error selama transfer.

Untuk melihat log pod, jalankan perintah berikut:

# 1. First, find the exact pod name generated by your Job
kubectl get pods -n NAMESPACE | grep transfer

# 2. Then, view the logs for that specific pod
kubectl logs POD_NAME -n NAMESPACE

Log tugas yang berhasil:

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"

Dengan melihat log, Anda dapat melihat kecepatan transfer data, yang tidak sama dengan bandwidth yang digunakan, byte yang dipindahkan, jumlah file yang error, dan file yang dipindahkan.

Menyalin penyimpanan blok ke penyimpanan objek

Pastikan Anda memenuhi prasyarat berikut:

  • Endpoint S3 dengan ID kunci S3 dan kunci akses rahasia dengan izin WRITE minimal ke bucket khusus yang ingin Anda transfer datanya.
  • Cluster yang berfungsi dengan konektivitas ke endpoint S3.
  • Hak istimewa untuk membuat Job dan Secret di dalam cluster Anda.
  • Untuk replikasi block storage, Pod dengan PersistentVolumeClaim (PVC) terlampir yang ingin Anda cadangkan ke penyimpanan objek, dan hak istimewa untuk memeriksa Job dan PVC yang sedang berjalan.
  • Untuk replikasi block storage, rentang waktu saat tidak ada operasi tulis ke PersistentVolume (PV).
  • Untuk pemulihan block storage dari endpoint object storage, hak istimewa untuk mengalokasikan PV dengan kapasitas yang memadai.

Untuk mereplikasi PV ke penyimpanan objek, Anda harus melampirkan volume ke Pod yang ada. Selama jendela transfer, Pod tidak boleh melakukan penulisan apa pun. Untuk menghindari pelepasan PV yang di-mount dari Job, proses transfer data berfungsi dengan menjalankan Job transfer di mesin yang sama dengan Pod, dan menggunakan pemasangan hostPath untuk mengekspos volume di disk. Sebagai persiapan untuk transfer, Anda harus terlebih dahulu menemukan node tempat Pod berjalan, dan metadata tambahan seperti UID Pod dan jenis PVC untuk mereferensikan jalur yang sesuai di Node. Anda harus mengganti metadata ini ke dalam file YAML contoh yang diuraikan di bagian berikut.

Mengumpulkan metadata

Untuk mengumpulkan metadata yang diperlukan untuk membuat Tugas transfer data, ikuti langkah-langkah berikut:

  1. Temukan Node yang memiliki Pod terjadwal:

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

    Catat output perintah ini sebagai NODE_NAME untuk digunakan dalam file YAML Tugas transfer data.

  2. Temukan UID Pod:

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

    Catat output perintah ini sebagai POD_UID untuk digunakan dalam file YAML Tugas transfer data.

  3. Temukan nama PVC:

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

    Catat output perintah ini sebagai PVC_NAME untuk digunakan dalam file YAML Tugas transfer data.

  4. Temukan penyedia penyimpanan PVC:

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

    Catat output perintah ini sebagai PROVISIONER_TYPE untuk digunakan dalam file YAML tugas transfer data.

Membuat secret

Untuk mereplikasi file ke penyimpanan objek di seluruh cluster, Anda harus membuat instance rahasia di dalam cluster Kubernetes terlebih dahulu. Anda harus menggunakan kunci yang cocok untuk Data rahasia agar alat dapat menarik kredensial.

Untuk melakukan transfer di namespace yang ada, lihat contoh berikut tentang membuat Secret di namespace 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

Membuat Tugas

Dengan data yang Anda kumpulkan di bagian sebelumnya, buat Tugas dengan alat transfer data. Tugas transfer data memiliki pemasangan hostPath yang mereferensikan jalur untuk PV yang diinginkan, dan nodeSelector untuk node yang relevan.

Berikut adalah contoh Tugas transfer data:

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

Seperti transfer data S3, Anda harus membuat Secret yang berisi kunci akses untuk endpoint tujuan di cluster Kubernetes, dan Job transfer data harus berjalan dengan akun layanan yang memiliki hak istimewa yang memadai untuk membaca Secret dari server API. Pantau status transfer dengan perintah kubectl standar yang beroperasi pada Tugas.

Pertimbangkan detail berikut saat mentransfer block storage ke object storage:

  • Secara default, link simbolis akan mengikuti dan mereplikasi ke penyimpanan objek, tetapi salinan mendalam, bukan salinan dangkal, akan dilakukan. Setelah pemulihan, perintah ini akan menghapus symlink.
  • Seperti replikasi penyimpanan objek, meng-clone ke subdirektori bucket bersifat merusak. Pastikan bucket tersedia secara eksklusif untuk volume Anda.

Memulihkan dari penyimpanan objek ke block storage

Mengalokasikan PV

Untuk memulihkan block storage dari endpoint penyimpanan objek, ikuti langkah-langkah berikut:

  1. Mengalokasikan volume persisten ke target dalam pemulihan. Gunakan PVC untuk mengalokasikan volume, seperti yang ditunjukkan dalam contoh berikut:

    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. Periksa status PVC:

    kubectl get pvc restore-pvc -n restore-ns
    

    Setelah PVC berada dalam status Bound, PVC siap digunakan di dalam Pod yang merehidrasinya.

  3. Jika StatefulSet akhirnya menggunakan PV, Anda harus mencocokkan PVC StatefulSet yang dirender. Pod yang dihasilkan StatefulSet menggunakan volume yang di-hydrate. Contoh berikut menunjukkan template klaim volume di StatefulSet bernama ss.

      volumeClaimTemplates:
      - metadata:
          name: pvc-name
        spec:
          accessModes: [ "ReadWriteOnce" ]
          storageClassName: "default"
          resources:
            requests:
              storage: 1Gi
    
  4. Pra-alokasikan PVC dengan nama seperti ss-pvc-name-0 dan ss-pvc-name-1 untuk memastikan Pod yang dihasilkan menggunakan volume yang telah dialokasikan sebelumnya.

Lakukan hidrasi PV

Setelah PVC terikat ke PV, mulai Job untuk mengisi 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

Setelah Tugas selesai berjalan, data dari bucket penyimpanan objek akan mengisi volume. Pod terpisah dapat menggunakan data dengan menggunakan mekanisme standar yang sama untuk memasang volume.