Transfer data dapat terjadi antara:
- Klaim Volume Persisten (PVC) dan penyimpanan objek
- 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
- Penyimpanan objek (disebut sebagai 's3'): Penyimpanan objek yang ada di GDC
- 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.
Untuk mendapatkan Secret kredensial S3, ikuti petunjuk untuk memberikan akses bucket.
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.
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 ---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:
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.
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.
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.
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:
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.Periksa status PVC:
kubectl get pvc restore-pvc -n restore-nsSetelah PVC berada dalam status
Bound, PVC siap digunakan di dalam Pod yang merehidrasinya.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: 1GiPra-alokasikan PVC dengan nama seperti
ss-pvc-name-0danss-pvc-name-1untuk 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.