Storage 值區命名規範
值區名稱必須遵循下列命名慣例:
- 在專案中不得重複。專案會在 bucket 名稱中附加不重複的前置字元,確保機構內不會發生衝突。萬一不同機構的字首和 bucket 名稱發生衝突,bucket 建立作業就會失敗,並顯示
bucket name in use
錯誤。 - 至少要有 1 個字元,且不得超過 57 個字元。
- 請勿加入任何個人識別資訊 (PII)。
- 符合 DNS 規定。
- 開頭須為英文字母,且只能由英文字母、數字和連字號組成。
安裝 s3cmd 工具 CLI
s3cmd
工具是管理物件儲存空間的指令列工具。
- 如要下載這項工具,請前往解壓縮 GDC 套件的目錄。
執行下列指令,將 s3cmd 映像檔
s3cmd.tar.tar.gz
擷取至空白的暫時目錄:tmpdir=$(mktemp -d) gdcloud artifacts extract oci/ $tmpdir \ --image-name=$(gdcloud artifacts tree oci | grep s3cmd.tar | sed 's/^.* //')
scp
tar 檔案至用戶端電腦,您可以在該電腦使用s3cmd
執行物件作業;解壓縮並安裝映像檔。
選擇下列其中一種安裝方法,安裝 s3cmd
工具:
透過 tar 檔案安裝
如要解壓縮封存檔並安裝
s3cmd
套件,請執行下列指令。您必須擁有 Pythondistutils
模組,才能安裝套件。這個模組通常是 Python 核心套件的一部分,您也可以使用套件管理工具安裝。tar xvf /tmp/gpc-system-tar-files/s3cmd.tar.tar.gz cd /tmp/gpc-system-tar-files/s3cmd sudo python3 setup.py install
選用:清除下載的檔案:
rm /tmp/gpc-system-tar-files/s3cmd.tar.tar.gz rm -r /tmp/gpc-system-tar-files/s3cmd
使用 Docker 映像檔安裝
如要安裝
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"
選用:清除下載的檔案:
rm s3cmd-docker.tar
將匯出內容和別名新增至
.bashrc
檔案,以便在重新啟動用戶端後保留。
設定 s3cmd 工具
使用 s3cmd 工具執行物件相關作業。
執行 s3cmd --configure
指令,並指定下列項目:
- 存取金鑰:輸入您在取得存取憑證時,從密鑰取得的存取金鑰。
- 密鑰:輸入從取得存取憑證的密鑰。
- 預設區域:按
ENTER
。 - S3 端點:輸入基礎架構營運商 (IO) 提供的端點。
- 如要使用 DNS 樣式的儲存空間命名方式,請輸入
s3://%(bucket)
。 - 選用:輸入加密密碼,保護傳輸中的檔案。
- 在「Path to GPG」(GPG 路徑) 中,輸入
/usr/bin/gpg
。 - 輸入
Yes
即可使用 HTTPS 通訊協定。 - 按下
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,請完成下列步驟:
執行下列指令,列出所有 bucket:
kubectl get buckets --all-namespaces kubectl get buckets --namespace NAMESPACE_NAME
刪除 Storage bucket
您可以使用 CLI 刪除儲存空間值區。值區必須是空的,您才能予以刪除。
如果儲存空間不是空的,請清空儲存空間:
s3cmd rm --recursive -—force s3://FULLY_QUALIFIED_BUCKET_NAME
刪除空白值區:
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
,授予使用者和服務帳戶存取權:
在系統上建立 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 ```
套用 YAML 檔案:
kubectl apply \ -f rolebinding-object-admin-all-buckets.yaml
取得 bucket 存取憑證
授予值區存取權時,系統會在 Secret 中建立存取憑證。
密鑰名稱的格式為 object-storage-key-SUBJECT_TYPE-SUBJECT_HASH
。
SUBJECT_TYPE
的值如下:user
:使用者。sa
:ServiceAccount
。
SUBJECT_HASH
是主體名稱的 base32 編碼 SHA256 雜湊。
舉例來說,使用者 bob@foo.com
擁有下列密鑰:
object-storage-key-user-oy6jdqd6bxfoqcecn2ozv6utepr5bgh355vfku7th5pmejqubdja
存取使用者密鑰
如果是使用者主體,Secret 會位於根管理員叢集的命名空間中。object-storage-access-keys
找出密鑰名稱:
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]
取得對應 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==
解碼存取金鑰 ID 和密鑰:
echo "MEhYM08wWUMySjcyMkVKTFBKRU8=" | base64 -d \ && echo \ && echo "Ump0MVRleVN4SmhCSVJhbmlnVDAwbTJZc0IvRlJVendqR0JuYVhiVA==" | base64 -d
您會收到類似以下的輸出內容:
0HX3O0YC2J722EJLPJEO Rjt1TeySxJhBIRanigT00m2YsB/FRUzwjGBnaXbT
請按照「設定 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 權限:
- 取得
- 清單
- 觀看
S3 物件儲存空間權限:
GetObject
GetObjectAcl
GetObjectVersion
ListBucket
ListBucketVersions
ListBucketMultipartUploads
ListMultipartUploadParts
project-bucket-object-admin 權限
這個角色可授予在 bucket 中放置及刪除物件、物件版本和標記的權限。此外,這個角色也會授予 project-bucket-object-viewer
中的所有權限。
project-bucket-object-admin
角色具備下列物件儲存空間權限:
S3 物件儲存空間權限:
AbortMultipartUpload
DeleteObject
DeleteObjectVersion
PutObject
RestoreObject
專案值區管理員權限
這個角色可授予在專案命名空間中建立、更新或刪除 Bucket
資源的權限。此外,這個角色也會授予project-bucket-object-admin
中的所有權限。
project-bucket-object-admin
角色具備下列權限:
Bucket API 權限:
- 建立
- 更新
- 刪除
建立 WORM Bucket
WORM 值區可確保物件不會遭到覆寫,並保留至少一段時間。稽核記錄是 WORM 儲存空間的用途範例。
如要建立 WORM 值區,請按照下列步驟操作:
建立值區時,請設定保留期限。舉例來說,下列範例 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
將「
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
將
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
從物件儲存空間還原至區塊儲存空間的檔案系統
配置永久磁碟區
如要從物件儲存端點還原檔案,請按照下列步驟操作:
在還原作業中,將永久磁碟區 (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.
檢查 PVC 的狀態:
kubectl get pvc restore-pvc -n restore-ns
PVC 處於
Bound
狀態後,即可在重新補水的 Pod 中使用。如果
Stateful
集最終會耗用 PV,您必須比對已算繪的 StatefulSet PVC。StatefulSet
產生的 Pod 會使用已補水的磁碟區。以下範例顯示名為ss
的 StatefulSet 中的磁碟區聲明範本。volumeClaimTemplates: - metadata: name: pvc-name spec: accessModes: [ "ReadWriteOnce" ] storageClassName: standard-rwo resources: requests: storage: 1Gi
預先配置 PVC,並命名為
ss-pvc-name-0
和ss-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 可以使用相同的標準機制掛接磁碟區,進而取用資料。