管理物件儲存空間

Storage 值區命名規範

值區名稱必須遵循下列命名慣例:

  • 在專案中不得重複。專案會在 bucket 名稱中附加不重複的前置字元,確保機構內不會發生衝突。萬一不同機構的字首和 bucket 名稱發生衝突,bucket 建立作業就會失敗,並顯示 bucket name in use 錯誤。
  • 至少要有 1 個字元,且不得超過 57 個字元。
  • 請勿加入任何個人識別資訊 (PII)。
  • 符合 DNS 規定。
  • 開頭須為英文字母,且只能由英文字母、數字和連字號組成。

安裝 s3cmd 工具 CLI

s3cmd 工具是管理物件儲存空間的指令列工具。

  1. 如要下載這項工具,請前往解壓縮 GDC 套件的目錄。
  2. 執行下列指令,將 s3cmd 映像檔 s3cmd.tar.tar.gz 擷取至空白的暫時目錄:

    tmpdir=$(mktemp -d)
    
    gdcloud artifacts extract oci/ $tmpdir \
      --image-name=$(gdcloud artifacts tree oci | grep s3cmd.tar | sed 's/^.* //')
    
  3. scp tar 檔案至用戶端電腦,您可以在該電腦使用 s3cmd 執行物件作業;解壓縮並安裝映像檔。

選擇下列其中一種安裝方法,安裝 s3cmd 工具:

透過 tar 檔案安裝

  1. 如要解壓縮封存檔並安裝 s3cmd 套件,請執行下列指令。您必須擁有 Python distutils 模組,才能安裝套件。這個模組通常是 Python 核心套件的一部分,您也可以使用套件管理工具安裝。

    tar xvf /tmp/gpc-system-tar-files/s3cmd.tar.tar.gz
    cd /tmp/gpc-system-tar-files/s3cmd
    sudo python3 setup.py install
    
  2. 選用:清除下載的檔案:

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

使用 Docker 映像檔安裝

  1. 如要安裝 s3cmd 映像檔,請執行下列指令:

    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. 選用:清除下載的檔案:

    rm s3cmd-docker.tar
    
  3. 將匯出內容和別名新增至 .bashrc 檔案,以便在重新啟動用戶端後保留。

設定 s3cmd 工具

使用 s3cmd 工具執行物件相關作業。

執行 s3cmd --configure 指令,並指定下列項目:

  1. 存取金鑰:輸入您在取得存取憑證時,從密鑰取得的存取金鑰。
  2. 密鑰:輸入從取得存取憑證的密鑰。
  3. 預設區域:按 ENTER
  4. S3 端點:輸入基礎架構營運商 (IO) 提供的端點。
  5. 如要使用 DNS 樣式的儲存空間命名方式,請輸入 s3://%(bucket)
  6. 選用:輸入加密密碼,保護傳輸中的檔案。
  7. 在「Path to GPG」(GPG 路徑) 中,輸入 /usr/bin/gpg
  8. 輸入 Yes 即可使用 HTTPS 通訊協定。
  9. 按下 Enter 即可略過輸入 Proxy 伺服器名稱。

建立儲存空間值區

事前準備

專案命名空間會管理根管理員叢集中的 bucket 資源。您必須擁有專案才能建立值區。如要建立新專案,請參閱「建立專案」。您必須具備適當的 bucket 權限,才能執行下列作業。請參閱「授予值區存取權」。

建立值區

如要建立 bucket,請將 bucket 規格套用至專案命名空間:

    kubectl apply -f bucket.yaml

以下是 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

詳情請參閱 Bucket API 參考資料

列出儲存空間值區

如要列出特定物件儲存空間租戶中您有權存取的所有 bucket,請完成下列步驟:

  1. 執行下列指令,列出所有 bucket:

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

刪除 Storage bucket

您可以使用 CLI 刪除儲存空間值區。值區必須是空的,您才能予以刪除。

  1. 在「查看值區設定」部分使用 GETDESCRIBE 指令,取得完整值區名稱。

  2. 如果儲存空間不是空的,請清空儲存空間:

    s3cmd rm --recursive -—force s3://FULLY_QUALIFIED_BUCKET_NAME
    
  3. 刪除空白值區:

    kubectl delete buckets/BUCKET_NAME --namespace NAMESPACE_NAME
    

查看 bucket 設定

使用任一指令查看值區的設定詳細資料:

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

設定物件保留期限

根據預設,您隨時可以刪除物件。啟用物件鎖定功能並設定保留期限,即可防止值區中的所有物件在指定天數內遭到刪除。您必須先刪除保留期限過後的物件,才能刪除 bucket。

建立值區時,必須啟用物件鎖定功能。建立 bucket 後,您就無法啟用或停用物件鎖定功能。不過,您可以修改預設物件保留期限。

您可以建立值區,並視需要啟用物件鎖定功能。如果已啟用物件鎖定功能,則可選擇是否指定預設保留期限。

如要修改保留期限,請更新Bucket 資源中的 Bucket.spec.bucketPolicy.lockingPolicy.defaultObjectRetentionDays 欄位。

以下範例說明如何更新 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

保留期限更新後,系統會將新期限套用至值區中建立的物件。現有物件的保留期限不會變更。

啟用物件鎖定功能後,如果您嘗試覆寫物件,系統會新增該物件的版本。您可以擷取這兩個物件版本。如要瞭解如何列出物件版本,請參閱 Amazon Web Services 說明文件:ListObjectVersions https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectVersions.html

如要建立只能寫入一次、可讀取多次 (WORM) 的值區,請參閱「WORM 值區」一節。

授予 bucket 存取權

您可以建立並套用RoleBindings預先定義的角色,將 bucket 存取權授予其他使用者或服務帳戶。

預先定義的角色

  • project-bucket-object-viewer:這個角色可讓使用者列出專案中的所有值區、列出這些值區中的物件,以及讀取物件和物件中繼資料。這個角色無法對物件執行寫入作業,例如上傳、覆寫或刪除

  • project-bucket-object-admin:這個角色可讓使用者列出專案中的所有值區,並對物件執行寫入和讀取作業,例如上傳、覆寫或刪除。

  • project-bucket-admin:這個角色可讓使用者管理指定命名空間中的所有值區,以及這些值區中的所有物件。

如要查看這些角色獲授權限的完整清單,請參閱「預設角色權限」一節。

如要取得建立專案角色繫結所需的權限,請要求專案 IAM 管理員授予您專案 IAM 管理員 (project-iam-admin) 角色。

以下範例會建立 RoleBinding,授予使用者和服務帳戶存取權:

  1. 在系統上建立 YAML 檔案,例如 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. 套用 YAML 檔案:

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

取得 bucket 存取憑證

授予值區存取權時,系統會在 Secret 中建立存取憑證。

密鑰名稱的格式為 object-storage-key-SUBJECT_TYPE-SUBJECT_HASH

  • SUBJECT_TYPE 的值如下:
    • user:使用者。
    • saServiceAccount
  • SUBJECT_HASH 是主體名稱的 base32 編碼 SHA256 雜湊。

舉例來說,使用者 bob@foo.com 擁有下列密鑰:

object-storage-key-user-oy6jdqd6bxfoqcecn2ozv6utepr5bgh355vfku7th5pmejqubdja

存取使用者密鑰

如果是使用者主體,Secret 會位於根管理員叢集的命名空間中。object-storage-access-keys

  1. 找出密鑰名稱:

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

    您會收到類似以下的輸出內容:

    secrets        []        [object-storage-key-nl-user-oy6jdqd6bxfoqcecn2ozv6utepr5bgh355vfku7th5pmejqubdja,object-storage-key-std-user-oy6jdqd6bxfoqcecn2ozv6utepr5bgh355vfku7th5pmejqubdja]        [get]
    
  2. 取得對應 Secret 的內容,以存取值區:

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

    您會收到類似以下的輸出內容:

    data:
      access-key-id: MEhYM08wWUMySjcyMkVKTFBKRU8=
      create-time: MjAyMi0wNy0yMiAwMTowODo1OS40MTQyMTE3MDMgKzAwMDAgVVRDIG09KzE5OTAuMzQ3OTE2MTc3
      secret-access-key: Ump0MVRleVN4SmhCSVJhbmlnVDAwbTJZc0IvRlJVendqR0JuYVhiVA==
    
  3. 解碼存取金鑰 ID 和密鑰:

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

    您會收到類似以下的輸出內容:

    0HX3O0YC2J722EJLPJEO
    Rjt1TeySxJhBIRanigT00m2YsB/FRUzwjGBnaXbT
    
  4. 請按照「設定 s3cmd」一節的說明,使用產生的資訊進行設定。

存取服務帳戶密鑰

如果是服務帳戶 (SA) 主體,Secret 會與 bucket 位於相同命名空間。如要找出名稱,請執行下列指令:

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

您會收到類似以下的輸出內容:

  object-storage-key-rm-sa-mng3olp3vsynhswzasowzu3jgzct2ert72pjp6wsbzqhdwckwzbq

您可以在 Pod 中將 Secret 參照為環境變數 (https://kubernetes.io/docs/concepts/configuration/secret/#using-secrets-as-environment-variables) 或檔案 (https://kubernetes.io/docs/concepts/configuration/secret/#using-secrets-as-files-from-a-pod)。

預設角色權限

project-bucket-object-viewer 權限

這個角色可授予權限,以取得及列出值區中的物件和物件中繼資料。

project-bucket-object-viewer 角色具備下列權限:

  • Bucket API 權限

    1. 取得
    2. 清單
    3. 觀看
  • S3 物件儲存空間權限

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

project-bucket-object-admin 權限

這個角色可授予在 bucket 中放置及刪除物件、物件版本和標記的權限。此外,這個角色也會授予 project-bucket-object-viewer 中的所有權限。

project-bucket-object-admin 角色具備下列物件儲存空間權限:

  • S3 物件儲存空間權限

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

專案值區管理員權限

這個角色可授予在專案命名空間中建立、更新或刪除 Bucket 資源的權限。此外,這個角色也會授予project-bucket-object-admin中的所有權限。

project-bucket-object-admin 角色具備下列權限:

  • Bucket API 權限

    1. 建立
    2. 更新
    3. 刪除

建立 WORM Bucket

WORM 值區可確保物件不會遭到覆寫,並保留至少一段時間。稽核記錄是 WORM 儲存空間的用途範例。

如要建立 WORM 值區,請按照下列步驟操作:

  1. 建立值區時,請設定保留期限。舉例來說,下列範例 bucket 的保留期限為 365 天。

    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. 將「project-bucket-object-viewer」角色授予所有需要唯讀存取權的使用者:

    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. project-bucket-object-admin 角色授予需要將內容寫入值區的使用者:

    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
    

從物件儲存空間還原至區塊儲存空間的檔案系統

配置永久磁碟區

如要從物件儲存端點還原檔案,請按照下列步驟操作:

  1. 在還原作業中,將永久磁碟區 (PV) 分配給目標。使用持續性磁碟區聲明 (PVC) 分配磁碟區,如下列範例所示:

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

    kubectl get pvc restore-pvc -n restore-ns
    

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

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

      volumeClaimTemplates:
      - metadata:
          name: pvc-name
        spec:
          accessModes: [ "ReadWriteOnce" ]
          storageClassName: standard-rwo
          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: 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

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