Mentransfer 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 di YAML Kubernetes.

Jenis sumber/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 memiliki 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.

Buat tugas

Untuk membuat tugas, ikuti langkah-langkah berikut:

  1. Buat namespace

    apiVersion: v1
    kind: Namespace
    metadata:
      name: transfer-ns
    
  2. Buat kredensial:

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

    Kredensial ini sama dengan yang Anda peroleh di bagian penyimpanan objek.

  3. 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: 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. Dapatkan sertifikat CA untuk sistem penyimpanan objek Anda. Anda bisa mendapatkan sertifikat yang sama dari AO/PA Anda.

    ---
    
    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. Opsional: Buat LoggingTarget untuk melihat log transfer-service di 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. Buat tugas:

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

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:

kubectl describe transfer-job -n transfer-ns

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:

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

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 penyimpanan blok, 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 penyimpanan blok, 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 periode 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 menghancurkan 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 penyimpanan blok 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-hydrasi. 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 Tugas 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.