Faça a gestão do armazenamento de objetos

Diretrizes de nomenclatura de contentores de armazenamento

Os nomes dos contentores têm de cumprir as seguintes convenções de nomenclatura:

  • Ser exclusivo no projeto. Um projeto anexa um prefixo exclusivo ao nome do contentor, o que garante que não existem conflitos na organização. No caso improvável de um conflito entre um prefixo e um nome de contentor em várias organizações, a criação do contentor falha com um erro bucket name in use.
  • Ter, pelo menos, 1 e, no máximo, 57 carateres.
  • Abstenha-se de incluir informações de identificação pessoal (IIP).
  • Ser compatível com DNS.
  • Começar por uma letra e conter apenas letras, números e hífenes.

Instale a CLI da ferramenta s3cmd

A ferramenta s3cmd é uma ferramenta de linha de comandos para gerir o armazenamento de objetos.

  1. Para transferir a ferramenta, navegue para o diretório a partir do qual o pacote GDC foi extraído.
  2. Execute os seguintes comandos para extrair a imagem s3cmd, s3cmd.tar.tar.gz, para um diretório temporário vazio:

    tmpdir=$(mktemp -d)
    
    gdcloud artifacts extract oci/ $tmpdir \
      --image-name=$(gdcloud artifacts tree oci | grep s3cmd.tar | sed 's/^.* //')
    
  3. scp o ficheiro TAR para um computador cliente onde usa s3cmd para operações de objetos; descomprima e instale a imagem.

Escolha um dos seguintes métodos de instalação para instalar a ferramenta s3cmd:

Instale através do ficheiro TAR

  1. Para descompactar o arquivo e instalar o pacote s3cmd, execute os seguintes comandos. Tem de ter o módulo Python distutils para instalar o pacote. O módulo faz frequentemente parte do pacote Python principal ou pode instalá-lo através do seu gestor de pacotes.

    tar xvf /tmp/gpc-system-tar-files/s3cmd.tar.tar.gz
    cd /tmp/gpc-system-tar-files/s3cmd
    sudo python3 setup.py install
    
  2. Opcional: limpe os ficheiros transferidos:

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

Instale com a imagem do Docker

  1. Para instalar a imagem s3cmd, execute os seguintes comandos:

    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. Opcional: limpe os ficheiros transferidos:

    rm s3cmd-docker.tar
    
  3. Adicione a exportação e o alias ao ficheiro .bashrc para persistir após reiniciar o cliente.

Configure a ferramenta s3cmd

Use a ferramenta s3cmd para operações baseadas em objetos.

Execute o comando s3cmd --configure e especifique o seguinte:

  1. Chave de acesso: introduza a chave de acesso obtida a partir do segredo em obter credenciais de acesso.
  2. Chave secreta: introduza a chave secreta obtida a partir do segredo em obter credenciais de acesso.
  3. Região predefinida: prima ENTER.
  4. Ponto final S3: introduza o ponto final fornecido pelo seu operador de infraestrutura (IO).
  5. Para a nomenclatura de contentores no estilo DNS, introduza s3://%(bucket).
  6. Opcional: introduza uma palavra-passe de encriptação para proteger os ficheiros em trânsito.
  7. Em Caminho para GPG, introduza /usr/bin/gpg.
  8. Introduza Yes para usar o protocolo HTTPS.
  9. Prima Enter para ignorar a introdução do nome do servidor proxy.

Crie contentores de armazenamento

Antes de começar

Um espaço de nomes do projeto gere os recursos de contentores no cluster de administrador principal. Tem de ter um projeto para criar um contentor. Para criar um novo projeto, consulte o artigo Crie um projeto. Tem de ter as autorizações de contentor adequadas para realizar as seguintes operações. Consulte o artigo sobre conceder acesso ao contentor.

Crie um contentor

Para criar um contentor, aplique uma especificação de contentor ao espaço de nomes do seu projeto:

    kubectl apply -f bucket.yaml

Segue-se um exemplo de uma especificação de grupo:

    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

Para mais detalhes, consulte a referência da API Bucket.

Liste contentores de armazenamento

Para listar todos os contentores aos quais tem acesso num determinado inquilino de armazenamento de objetos, conclua os seguintes passos:

  1. Execute os seguintes comandos para listar todos os contentores:

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

Elimine contentores de armazenamento

Pode eliminar contentores de armazenamento através da CLI. Os contentores têm de estar vazios antes de os poder eliminar.

  1. Use o comando GET ou DESCRIBE na secção Ver configuração do contentor para obter o nome do contentor totalmente qualificado.

  2. Se o contentor não estiver vazio, esvazie-o:

    s3cmd rm --recursive -—force s3://FULLY_QUALIFIED_BUCKET_NAME
    
  3. Elimine o contentor vazio:

    kubectl delete buckets/BUCKET_NAME --namespace NAMESPACE_NAME
    

Veja a configuração do contentor

Use qualquer um dos comandos para ver os detalhes da configuração de um contentor:

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

Defina um período de retenção de objetos

Por predefinição, pode eliminar objetos em qualquer altura. Ative o bloqueio de objetos com um período de retenção para impedir a eliminação de todos os objetos no contentor durante o número de dias especificado. Não pode eliminar um contentor até eliminar todos os objetos após o período de retenção.

Tem de ativar o bloqueio de objetos quando cria o contentor. Não pode ativar nem desativar o bloqueio de objetos depois de criar um contentor. No entanto, pode modificar o período de retenção de objetos predefinido.

Pode criar um contentor com ou sem ativar o bloqueio de objetos. Se tiver ativado o bloqueio de objetos, especificar um período de retenção predefinido é opcional.

Para modificar o período de retenção, atualize o campo Bucket.spec.bucketPolicy.lockingPolicy.defaultObjectRetentionDays no recurso Bucket.

Segue-se um exemplo de atualização do campo no recurso 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

Todas as atualizações ao período de retenção aplicam-se a objetos criados no contentor após a atualização. Para objetos pré-existentes, o período de retenção não é alterado.

Quando o bloqueio de objetos está ativado, se tentar substituir um objeto, adiciona uma nova versão do objeto. Pode obter ambas as versões do objeto. Para ver detalhes sobre como listar versões de objetos, consulte ListObjectVersions na documentação dos Amazon Web Services: https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectVersions.html

Para criar um contentor de gravação única e leitura múltipla (WORM), consulte a secção Contentor WORM.

Conceda acesso ao contentor

Pode conceder acesso ao contentor a outros utilizadores ou contas de serviço criando e aplicando RoleBindings com funções predefinidas.

Funções predefinidas

  • project-bucket-object-viewer: esta função permite que um utilizador liste todos os contentores no projeto, liste objetos nesses contentores e leia objetos e metadados de objetos. Esta função não lhe permite escrever operações em objetos, como carregar, substituir ou eliminar

  • project-bucket-object-admin: esta função permite que um utilizador liste todos os contentores no projeto e execute operações de escrita e leitura em objetos, como carregar, substituir ou eliminar.

  • project-bucket-admin: esta função permite que os utilizadores façam a gestão de todos os contentores no espaço de nomes indicado, bem como de todos os objetos nesses contentores.

Para ver uma lista completa das autorizações concedidas para estas funções, consulte a secção autorizações de funções predefinidas.

Para receber as autorizações necessárias para criar associações de funções do projeto, peça ao administrador de IAM do projeto para lhe conceder a função de administrador de IAM do projeto (project-iam-admin).

Segue-se um exemplo de criação de um RoleBinding para conceder acesso a um utilizador e a uma conta de serviço:

  1. Crie um ficheiro YAML no seu sistema, como 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. Aplique o ficheiro YAML:

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

Obtenha credenciais de acesso ao contentor

Quando concede acesso a um contentor, as credenciais de acesso são criadas num segredo.

O formato do nome do segredo é object-storage-key-SUBJECT_TYPE-SUBJECT_HASH.

  • Os valores de SUBJECT_TYPE são os seguintes:
    • user: o utilizador.
    • sa: o ServiceAccount.
  • SUBJECT_HASH é o hash SHA256 codificado em base32 do nome do assunto.

Por exemplo, o utilizador bob@foo.com tem o segredo com o nome:

object-storage-key-user-oy6jdqd6bxfoqcecn2ozv6utepr5bgh355vfku7th5pmejqubdja

Aceda ao segredo do utilizador

Para um utilizador sujeito, o segredo encontra-se no object-storage-access-keysnamespace no cluster de administrador raiz.

  1. Encontre o nome do segredo:

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

    Recebe um resultado semelhante ao seguinte:

    secrets        []        [object-storage-key-nl-user-oy6jdqd6bxfoqcecn2ozv6utepr5bgh355vfku7th5pmejqubdja,object-storage-key-std-user-oy6jdqd6bxfoqcecn2ozv6utepr5bgh355vfku7th5pmejqubdja]        [get]
    
  2. Obtenha o conteúdo do segredo correspondente para aceder aos contentores:

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

    Recebe um resultado semelhante ao seguinte:

    data:
      access-key-id: MEhYM08wWUMySjcyMkVKTFBKRU8=
      create-time: MjAyMi0wNy0yMiAwMTowODo1OS40MTQyMTE3MDMgKzAwMDAgVVRDIG09KzE5OTAuMzQ3OTE2MTc3
      secret-access-key: Ump0MVRleVN4SmhCSVJhbmlnVDAwbTJZc0IvRlJVendqR0JuYVhiVA==
    
  3. Descodifique o ID da chave de acesso e o segredo:

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

    Recebe um resultado semelhante ao seguinte:

    0HX3O0YC2J722EJLPJEO
    Rjt1TeySxJhBIRanigT00m2YsB/FRUzwjGBnaXbT
    
  4. Siga a secção Configure s3cmd com as informações resultantes.

Aceda ao segredo da conta de serviço

Para um assunto de conta de serviço (SA), o segredo está no mesmo espaço de nomes que o recipiente. Para encontrar o nome, execute o seguinte comando:

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

Recebe um resultado semelhante ao seguinte:

  object-storage-key-rm-sa-mng3olp3vsynhswzasowzu3jgzct2ert72pjp6wsbzqhdwckwzbq

Pode fazer referência ao segredo no seu pod como variáveis de ambiente (https://kubernetes.io/docs/concepts/configuration/secret/#using-secrets-as-environment-variables) ou ficheiros (https://kubernetes.io/docs/concepts/configuration/secret/#using-secrets-as-files-from-a-pod).

Autorizações de funções predefinidas

Autorizações project-bucket-object-viewer

Esta função concede autorizações para obter e listar objetos e metadados de objetos no contentor.

A função project-bucket-object-viewer tem as seguintes autorizações:

  • Autorizações da API Bucket:

    1. Obter
    2. Lista
    3. Ver
  • Autorizações de armazenamento de objetos do S3:

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

autorizações project-bucket-object-admin

Esta função concede autorizações para colocar e eliminar objetos, versões de objetos e etiquetas no contentor. Além disso, também concede todas as autorizações no project-bucket-object-viewer.

A função project-bucket-object-admin tem as seguintes autorizações de armazenamento de objetos:

  • Autorizações de armazenamento de objetos do S3:

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

autorizações de administrador do projeto-contentor

Esta função concede autorizações para criar, atualizar ou eliminar recursos Bucket no namespace do projeto. Além disso, também concede todas as autorizações em project-bucket-object-admin.

A função project-bucket-object-admin tem as seguintes autorizações:

  • Autorizações da API Bucket:

    1. Criar
    2. Atualizar
    3. Eliminar

Crie um contentor WORM

Um contentor WORM garante que nada mais substitui os objetos e que os retém durante um período mínimo. O registo de auditoria é um exemplo de utilização de um contentor WORM.

Siga os passos seguintes para criar um contentor WORM:

  1. Defina um período de retenção quando criar o contentor. Por exemplo, o seguinte exemplo de contentor tem um período de retenção de 365 dias.

    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. Conceda a função de project-bucket-object-viewer a todos os utilizadores que precisam de acesso só de leitura:

    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. Conceda a função project-bucket-object-admin aos utilizadores que precisam de escrever conteúdo no contentor:

    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
    

Restaure do armazenamento de objetos para o sistema de ficheiros no armazenamento de blocos

Atribua um volume persistente

Para restaurar ficheiros a partir de um ponto final de armazenamento de objetos, siga estes passos:

  1. Atribua um volume persistente (PV) para segmentar na restauração. Use uma reivindicação de volume persistente (PVC) para atribuir o volume, conforme mostrado no exemplo seguinte:

    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. Verifique o estado do PVC:

    kubectl get pvc restore-pvc -n restore-ns
    

    Depois de o PVC estar no estado Bound, está pronto para ser consumido no pod que o reidrata.

  3. Se um conjunto Stateful consumir eventualmente o PV, tem de fazer corresponder os PVCs StatefulSet renderizados. Os pods que o StatefulSet produz consomem os volumes hidratados. O exemplo seguinte mostra modelos de reivindicação de volume num StatefulSet denominado ss.

      volumeClaimTemplates:
      - metadata:
          name: pvc-name
        spec:
          accessModes: [ "ReadWriteOnce" ]
          storageClassName: standard-rwo
          resources:
            requests:
              storage: 1Gi
    
  4. Pré-atribua PVCs com nomes como ss-pvc-name-0 e ss-pvc-name-1 para garantir que os pods resultantes consomem os volumes pré-atribuídos.

Hidrate o volume persistente (PV)

Depois de o PVC estar associado a um PV, inicie o Job para preencher o 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

Depois de o comando Job terminar a execução, os dados do contentor de armazenamento de objetos preenchem o volume. Um pod separado pode consumir os dados através dos mesmos mecanismos padrão para montar um volume.