스토리지 버킷 이름 지정 가이드라인
버킷 이름은 다음 이름 지정 규칙을 준수해야 합니다.
- 프로젝트 내에서 고유해야 합니다. 프로젝트는 버킷 이름에 고유한 접두사를 추가하여 조직 내에서 충돌이 발생하지 않도록 합니다. 조직 간에 접두사와 버킷 이름이 충돌하는 드문 경우 버킷 생성에
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)
를 입력합니다. - 선택사항: 전송 중인 파일을 보호하기 위해 암호화 비밀번호를 입력합니다.
- 'GPG 경로'에
/usr/bin/gpg
를 입력합니다. - HTTPS 프로토콜을 사용하려면
Yes
를 입력합니다. Enter
키를 눌러 프록시 서버 이름 입력을 건너뜁니다.
스토리지 버킷 만들기
시작하기 전에
프로젝트 네임스페이스는 루트 관리자 클러스터의 버킷 리소스를 관리합니다. 버킷을 만들려면 프로젝트가 있어야 합니다. 새 프로젝트를 만들려면 프로젝트 만들기를 참고하세요. 다음 작업을 수행하려면 적절한 버킷 권한이 있어야 합니다. 버킷 액세스 권한 부여를 참고하세요.
버킷 만들기
버킷을 만들려면 프로젝트 네임스페이스에 버킷 사양을 적용하세요.
kubectl apply -f bucket.yaml
다음은 버킷 사양의 예시입니다.
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
자세한 내용은 버킷 API 참조를 확인하세요.
스토리지 버킷 나열
특정 객체 스토리지 테넌트에서 액세스할 수 있는 모든 버킷을 나열하려면 다음 단계를 완료하세요.
다음 명령어를 실행하여 모든 버킷을 나열합니다.
kubectl get buckets --all-namespaces kubectl get buckets --namespace NAMESPACE_NAME
스토리지 버킷 삭제
CLI를 사용하여 스토리지 버킷을 삭제할 수 있습니다. 버킷을 삭제하려면 버킷이 비어 있어야 합니다.
버킷 구성 보기 섹션에서
GET
또는DESCRIBE
명령어를 사용하여 정규화된 버킷 이름을 가져옵니다.버킷이 비어 있지 않으면 버킷을 비웁니다.
s3cmd rm --recursive -—force s3://FULLY_QUALIFIED_BUCKET_NAME
빈 버킷을 삭제합니다.
kubectl delete buckets/BUCKET_NAME --namespace NAMESPACE_NAME
버킷 구성 보기
다음 명령어를 사용하여 버킷의 구성 세부정보를 확인합니다.
kubectl describe buckets/BUCKET_NAME --namespace NAMESPACE_NAME
kubectl get buckets/BUCKET_NAME --namespace NAMESPACE_NAME -o yaml
객체 보관 기간 설정
기본적으로 언제든지 객체를 삭제할 수 있습니다. 보관 기간을 사용하여 객체 잠금을 사용 설정하여 지정된 일수 동안 버킷의 모든 객체가 삭제되지 않도록 합니다. 보관 기간이 지난 후 모든 객체를 삭제해야 버킷을 삭제할 수 있습니다.
버킷을 만들 때 객체 잠금을 사용 설정해야 합니다. 버킷을 만든 후에는 객체 잠금을 사용 설정하거나 사용 중지할 수 없습니다. 하지만 기본 객체 보관 기간은 수정할 수 있습니다.
객체 잠금을 사용 설정하거나 사용 중지한 상태로 버킷을 만들 수 있습니다. 객체 잠금을 사용 설정한 경우 기본 보관 기간을 지정하지 않아도 됩니다.
보관 기간을 수정하려면 버킷 리소스에서 Bucket.spec.bucketPolicy.lockingPolicy.defaultObjectRetentionDays
필드를 업데이트합니다.
다음은 버킷 리소스의 필드를 업데이트하는 예시입니다.
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 버킷 섹션을 참고하세요.
버킷 액세스 권한 부여
사전 정의된 역할로 RoleBindings
를 만들어 적용하면 다른 사용자나 서비스 계정에 버킷 액세스 권한을 제공할 수 있습니다.
사전 정의된 역할
project-bucket-object-viewer: 이 역할을 통해 사용자는 프로젝트의 모든 버킷을 나열하고, 해당 버킷의 객체를 나열하고, 객체 및 객체 메타데이터를 읽을 수 있습니다. 이 역할로는 업로드, 덮어쓰기, 삭제와 같은 객체에 대한 쓰기 작업을 실행할 수 없습니다.
project-bucket-object-admin: 이 역할을 사용하면 사용자가 프로젝트의 모든 버킷을 나열하고 객체에 대한 쓰기 및 읽기 작업을 실행할 수 있습니다(예: 업로드, 덮어쓰기, 삭제).
project-bucket-admin: 이 역할을 통해 사용자는 지정된 네임스페이스의 모든 버킷과 해당 버킷의 모든 객체를 관리할 수 있습니다.
이러한 역할에 부여된 권한의 전체 목록을 보려면 사전 설정된 역할 권한 섹션을 참고하세요.
프로젝트 역할 바인딩을 만드는 데 필요한 권한을 얻으려면 프로젝트 IAM 관리자에게 프로젝트 IAM 관리자(project-iam-admin
) 역할을 부여해 달라고 요청하세요.
다음은 사용자 및 서비스 계정에 대한 액세스 권한을 부여하기 위해 RoleBinding
를 만드는 예시입니다.
시스템에
rolebinding-object-admin-all-buckets.yaml
과 같은 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
버킷 액세스 사용자 인증 정보 가져오기
버킷에 대한 액세스 권한을 부여하면 액세스 사용자 인증 정보가 보안 비밀에 생성됩니다.
보안 비밀 이름의 형식은 object-storage-key-SUBJECT_TYPE-SUBJECT_HASH
입니다.
SUBJECT_TYPE
값은 다음과 같습니다.user
: 사용자입니다.sa
:ServiceAccount
SUBJECT_HASH
은 주제 이름의 base32 인코딩 SHA256 해시입니다.
예를 들어 사용자 bob@foo.com
에는 다음과 같은 보안 비밀이 있습니다.
object-storage-key-user-oy6jdqd6bxfoqcecn2ozv6utepr5bgh355vfku7th5pmejqubdja
사용자 보안 비밀번호에 액세스
사용자 주체의 경우 보안 비밀은 루트 관리자 클러스터의 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]
버킷에 액세스하려면 해당 보안 비밀의 콘텐츠를 가져옵니다.
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) 주체의 경우 보안 비밀이 버킷과 동일한 네임스페이스에 있습니다. 이름을 찾으려면 다음을 실행합니다.
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
포드에서 보안 비밀을 환경 변수 (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
역할에는 다음과 같은 권한이 있습니다.
버킷 API 권한:
- 가져오기
- 목록
- Watch
S3 객체 스토리지 권한:
GetObject
GetObjectAcl
GetObjectVersion
ListBucket
ListBucketVersions
ListBucketMultipartUploads
ListMultipartUploadParts
project-bucket-object-admin 권한
이 역할은 버킷에 객체, 객체 버전, 태그를 배치하고 삭제할 수 있는 권한을 부여합니다. 또한 project-bucket-object-viewer
의 모든 권한도 부여합니다.
project-bucket-object-admin
역할에는 다음과 같은 객체 스토리지 권한이 있습니다.
S3 객체 스토리지 권한:
AbortMultipartUpload
DeleteObject
DeleteObjectVersion
PutObject
RestoreObject
project-bucket-admin 권한
이 역할은 프로젝트 네임스페이스에서 Bucket
리소스를 생성, 업데이트 또는 삭제할 권한을 부여합니다. 또한 project-bucket-object-admin
의 모든 권한도 부여합니다.
project-bucket-object-admin
역할에는 다음과 같은 권한이 있습니다.
버킷 API 권한:
- 만들기
- 업데이트
- 삭제
WORM 버킷 만들기
WORM 버킷은 다른 항목이 객체를 덮어쓰지 않도록 하고 최소 기간 동안 객체를 보관합니다. 감사 로깅은 WORM 버킷의 사용 사례입니다.
WORM 버킷을 만들려면 다음 단계를 따르세요.
버킷을 만들 때 보관 기간을 설정합니다. 예를 들어 다음 예시 버킷의 보관 기간은 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
상태가 되면 PVC를 다시 하이드레이션하는 포드 내에서 사용할 준비가 된 것입니다.Stateful
이 결국 PV를 사용하는 경우 렌더링된 StatefulSet PVC와 일치해야 합니다.StatefulSet
에서 생성된 포드는 하이드레이션된 볼륨을 사용합니다. 다음 예시는ss
라는 StatefulSet의 볼륨 클레임 템플릿을 보여줍니다.volumeClaimTemplates: - metadata: name: pvc-name spec: accessModes: [ "ReadWriteOnce" ] storageClassName: standard-rwo resources: requests: storage: 1Gi
결과 포드가 사전 할당된 볼륨을 사용하도록
ss-pvc-name-0
및ss-pvc-name-1
과 같은 이름으로 PVC를 사전 할당합니다.
영구 볼륨 (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
실행이 완료되면 객체 스토리지 버킷의 데이터가 볼륨에 채워집니다. 별도의 포드는 볼륨을 마운트하는 동일한 표준 메커니즘을 사용하여 데이터를 사용할 수 있습니다.