객체 스토리지 관리

스토리지 버킷 이름 지정 가이드라인

버킷 이름은 다음 이름 지정 규칙을 준수해야 합니다.

  • 프로젝트 내에서 고유해야 합니다. 프로젝트는 버킷 이름에 고유한 접두사를 추가하여 조직 내에서 충돌이 발생하지 않도록 합니다. 조직 간에 접두사와 버킷 이름이 충돌하는 드문 경우 버킷 생성에 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. 'GPG 경로'에 /usr/bin/gpg를 입력합니다.
  8. HTTPS 프로토콜을 사용하려면 Yes를 입력합니다.
  9. 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 참조를 확인하세요.

스토리지 버킷 나열

특정 객체 스토리지 테넌트에서 액세스할 수 있는 모든 버킷을 나열하려면 다음 단계를 완료하세요.

  1. 다음 명령어를 실행하여 모든 버킷을 나열합니다.

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

스토리지 버킷 삭제

CLI를 사용하여 스토리지 버킷을 삭제할 수 있습니다. 버킷을 삭제하려면 버킷이 비어 있어야 합니다.

  1. 버킷 구성 보기 섹션에서 GET 또는 DESCRIBE 명령어를 사용하여 정규화된 버킷 이름을 가져옵니다.

  2. 버킷이 비어 있지 않으면 버킷을 비웁니다.

    s3cmd rm --recursive -—force s3://FULLY_QUALIFIED_BUCKET_NAME
    
  3. 빈 버킷을 삭제합니다.

    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를 만드는 예시입니다.

  1. 시스템에 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
     ```
    
  2. 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 네임스페이스에 있습니다.

  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. 버킷에 액세스하려면 해당 보안 비밀의 콘텐츠를 가져옵니다.

    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) 주체의 경우 보안 비밀이 버킷과 동일한 네임스페이스에 있습니다. 이름을 찾으려면 다음을 실행합니다.

  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 권한:

    1. 가져오기
    2. 목록
    3. Watch
  • S3 객체 스토리지 권한:

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

project-bucket-object-admin 권한

이 역할은 버킷에 객체, 객체 버전, 태그를 배치하고 삭제할 수 있는 권한을 부여합니다. 또한 project-bucket-object-viewer의 모든 권한도 부여합니다.

project-bucket-object-admin 역할에는 다음과 같은 객체 스토리지 권한이 있습니다.

  • S3 객체 스토리지 권한:

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

project-bucket-admin 권한

이 역할은 프로젝트 네임스페이스에서 Bucket 리소스를 생성, 업데이트 또는 삭제할 권한을 부여합니다. 또한 project-bucket-object-admin의 모든 권한도 부여합니다.

project-bucket-object-admin 역할에는 다음과 같은 권한이 있습니다.

  • 버킷 API 권한:

    1. 만들기
    2. 업데이트
    3. 삭제

WORM 버킷 만들기

WORM 버킷은 다른 항목이 객체를 덮어쓰지 않도록 하고 최소 기간 동안 객체를 보관합니다. 감사 로깅은 WORM 버킷의 사용 사례입니다.

WORM 버킷을 만들려면 다음 단계를 따르세요.

  1. 버킷을 만들 때 보관 기간을 설정합니다. 예를 들어 다음 예시 버킷의 보관 기간은 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 상태가 되면 PVC를 다시 하이드레이션하는 포드 내에서 사용할 준비가 된 것입니다.

  3. Stateful이 결국 PV를 사용하는 경우 렌더링된 StatefulSet PVC와 일치해야 합니다. StatefulSet에서 생성된 포드는 하이드레이션된 볼륨을 사용합니다. 다음 예시는 ss라는 StatefulSet의 볼륨 클레임 템플릿을 보여줍니다.

      volumeClaimTemplates:
      - metadata:
          name: pvc-name
        spec:
          accessModes: [ "ReadWriteOnce" ]
          storageClassName: standard-rwo
          resources:
            requests:
              storage: 1Gi
    
  4. 결과 포드가 사전 할당된 볼륨을 사용하도록 ss-pvc-name-0ss-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 실행이 완료되면 객체 스토리지 버킷의 데이터가 볼륨에 채워집니다. 별도의 포드는 볼륨을 마운트하는 동일한 표준 메커니즘을 사용하여 데이터를 사용할 수 있습니다.