Mengelola penyimpanan objek

Panduan penamaan bucket penyimpanan

Nama bucket harus mematuhi konvensi penamaan berikut:

  • Bersifat unik dalam project. Project menambahkan awalan unik ke nama bucket, sehingga tidak ada konflik dalam organisasi. Jika terjadi konflik nama bucket dan awalan di seluruh organisasi, pembuatan bucket akan gagal dengan error bucket name in use.
  • Memiliki minimal satu dan tidak lebih dari 57 karakter.
  • Jangan menyertakan informasi identitas pribadi (PII).
  • Sesuai dengan DNS.
  • Diawali dengan huruf dan hanya berisi huruf, angka, dan tanda hubung.

Instal CLI alat s3cmd

Alat s3cmd adalah alat command line untuk mengelola penyimpanan objek.

  1. Untuk mendownload alat, buka direktori tempat paket GDC diekstrak.
  2. Jalankan perintah berikut untuk mengekstrak image s3cmd, s3cmd.tar.tar.gz, ke direktori sementara yang kosong:

    tmpdir=$(mktemp -d)
    
    gdcloud artifacts extract oci/ $tmpdir \
      --image-name=$(gdcloud artifacts tree oci | grep s3cmd.tar | sed 's/^.* //')
    
  3. scp file tar ke mesin klien tempat Anda menggunakan s3cmd untuk operasi objek; unzip dan instal image.

Pilih salah satu metode penginstalan berikut untuk menginstal alat s3cmd:

Menginstal melalui file tar

  1. Untuk mengekstrak arsip dan menginstal paket s3cmd, jalankan perintah berikut. Anda harus memiliki modul Python distutils untuk menginstal paket. Modul ini sering kali merupakan bagian dari paket Python inti atau Anda dapat menginstalnya menggunakan pengelola paket.

    tar xvf /tmp/gpc-system-tar-files/s3cmd.tar.tar.gz
    cd /tmp/gpc-system-tar-files/s3cmd
    sudo python3 setup.py install
    
  2. Opsional: Hapus file yang didownload:

    rm /tmp/gpc-system-tar-files/s3cmd.tar.tar.gz
    rm -r /tmp/gpc-system-tar-files/s3cmd
    

Menginstal dengan image Docker

  1. Untuk menginstal image s3cmd, jalankan perintah berikut:

    docker load --input s3cmd-docker.tar
    export S3CFG=/EMPTY_FOLDER_PATH/
    alias s3cmd="docker run -it --net=host --mount=type=bind,source=/$S3CFG/,target=/g/
    s3cmd-docker:latest -c /g/s3cfg"
    
  2. Opsional: Hapus file yang didownload:

    rm s3cmd-docker.tar
    
  3. Tambahkan ekspor dan alias ke file .bashrc agar tetap ada setelah klien dimulai ulang.

Mengonfigurasi alat s3cmd

Gunakan alat s3cmd untuk operasi berbasis objek.

Jalankan perintah s3cmd --configure dan tentukan hal berikut:

  1. Kunci Akses: Masukkan kunci akses yang diperoleh dari rahasia di mendapatkan kredensial akses.
  2. Secret Key: Masukkan kunci rahasia yang diperoleh dari secret di mendapatkan kredensial akses.
  3. Wilayah Default: Tekan ENTER.
  4. Endpoint S3: Masukkan endpoint yang disediakan oleh Operator Infrastruktur (IO) Anda.
  5. Untuk penamaan bucket gaya DNS, masukkan s3://%(bucket).
  6. Opsional: Masukkan sandi enkripsi untuk melindungi file dalam pengiriman.
  7. Di Path to GPG, masukkan /usr/bin/gpg.
  8. Masukkan Yesuntuk menggunakan protokol HTTPS.
  9. Tekan Enter untuk melewati memasukkan nama server proxy.

Membuat bucket penyimpanan

Sebelum memulai

Namespace project mengelola resource bucket di cluster admin root. Anda harus memiliki project untuk membuat bucket. Untuk membuat project baru, lihat Membuat project. Anda harus memiliki izin bucket yang sesuai untuk melakukan operasi berikut. Lihat memberikan akses bucket.

Membuat bucket

Untuk membuat bucket, terapkan spesifikasi bucket ke namespace project Anda:

    kubectl apply -f bucket.yaml

Berikut adalah contoh spesifikasi bucket:

    apiVersion: object.gdc.goog/v1alpha1
    kind: Bucket
    metadata:
      name: BUCKET_NAME
      namespace: NAMESPACE_NAME
    spec:
      description: DESCRIPTION
      storageClass: standard-rwo
      bucketPolicy :
        lockingPolicy :
          defaultObjectRetentionDays: RETENTION_DAY_COUNT

Untuk mengetahui detail selengkapnya, lihat referensi Bucket API.

Mencantumkan bucket penyimpanan

Untuk membuat daftar semua bucket yang dapat Anda akses di tenant penyimpanan objek tertentu, selesaikan langkah-langkah berikut:

  1. Jalankan perintah berikut untuk mencantumkan semua bucket:

    kubectl get buckets --all-namespaces
    kubectl get buckets --namespace NAMESPACE_NAME
    

Menghapus bucket penyimpanan

Anda dapat menghapus bucket penyimpanan menggunakan CLI. Bucket harus kosong sebelum Anda dapat menghapusnya.

  1. Gunakan perintah GET atau DESCRIBE di bagian Lihat konfigurasi bucket untuk mendapatkan nama bucket yang sepenuhnya memenuhi syarat.

  2. Jika bucket tidak kosong, kosongkan bucket:

    s3cmd rm --recursive -—force s3://FULLY_QUALIFIED_BUCKET_NAME
    
  3. Hapus bucket kosong:

    kubectl delete buckets/BUCKET_NAME --namespace NAMESPACE_NAME
    

Melihat konfigurasi bucket

Gunakan salah satu perintah untuk melihat detail konfigurasi bucket:

    kubectl describe buckets/BUCKET_NAME --namespace NAMESPACE_NAME
    kubectl get buckets/BUCKET_NAME --namespace NAMESPACE_NAME -o yaml

Menetapkan periode retensi objek

Secara default, Anda dapat menghapus objek kapan saja. Aktifkan penguncian objek dengan periode retensi untuk mencegah penghapusan semua objek dalam bucket selama jumlah hari yang ditentukan. Anda tidak dapat menghapus bucket hingga Anda menghapus semua objek setelah periode retensi data.

Anda harus mengaktifkan penguncian objek saat membuat bucket. Anda tidak dapat mengaktifkan atau menonaktifkan penguncian objek setelah membuat bucket. Namun, Anda dapat mengubah periode retensi objek default.

Anda dapat membuat bucket dengan atau tanpa mengaktifkan penguncian objek. Jika Anda telah mengaktifkan penguncian objek, menentukan periode retensi default bersifat opsional.

Untuk mengubah periode retensi, perbarui kolom Bucket.spec.bucketPolicy.lockingPolicy.defaultObjectRetentionDays di resource Bucket.

Berikut adalah contoh pembaruan kolom di resource Bucket:

apiVersion: object.gdc.goog/v1alpha1
kind: Bucket
metadata:
  name: BUCKET_NAME
  namespace: NAMESPACE_NAME
spec:
  description: "This bucket has a default retention period specified."
  storageClass: standard-rwo
  bucketPolicy :
    lockingPolicy :
      defaultObjectRetentionDays: RETENTION_DAY_COUNT
---
apiVersion: object.gdc.goog/v1alpha1
kind: Bucket
metadata:
  name: BUCKET_NAME
  namespace: NAMESPACE_NAME
spec:
  description: "This would enable object locking but not specify a default retention period."
  storageClass: standard-rwo
  bucketPolicy :
    lockingPolicy :
---
apiVersion: object.gdc.goog/v1alpha1
kind: Bucket
metadata:
  name: BUCKET_NAME
  namespace: NAMESPACE_NAME
spec:
  description: "This bucket does not have locking or retention enabled."
  storageClass: standard-rwo

Setiap perubahan pada periode retensi berlaku untuk objek yang dibuat di bucket setelah perubahan. Untuk objek yang sudah ada, periode retensi tidak berubah.

Jika Anda telah mengaktifkan penguncian objek, jika Anda mencoba menimpa objek, Anda akan menambahkan versi baru objek. Anda dapat mengambil kedua versi objek. Untuk mengetahui detail cara mencantumkan versi objek, lihat ListObjectVersions dari dokumentasi Amazon Web Services: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectVersions.html

Untuk membuat bucket tulis sekali, baca berkali-kali (WORM), lihat bagian Bucket WORM.

Memberikan akses bucket

Anda dapat memberikan akses bucket kepada pengguna atau akun layanan lain dengan membuat dan menerapkan RoleBindings dengan peran bawaan.

Peran yang telah ditetapkan

  • project-bucket-object-viewer: Peran ini memungkinkan pengguna mencantumkan semua bucket dalam project, mencantumkan objek dalam bucket tersebut, serta membaca objek dan metadata objek. Peran ini tidak memungkinkan Anda melakukan operasi tulis pada objek, seperti mengupload, menimpa, atau menghapus

  • project-bucket-object-admin: Peran ini memungkinkan pengguna mencantumkan semua bucket dalam project, serta melakukan operasi tulis dan baca pada objek, seperti mengupload, mengganti, atau menghapus.

  • project-bucket-admin: Peran ini memungkinkan pengguna mengelola semua bucket dalam namespace yang diberikan, serta semua objek dalam bucket tersebut.

Untuk melihat daftar lengkap izin yang diberikan untuk peran ini, lihat bagian izin peran preset.

Untuk mendapatkan izin yang diperlukan untuk membuat binding peran project, minta Admin IAM Project Anda untuk memberi Anda peran Admin IAM Project (project-iam-admin).

Berikut adalah contoh pembuatan RoleBinding untuk memberikan akses kepada pengguna dan akun layanan:

  1. Buat file YAML di sistem Anda, seperti rolebinding-object-admin-all-buckets.yaml.

     apiVersion: rbac.authorization.k8s.io/v1
     kind: RoleBinding
     metadata:
       namespace: NAMESPACE_NAME
       name: readwrite-all-buckets
     roleRef:
       kind: Role
       name: project-bucket-object-admin
       apiGroup: rbac.authorization.k8s.io
     subjects:
     - kind: ServiceAccount
       namespace: NAMESPACE_NAME
       name: SA_NAME
     - kind: User
       namespace: NAMESPACE_NAME
       name: bob@example.com  # Could be bob or bob@example.com based on your organization settings.
       apiGroup: rbac.authorization.k8s.io
     ```
    
  2. Terapkan file YAML:

    kubectl apply \
    -f rolebinding-object-admin-all-buckets.yaml
    

Mendapatkan kredensial akses bucket

Saat Anda memberikan akses ke bucket, kredensial akses dibuat di Secret.

Format nama secret adalah object-storage-key-SUBJECT_TYPE-SUBJECT_HASH.

  • Nilai untuk SUBJECT_TYPE adalah sebagai berikut:
    • user: pengguna.
    • sa: ServiceAccount.
  • SUBJECT_HASH adalah hash SHA256 berenkode base32 dari nama subjek.

Sebagai contoh, pengguna bob@foo.com memiliki secret bernama:

object-storage-key-user-oy6jdqd6bxfoqcecn2ozv6utepr5bgh355vfku7th5pmejqubdja

Mengakses secret pengguna

Untuk subjek pengguna, Secret berada di namespace object-storage-access-keys di cluster admin root.

  1. Temukan nama rahasia:

    kubectl auth can-i --list --namespace object-storage-access-keys | grep object-storage-key-
    

    Anda akan menerima output yang mirip dengan berikut ini:

    secrets        []        [object-storage-key-nl-user-oy6jdqd6bxfoqcecn2ozv6utepr5bgh355vfku7th5pmejqubdja,object-storage-key-std-user-oy6jdqd6bxfoqcecn2ozv6utepr5bgh355vfku7th5pmejqubdja]        [get]
    
  2. Dapatkan konten Secret yang sesuai untuk mengakses bucket:

    kubectl get -o yaml --namespace object-storage-access-keys secret
    object-storage-key-rm-user-oy6jdqd6bxfoqcecn2ozv6utepr5bgh355vfku7th5pmejqubdja
    

    Anda akan menerima output yang mirip dengan berikut ini:

    data:
      access-key-id: MEhYM08wWUMySjcyMkVKTFBKRU8=
      create-time: MjAyMi0wNy0yMiAwMTowODo1OS40MTQyMTE3MDMgKzAwMDAgVVRDIG09KzE5OTAuMzQ3OTE2MTc3
      secret-access-key: Ump0MVRleVN4SmhCSVJhbmlnVDAwbTJZc0IvRlJVendqR0JuYVhiVA==
    
  3. Dekode ID kunci akses dan rahasia:

    echo "MEhYM08wWUMySjcyMkVKTFBKRU8=" | base64 -d \
        && echo \
        && echo "Ump0MVRleVN4SmhCSVJhbmlnVDAwbTJZc0IvRlJVendqR0JuYVhiVA==" | base64 -d
    

    Anda akan menerima output yang mirip dengan berikut ini:

    0HX3O0YC2J722EJLPJEO
    Rjt1TeySxJhBIRanigT00m2YsB/FRUzwjGBnaXbT
    
  4. Ikuti bagian Mengonfigurasi s3cmd dengan informasi yang dihasilkan.

Mengakses rahasia akun layanan

Untuk subjek akun layanan (SA), Secret berada di namespace yang sama dengan bucket. Untuk menemukan nama, jalankan:

  kubectl get --namespace NAMESPACE_NAME secrets -o=jsonpath=
  '{.items[?(@.metadata.annotations.object\.gdc\.goog/subject=="SA_NAME")].metadata.name}'

Anda akan menerima output yang mirip dengan berikut ini:

  object-storage-key-rm-sa-mng3olp3vsynhswzasowzu3jgzct2ert72pjp6wsbzqhdwckwzbq

Anda dapat mereferensikan Secret di pod sebagai variabel lingkungan (https://kubernetes.io/docs/concepts/configuration/secret/#using-secrets-as-environment-variables) atau file (https://kubernetes.io/docs/concepts/configuration/secret/#using-secrets-as-files-from-a-pod).

Izin peran preset

izin project-bucket-object-viewer

Peran ini memberikan izin untuk mendapatkan dan mencantumkan objek serta metadata objek dalam bucket.

Peran project-bucket-object-viewer memiliki izin berikut:

  • Izin Bucket API:

    1. Dapatkan
    2. Daftar
    3. Tonton
  • Izin penyimpanan objek S3:

    1. GetObject
    2. GetObjectAcl
    3. GetObjectVersion
    4. ListBucket
    5. ListBucketVersions
    6. ListBucketMultipartUploads
    7. ListMultipartUploadParts

Izin project-bucket-object-admin

Peran ini memberikan izin untuk menempatkan dan menghapus objek, versi objek, dan tag di bucket. Selain itu, peran ini juga memberikan semua izin di project-bucket-object-viewer.

Peran project-bucket-object-admin memiliki izin penyimpanan objek berikut:

  • Izin penyimpanan Objek S3:

    1. AbortMultipartUpload
    2. DeleteObject
    3. DeleteObjectVersion
    4. PutObject
    5. RestoreObject

izin project-bucket-admin

Peran ini memberikan izin untuk membuat, mengupdate, atau menghapus resource Bucket di namespace project. Selain itu, peran ini juga memberikan semua izin di project-bucket-object-admin.

Peran project-bucket-object-admin memiliki izin berikut:

  • Izin Bucket API:

    1. Buat
    2. Perbarui
    3. Hapus

Membuat Bucket WORM

Bucket WORM memastikan bahwa tidak ada yang menimpa objek dan mempertahankan objek tersebut selama jangka waktu minimum. Logging audit adalah contoh kasus penggunaan untuk bucket WORM.

Lakukan langkah-langkah berikut untuk membuat bucket WORM:

  1. Tetapkan periode retensi saat membuat bucket. Misalnya, bucket contoh berikut memiliki periode retensi 365 hari.

    apiVersion: object.gdc.goog/v1alpha1
    kind: Bucket
    metadata:
      name: foo logging-bucket
      namespace: foo-service
    spec:
      description: "Audit logs for foo"
      storageClass: standard-rwo
      bucketPolicy :
        lockingPolicy :
          defaultObjectRetentionDays: 365
    
  2. Berikan peran project-bucket-object-viewer kepada semua pengguna yang memerlukan akses baca-saja:

    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      namespace: foo-service
      name: object-readonly-access
    roleRef:
      kind: Role
      name: project-bucket-object-viewer
      apiGroup: rbac.authorization.k8s.io
    subjects:
    - kind: ServiceAccount
      namespace: foo-service
      name: foo-log-processor
    - kind: User
      name: bob@example.com
      apiGroup: rbac.authorization.k8s.io
    
  3. Berikan peran project-bucket-object-admin kepada pengguna yang perlu menulis konten ke bucket:

    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      namespace: foo-service
      name: object-write-access
    roleRef:
      kind: Role
      name: project-bucket-object-viewer
      apiGroup: rbac.authorization.k8s.io
    subjects:
    - kind: ServiceAccount
      namespace: foo-service
      name: foo-service-account
    

Memulihkan dari penyimpanan objek ke sistem file di block storage

Mengalokasikan volume persisten

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

  1. Mengalokasikan volume persisten (PV) yang akan ditargetkan dalam pemulihan. Gunakan klaim volume persisten (PVC) untuk mengalokasikan volume, seperti yang ditunjukkan dalam contoh berikut:

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: restore-pvc
      namespace: restore-ns
    spec:
      storageClassName: standard-rwo
      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 set Stateful 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: standard-rwo
          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.

Mengisi Volume Persisten (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: gcr.io/private-cloud-staging/storage-transfer:latest
        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 Job selesai berjalan, data dari bucket penyimpanan objek akan mengisi volume. Pod terpisah dapat menggunakan data dengan menggunakan mekanisme standar yang sama untuk memasang volume.