Provisionando PVCs no Serviço Block Volume

Descubra como provisionar reivindicações de volume persistente para clusters que você criou usando o Kubernetes Engine (OKE) anexando volumes do serviço Block Volume.

O serviço Oracle Cloud Infrastructure Block Volume (o serviço Block Volume) fornece armazenamento em blocos persistente, durável e de alto desempenho para seus dados. Você pode usar o plug-in de volume CSI ou FlexVolume para conectar clusters a volumes no serviço Block Volume. A Oracle recomenda o uso do plug-in de volume CSI porque:
  • A nova funcionalidade só está sendo adicionada ao plug-in de volume CSI, não ao FlexVolume (embora os desenvolvedores do Kubernetes continuem a manter o plug-in de volume FlexVolume).
  • O plug-in de volume CSI não requer acesso às dependências subjacentes do sistema operacional e do sistema de arquivos raiz.
Observação

O projeto do Kubernetes ascendente está descontinuando o plug-in de volume FlexVolume no Kubernetes versão 1.23. A remoção do recurso seguirá as diretrizes na Política de Obsolescência do Kubernetes.

O StorageClass especificado para uma PVC controla qual plug-in de volume usar para estabelecer conexão com os volumes do serviço Block Volume. Duas classes de armazenamento são definidas por padrão, oci-bv para o plug-in de volume CSI e oci para o plug-in FlexVolume. Se você não especificar explicitamente um valor para storageClassName no arquivo yaml que define a PVC, a classe de armazenamento padrão do cluster será usada. A classe de armazenamento padrão do cluster é inicialmente definida de acordo com a versão do Kubernetes especificada quando o cluster foi criado, da seguinte forma:

  • Em clusters criados pelo Kubernetes Engine para executar o Kubernetes versão 1.24 (ou posterior), a classe de armazenamento oci-bv é inicialmente definida como padrão. A classe de armazenamento oci-bv é usada pelo plug-in de volume CSI.
  • Em clusters criados pelo Kubernetes Engine para executar o Kubernetes versão 1.23 (ou anterior), a classe de armazenamento oci é inicialmente definida como padrão. A classe de armazenamento oci é usada pelo plug-in de volume FlexVolume.
Observação

Em clusters criados originalmente pelo Kubernetes Engine para executar o Kubernetes versão 1.23 (ou anterior) e subsequentemente atualizados para o Kubernetes versão 1.24 (ou posterior), a classe de armazenamento padrão não é alterada durante o processo de upgrade. Portanto, se a classe de armazenamento padrão for oci antes do upgrade, a classe de armazenamento padrão continuará sendo oci após o upgrade.

Se você quiser que oci-bv, em vez de oci, seja a classe de armazenamento padrão de um cluster que você fez upgrade do Kubernetes versão 1.23 (ou anterior) para o Kubernetes versão 1.24 (ou posterior), altere a classe de armazenamento padrão da seguinte forma:

  1. Especifique se oci não é a classe de armazenamento padrão digitando:
    kubectl patch storageclass oci -p '{"metadata": {"annotations": {"storageclass.beta.kubernetes.io/is-default-class":"false"}}}'
  2. Especifique se oci-bv é a classe de armazenamento padrão digitando:
    kubectl patch storageclass oci-bv -p '{"metadata": {"annotations": {"storageclass.kubernetes.io/is-default-class":"true"}}}'

No caso do plug-in de volume CSI, o recurso de topologia CSI garante que nós de trabalho e volumes estejam no mesmo domínio de disponibilidade. No caso do plug-in de volume FlexVolume, você pode usar o elemento matchLabels para selecionar o domínio de disponibilidade no qual uma reivindicação de volume persistente é provisionada. Observe que você não usa o elemento matchLabels com o plug-in de volume CSI.

Independentemente do plug-in de volume que você optar por usar, se um cluster estiver em um compartimento diferente dos nós de trabalho, crie uma política adicional para permitir o acesso aos volumes do serviço Block Volume. Essa situação surge quando a sub-rede especificada para um pool de nós pertence a um compartimento diferente do cluster. Para permitir que os nós de trabalho acessem os volumes do serviço Block Volume, crie a política adicional com as duas seguintes instruções de política:

  • ALLOW any-user to manage volumes in TENANCY where request.principal.type = 'cluster'
  • ALLOW any-user to manage volume-attachments in TENANCY where request.principal.type = 'cluster'

Para especificar explicitamente o plug-in de volume a ser usado na conexão com o serviço Block Volume ao provisionar uma reivindicação de volume persistente, especifique um valor para storageClassName no arquivo yaml que define a PVC:

  • para usar o plug-in de volume CSI, especifique storageClassName: "oci-bv"
  • para usar o plug-in de volume FlexVolume, especifique storageClassName: "oci"

Observe o seguinte:

  • A quantidade mínima de armazenamento persistente que uma PVC pode solicitar é 50 gigabytes. Se a solicitação for inferior a 50 gigabytes, a solicitação será arredondada para até 50 gigabytes.
  • Se quiser aumentar o volume de armazenamento persistente que uma PVC pode solicitar, defina allowVolumeExpansion: true na definição da classe de armazenamento especificada para a PVC. Consulte Expandindo um Volume em Blocos.
  • Ao criar um cluster, você pode, opcionalmente, definir tags a serem aplicadas a volumes em blocos criados quando solicitações de volume persistente (PVCs) são definidas. O serviço Tagging permite que você agrupe recursos diferentes entre compartimentos e também permite anotar recursos com seus próprios metadados. Consulte Aplicando Tags a Volumes em Blocos.
  • Depois de criar uma PVC em um novo volume em blocos usando o plug-in de volume CSI, você pode exibir estatísticas de capacidade para o volume em blocos usando uma ferramenta de agregação de métricas (como Prometheus), incluindo:
    • kubelet_volume_stats_available_bytes
    • kubelet_volume_stats_capacity_bytes
    • kubelet_volume_stats_inodes
    • kubelet_volume_stats_inodes_free
    • kubelet_volume_stats_inodes_used
    • kubelet_volume_stats_used_bytes

Criando uma PVC em um Volume em Blocos Usando o Plug-in de Volume CSI

Você pode provisionar dinamicamente um volume em blocos usando o plug-in CSI especificado pela definição da classe de armazenamento oci-bv (provisioner: blockvolume.csi.oraclecloud.com). Por exemplo, se o administrador do cluster não tiver criado qualquer PV adequado que corresponda à solicitação de PVC.

Você define uma PVC em um arquivo chamado csi-bvs-pvc.yaml. Por exemplo:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mynginxclaim
spec:
  storageClassName: "oci-bv"
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 50Gi

Digite o seguinte comando para criar a PVC com base no arquivo csi-bvs-pvc.yaml:

kubectl create -f  csi-bvs-pvc.yaml

A saída do comando anterior confirma a criação da PVC:

persistentvolumeclaim "mynginxclaim" created

Verifique se a PVC foi criada executando kubectl get pvc:

kubectl get pvc

A saída do comando anterior mostra o status atual da PVC:

		
NAME               STATUS   VOLUME   CAPACITY   ACCESSMODES   STORAGECLASS   AGE
mynginxclaim       Pending                                    oci-bv         4m

A PVC tem um status Pending porque a definição da classe de armazenamento oci-bv inclui volumeBindingMode: WaitForFirstConsumer.

Você pode usar essa PVC ao criar outros objetos, como pods. Por exemplo, você pode criar um novo pod com base na definição de pod a seguir, que instrui o sistema a usar a PVC mynginxclaim como volume nginx, que é montado pelo pod em /data.

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
    - name: nginx
      image: nginx:latest
      ports:
        - name: http
          containerPort: 80
      volumeMounts:
        - name: data
          mountPath: /usr/share/nginx/html
  volumes:
    - name: data
      persistentVolumeClaim:
        claimName: mynginxclaim

Depois de ter criado o novo pod, você poderá verificar se a PVC foi vinculada a um novo volume persistente digitando:

kubectl get pvc

A saída do comando anterior confirma que a PVC foi vinculada:

			
NAME               STATUS    VOLUME                               CAPACITY   ACCESSMODES   STORAGECLASS   AGE
mynginxclaim       Bound     ocid1.volume.oc1.iad.<unique_ID>     50Gi       RWO           oci-bv         4m

Você pode verificar se o pod está usando a nova reivindicação de volume persistente digitando:

kubectl describe pod nginx

Você pode exibir estatísticas de capacidade para o novo volume persistente usando uma ferramenta de agregação de métricas, como o Prometheus.

Criando um Snapshot de Volume de um Backup de Volume em Blocos Usando o Plug-in de Volume CSI

Um snapshot de volume do Kubernetes é um snapshot de um volume persistente em um sistema de armazenamento. Você pode usar um snapshot de volume para provisionar um novo volume persistente. Para obter mais informações sobre snapshots de volume do Kubernetes, consulte Instantâneos de Volume na documentação do Kubernetes.

Ao usar o plug-in de volume CSI para conectar clusters a volumes em blocos no serviço Block Volume, você pode usar backups de volumes em blocos para provisionar snapshots de volumes do Kubernetes. Você pode usar um snapshot de volume para criar um novo volume em blocos e preenchê-lo previamente com dados do backup de volume em blocos. Para obter mais informações sobre backups de volume em blocos no serviço Block Volume, consulte Visão Geral dos Backups do Serviço Block Volume.

Você pode usar o plug-in de volume CSI para provisionar um snapshot de volume de duas maneiras:

  • Dinamicamente: Você pode solicitar a criação de um backup do volume em blocos provisionando um volume persistente. Você especifica a reivindicação de volume persistente usando o objeto VolumeSnapshot e especifica os parâmetros a serem usados para criar o backup de volume em blocos usando o objeto VolumeSnapshotClass. Os snapshots de volume provisionados dinamicamente também são chamados de snapshots de volume dinâmico. Consulte Criando Snapshots de Volume Provisionados Dinamicamente.
  • Estaticamente: Você pode fornecer detalhes de um backup de volume em blocos existente usando o objeto VolumeSnapshotContent. Os snapshots de volume provisionados estaticamente também são chamados de snapshots de volume estáticos e de snapshots de volume pré-provisionados. Criando Snapshots de Volume Provisionados Estaticamente

Quando você cria um snapshot de volume provisionado dinamicamente, as mesmas tags de formato livre e as tags definidas que foram aplicadas ao volume em blocos de origem são aplicadas ao backup do volume em blocos. No entanto, você pode usar parâmetros para aplicar tags adicionais ao backup de volume em blocos (consulte Marcando com Tags Backups de Volume em Blocos).

Há vários pré-requisitos a serem atendidos antes da criação de snapshots de volume para uso com clusters criados pelo Kubernetes Engine. Consulte Pré-requisitos para Criar Snapshots de Volume.

Observe o seguinte ao criar e usar snapshots de volume:

  • Você só pode criar snapshots de volume ao usar o plug-in de volume CSI (ou seja, não é possível criar snapshots de volume ao usar o plug-in de volume FlexVolume).
  • No caso de backups de volume dinâmicos, o plug-in de volume CSI cria um novo backup de volume em blocos para provisionar um snapshot de volume dinâmico no mesmo compartimento do cluster. No caso de snapshots de volume estático, o backup de volume em blocos que provisiona um snapshot de volume estático pode estar em outro compartimento para o cluster, desde que existam instruções de política apropriadas para permitir que o cluster acesse esse outro compartimento (consulte Pré-requisitos para Criar Instantâneos de Volume).
  • Não é possível usar o plug-in de volume CSI para preencher novamente um volume existente com dados. Em outras palavras, você não pode restaurar (reverter) dados em um volume persistente existente para um estado anterior alterando o snapshot de volume especificado no manifesto da reivindicação de volume persistente. Você só pode usar o plug-in de volume CSI para preencher um novo volume com dados.
  • Quando você cria um backup de volume em blocos (por exemplo, ao criar um snapshot de volume dinâmico), a chave de criptografia usada ao criar o volume em blocos também é usada para criar o backup. Você não pode especificar uma nova chave de criptografia ao criar um backup de volume em blocos. Portanto, o backup de volume em blocos usa a mesma criptografia do volume em blocos que ele faz backup.
  • O tamanho especificado para um volume persistente provisionado por um snapshot de volume não deve ser menor que o tamanho do volume original do qual o snapshot foi criado.
  • Quando o plug-in de volume CSI cria um novo volume em blocos para fazer backup de um volume persistente provisionado por um snapshot de volume, o posicionamento do volume em blocos depende dos requisitos de topologia da solicitação de criação de volume. Por exemplo, se o plug-in de volume CSI criar um volume em blocos para um pod que use uma reivindicação de volume persistente, o volume em blocos será criado no mesmo domínio de disponibilidade que o nó de trabalho no qual o pod está sendo executado.
  • Não há suporte para snapshots de espaços entre nomes.

Pré-requisitos para Criar Instantâneos de Volume

Para criar snapshots de volume para uso com clusters criados pelo Kubernetes Engine:

  • os nós de plano de controle do cluster devem estar executando o Kubernetes versão 1.24 ou posterior
  • os nós de trabalho do cluster devem estar usando o processador AMD ou as formas de computação do processador baseado em Arm
  • os nós de trabalho do cluster devem estar executando o Oracle Linux 7 ou o Oracle Linux 8

Os objetos VolumeSnapshot, VolumeSnapshotContent e VolumeSnapshotClass não fazem parte da API principal do Kubernetes. Portanto, antes de criar snapshots de volume usando o plug-in de volume CSI, você precisa instalar os arquivos CRD (Definição de Recurso Personalizado) necessários no cluster, executando os seguintes comandos:

kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/client/config/crd/snapshot.storage.k8s.io_volumesnapshotclasses.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/client/config/crd/snapshot.storage.k8s.io_volumesnapshotcontents.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/client/config/crd/snapshot.storage.k8s.io_volumesnapshots.yaml

Se você quiser usar um snapshot de volume provisionado estaticamente para provisionar um novo volume persistente e o backup de volume em blocos subjacente estiver em outro compartimento para o cluster, deverão existir instruções de política apropriadas para permitir que o cluster acesse os backups de volume em blocos nesse outro compartimento. Por exemplo:

ALLOW any-user to manage volume-backups in compartment <compartment-name> where request.principal.type = 'cluster'
ALLOW any-user to use volumes in compartment <compartment-name> where request.principal.type = 'cluster'

Criando Snapshots de Volume Provisionados Dinamicamente

Para provisionar dinamicamente um snapshot de volume criando um backup do volume em blocos provisionando uma reivindicação de volume persistente, primeiro defina um objeto VolumeSnapshotClass que especifique o tipo de backup de volume em blocos a ser criado. Depois de criar o objeto VolumeSnapshotClass, defina um objeto VolumeSnapshot que use VolumeSnapshotClass. Use o objeto VolumeSnapshot para especificar a reivindicação de volume persistente provisionada pelo volume em blocos cujo backup você deseja fazer.

Observação

Quando você cria um snapshot de volume provisionado dinamicamente, o Kubernetes Engine cria um objeto VolumeSnapshotContent. Não modifique os objetos VolumeSnapshotContent que o Kubernetes Engine cria nem crie seus próprios objetos VolumeSnapshotContent ao criar snapshots de volume provisionados dinamicamente.

Por exemplo, você define uma reivindicação de volume persistente chamada sample-pvc em um arquivo chamado csi-mypvctobackup.yaml, provisionado por um volume em blocos:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: sample-pvc
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: "oci-bv"
  resources:
    requests:
      storage: 50Gi

Crie a reivindicação de volume persistente:

kubectl create -f csi-mypvctobackup.yaml

Você pode usar a reivindicação de volume persistente ao definir outros objetos, como pods. Por exemplo, a definição de pod a seguir instrui o sistema a usar a reivindicação de volume persistente sample-pvc como volume nginx, que é montado pelo pod em /sample-volume.

apiVersion: v1
kind: Pod
metadata:
  name: sample-pod
spec:
  containers:
    - name: sample-nginx
      image: nginx
      ports:
        - containerPort: 80
          name: "http-server"
      volumeMounts:
        - mountPath: "/usr/share/nginx/html"
          name: sample-volume
  volumes:
  - name: sample-volume
    persistentVolumeClaim:
      claimName: sample-pvc

Após criar o novo pod, a reivindicação de volume persistente é vinculada a um novo volume persistente provisionado por um volume em blocos.

Na prontidão para criar um backup do provisionamento do volume em blocos da reivindicação de volume persistente, você define parâmetros para o backup do volume em blocos definindo um objeto VolumeSnapshotClass chamado my-snapclass em um arquivo chamado csi-mysnapshotclass.yaml:

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotClass
metadata:
  name: my-snapclass
driver: blockvolume.csi.oraclecloud.com
parameters:
  backupType: full
deletionPolicy: Delete

em que:

  • driver: blockvolume.csi.oraclecloud.com especifica o plug-in de volume CSI para provisionar objetos VolumeSnapshot.
  • parameters.backupType: full especifica que um backup de volume em blocos deve incluir todas as alterações desde que o volume em blocos foi criado. Especifique incremental para criar um backup com apenas as alterações desde o último backup. Observe que, para fins de recuperação de dados, não há diferença funcional entre um backup incremental e um backup completo. Consulte Tipos de Backup de Volume.
  • deletionPolicy: Delete especifica o que acontece com um backup de volume em blocos se o objeto VolumeSnapshot associado for excluído. Especifique Retain para manter um backup de volume em blocos se o objeto VolumeSnapshot associado for excluído.

Por padrão, as mesmas tags de formato livre e as tags definidas que foram aplicadas ao volume em blocos de origem são aplicadas ao backup do volume em blocos. No entanto, você pode usar parâmetros para aplicar tags adicionais ao backup de volume em blocos (consulte Marcando com Tags Backups de Volume em Blocos).

Crie o objeto VolumeSnapshotClass:

kubectl create -f csi-mysnapshotclass.yaml

Para criar um backup do provisionamento do volume em blocos da reivindicação de volume persistente, defina um objeto VolumeSnapshot como my-snapshot em um arquivo chamado csi-mysnapshot.yaml:

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
  name: my-snapshot
  namespace: default
spec:
  volumeSnapshotClassName: my-snapclass
  source:
    persistentVolumeClaimName: sample-pvc
em que:
  • volumeSnapshotClassName: my-snapclass especifica my-snapclass como o objeto VolumeSnapshotClass do qual obter parâmetros a serem usados ao criar o backup de volume em blocos. Observe que você não pode alterar volumeSnapshotClassName depois de criar o objeto VolumeSnapshot (você precisa criar um novo objeto VolumeSnapshot).
  • persistentVolumeClaimName: sample-pvc especifica sample-pvc como a reivindicação de volume persistente com base no volume em blocos para o qual você deseja criar um backup de volume em blocos. Observe que você não pode alterar a origem depois de criar o objeto VolumeSnapshot (você precisa criar um novo objeto VolumeSnapshot).

Crie o objeto VolumeSnapshot:

kubectl create -f csi-mysnapshot.yaml

O objeto VolumeSnapshot é criado e provisionado por um novo backup de volume em blocos. Você pode usar o snapshot de volume para provisionar um novo volume persistente (consulte Usando um Snapshot de Volume para Provisionar um Novo Volume).

Criando Snapshots de Volume Provisionados Estaticamente

Para provisionar estaticamente um snapshot de volume de um backup de volume em blocos existente, primeiro crie o backup de volume em blocos (consulte Criando um Backup Manual para um Volume em Blocos ).

Após criar o backup de volume em blocos, defina um objeto VolumeSnapshotContent e especifique detalhes (incluindo o OCID) do backup de volume em blocos existente. Em seguida, você pode definir um objeto VolumeSnapshot e especificar o objeto VolumeSnapshotContent que fornece detalhes do backup de volume em blocos existente.

Por exemplo, você define o objeto VolumeSnapshotContent como my-static-snapshot-content em um arquivo chamado csi-mystaticsnapshotcontent.yaml:

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotContent
metadata:
  name: my-static-snapshot-content
spec:
  deletionPolicy: Retain
  driver: blockvolume.csi.oraclecloud.com
  source:
    snapshotHandle: ocid1.volumebackup.oc1.iad.aaaaaa______xbd
  volumeSnapshotRef:
    name: my-static-snapshot
    namespace: default
em que:
  • deletionPolicy: Retain especifica o que acontece com um backup de volume em blocos se o objeto VolumeSnapshot associado for excluído. Especifique Delete para excluir um backup de volume em blocos se o objeto VolumeSnapshot associado for excluído.
  • driver: blockvolume.csi.oraclecloud.com especifica o uso do plug-in de volume CSI para provisionar objetos VolumeSnapshot.
  • snapshotHandle: ocid1.volumebackup.oc1.iad.aaaaaa______xbd especifica o OCID do backup de volume em blocos existente.
  • volumeSnapshotRef.name: my-static-snapshot especifica o nome do objeto VolumeSnapshot correspondente a ser provisionado com base no backup de volume em blocos existente. Esse campo é obrigatório. Observe que o objeto VolumeSnapshot não precisa existir quando você cria o objeto VolumeSnapshotContent.
  • namespace: default especifica o namespace que contém o objeto VolumeSnapshot correspondente a ser provisionado com base no backup de volume em blocos existente. Esse campo é obrigatório.

Crie o objeto VolumeSnapshotContent:

kubectl create -f csi-mystaticsnapshotcontent.yaml

Você define o objeto VolumeSnapshot provisionado estaticamente como my-static-snapshot em um arquivo chamado csi-mystaticsnapshot.yaml:

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
  name: my-static-snapshot
spec:
  source:
    volumeSnapshotContentName: my-static-snapshot-content

em que VolumeSnapshotContentName: my-static-snapshot-content especifica o nome do objeto VolumeSnapshotContent criado anteriormente. Observe que você não pode alterar a origem depois de criar o objeto VolumeSnapshot (você precisa criar um novo objeto VolumeSnapshot).

Crie o objeto VolumeSnapshot:

kubectl create -f csi-mystaticsnapshot.yaml

O objeto VolumeSnapshot é criado e provisionado pelo backup de volume em blocos especificado no objeto VolumeSnapshotContent. Você pode usar o snapshot de volume para provisionar um novo volume persistente (consulte Usando um Snapshot de Volume para Provisionar um Novo Volume).

Usando um Snapshot de Volume para Provisionar um Novo Volume

Depois de criar um snapshot de volume provisionado dinamicamente ou estaticamente, você pode especificar o snapshot de volume como a origem de dados de uma reivindicação de volume persistente para provisionar um novo volume persistente.

Por exemplo, você define uma reivindicação de volume persistente chamada pvc-fromsnapshot em um arquivo chamado csi-mypvcfromsnapshot.yaml, provisionado por um snapshot de volume chamado test-snapshot:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-fromsnapshot
  namespace: default
spec:
  storageClassName: oci-bv
  dataSource:
    name: test-snapshot
    kind: VolumeSnapshot
    apiGroup: snapshot.storage.k8s.io
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 50Gi

em que:

  • datasource.name: test-snapshot especifica test-snapshot como o nome do objeto VolumeSnapshot a ser usado como a origem de dados do volume persistente.
  • datasource.apiGroup: snapshot.storage.k8s.io especifica a versão da API de armazenamento de snapshot do Kubernetes a ser usada.

Crie a reivindicação de volume persistente:

kubectl create -f csi-mypvcfromsnapshot.yaml

Quando a reivindicação de volume persistente é usada para provisionar outro objeto (como um pod), um volume persistente é criado e o objeto VolumeSnapshot especificado é usado para preencher o volume em blocos subjacente. Por exemplo, você pode criar um novo pod com base na definição de pod a seguir que instrui o sistema a usar a PVC PVC-fromsnapshot como volume nginx, que é montado pelo pod em /data.

apiVersion: v1
kind: Pod
metadata:
  name: sample-pod-restore
spec:
  containers:
    - name: nginx
      image: nginx:latest
      ports:
        - name: http
          containerPort: 80
      volumeMounts:
        - name: data
          mountPath: /data
  volumes:
    - name: data
      persistentVolumeClaim:
        claimName: pvc-fromsnapshot

Tendo criado o novo pod, a reivindicação de volume persistente é vinculada a um novo volume persistente provisionado por um novo volume em blocos preenchido pelo objeto VolumeSnapshot.

Marcando com Tag Backups de Volume em Blocos

Quando você usa o plug-in de volume CSI para criar um snapshot de volume provisionado dinamicamente, as mesmas tags de formato livre e tags definidas que foram aplicadas ao volume em blocos de origem também são aplicadas ao backup do volume em blocos.

Para aplicar tags de formato livre adicionais ao novo backup de volume em blocos, inclua o seguinte parâmetro na seção de parâmetros do arquivo de manifesto VolumeSnapshotClass:

oci.oraclecloud.com/freeform-tags: '{"<first-tag-key>":","<first-tag-value>","<second-tag-key>":"<second-tag-value>"...}'

Para aplicar tags definidas adicionais ao novo backup de volume em blocos, inclua o seguinte parâmetro na seção de parâmetros do arquivo de manifesto VolumeSnapshotClass:

oci.oraclecloud.com/defined-tags: '{"<tag-namespace>": {"<first-tag-key>":","<first-tag-value>","<second-tag-key>":"<second-tag-value>"...}}'

Por exemplo:

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotClass
metadata:
  name: my-snapclass
driver: blockvolume.csi.oraclecloud.com
parameters:
  backupType: full
  oci.oraclecloud.com/freeform-tags: '{"<first-tag-key>":","<first-tag-value>","<second-tag-key>":"<second-tag-value>"...}'
deletionPolicy: Delete

Criando uma PVC Clonando um Volume em Blocos Existente Usando o Plug-in de Volume CSI

Um clone do Kubernetes é uma duplicata exata de um volume persistente existente em um sistema de armazenamento. Você pode clonar um volume persistente existente para provisionar uma nova reivindicação de volume persistente. O novo volume persistente contém uma cópia dos dados do volume persistente de origem, mas é independente do volume persistente de origem. Você pode usar clones de volume para testar alterações de configuração rapidamente, sem afetar um ambiente de produção. Para obter mais informações sobre clones do Kubernetes, consulte Clonagem de Volume do CSI na documentação do Kubernetes.

No serviço Block Volume, você pode clonar um volume em blocos para criar um novo volume em blocos pré-preenchido com dados do volume em blocos de origem. Para obter mais informações sobre a clonagem de volumes em blocos no serviço Block Volume, consulte Clonando um Volume em Blocos.

Ao usar o plug-in de volume CSI para conectar clusters a volumes em blocos no serviço Block Volume, você pode provisionar uma nova PVC com um novo volume em blocos que foi clonado de um volume em blocos existente provisionando outra PVC existente. Para indicar que você deseja que o plug-in de volume CSI clone o volume em blocos existente para a nova PVC, especifique a PVC existente como origem de dados para a nova PVC.

O PVC novo pode ser usado da mesma maneira que qualquer outro PVC, e é inteiramente separado ao PVC existente especificado como a fonte de dados. Da mesma forma, o novo volume em blocos e o volume em blocos existente do qual ele é clonado são recursos totalmente separados e podem ser atualizados, clonados, instantâneos e excluídos independentemente um do outro.

Assim que o volume em blocos de origem tiver sido clonado e um novo volume em blocos tiver sido criado (geralmente em alguns segundos), o novo volume em blocos terá um estado Disponível. Todos os dados presentes no volume em blocos de origem nesse momento são copiados para o novo volume em blocos (nenhuma alteração subsequente é copiada). No entanto, os dados são copiados em segundo plano, o que pode levar até trinta minutos, dependendo do tamanho do volume em blocos (por exemplo, pode levar até quinze minutos para copiar um volume em blocos de 1 TB). Portanto, para evitar a possibilidade de erros ou corrupção de dados, a nova PVC tem um estado de Pendente até que todos os dados tenham sido copiados. Quando todos os dados foram copiados, a nova PVC está vinculada ao PV provisionado pelo novo volume em blocos e a nova PVC tem um estado Disponível.

Há vários pré-requisitos a serem atendidos antes de provisionar uma nova reivindicação de volume persistente clonando o volume em blocos que já está provisionando uma reivindicação de volume persistente existente. Consulte Pré-requisitos para Clonar um Volume em Blocos Existente para Provisionar uma Nova PVC.

Observe o seguinte ao clonar um volume em blocos para provisionar uma nova PVC:

  • O plug-in de volume CSI cria o novo volume em blocos no mesmo domínio de disponibilidade, região e tenancy do volume em blocos de origem.
  • O novo volume em blocos criado pelo plug-in de volume CSI pode ser clonado assim que tiver um estado Disponível.
  • Todos os requisitos de topologia em uma solicitação de criação de volume são ignorados. Por exemplo, se o plug-in de volume CSI clones um volume em blocos para um pod que usa uma reivindicação de volume persistente, o novo volume em blocos será criado no mesmo domínio de disponibilidade que o nó de trabalho no qual o pod está sendo executado.
  • Não é possível usar o plug-in de volume CSI para clonar volumes em blocos criados pelo plug-in de volume FlexVolume.
  • Não é possível excluir a PVC de origem enquanto a clonagem estiver em andamento. Da mesma forma, não é possível excluir um volume em blocos de origem enquanto os dados estão sendo copiados para um volume em blocos que foi clonado dele.
  • A clonagem entre namespaces não é suportada. A nova PVC e a PVC de origem devem estar no mesmo namespace.
  • Você não precisa especificar explicitamente uma classe de armazenamento para a nova PVC. Se você especificar explicitamente uma classe de armazenamento para a nova PVC, a classe de armazenamento especificada poderá ser diferente da classe de armazenamento especificada para a PVC de origem. Se você não especificar uma classe de armazenamento para a nova PVC, a classe de armazenamento padrão será usada.

Pré-requisitos para Clonar um Volume em Blocos Existente para Provisionar uma Nova PVC

Para provisionar uma nova reivindicação de volume persistente clonando o volume em blocos que já está provisionando uma reivindicação de volume persistente existente:

  • Os nós de plano de controle do cluster devem estar executando o Kubernetes versão 1.25 ou posterior.
  • Os nós de trabalho do cluster devem estar usando o processador AMD ou as formas de computação do processador baseado em Arm.
  • Os nós de trabalho do cluster devem estar executando o Oracle Linux 7 ou o Oracle Linux 8.
  • A PVC existente que você especifica como a origem de dados para a nova PVC deve:
    • Já esteja vinculado a um PV provisionado por um volume em blocos.
    • Tenha um estado de Disponível.
  • O novo volume em blocos deve ter o mesmo tamanho ou ser maior que o volume em blocos de origem do qual ele é clonado. Se você especificar um valor de armazenamento para a nova PVC que seja maior que o volume em blocos de origem, o novo volume em blocos será dimensionado de acordo. Não é possível especificar um valor de armazenamento para a nova PVC que seja menor que o volume em blocos que você deseja clonar ou menor que o valor de armazenamento da PVC de origem.
  • O tipo de sistema de arquivos especificado para o novo volume em blocos deve ser igual ao tipo de sistema de arquivos do volume em blocos de origem do qual ele é clonado (consulte Especificando Tipos de Sistema de Arquivos para Volumes em Blocos).

Clonando um Volume em Blocos Existente para Provisionar uma Nova PVC

Para provisionar uma nova reivindicação de volume persistente clonando o volume em blocos que já está provisionando uma reivindicação de volume persistente existente, especifique a reivindicação de volume persistente existente como dataSource da nova reivindicação de volume persistente.

Por exemplo, você define uma reivindicação de volume persistente chamada my-clone-pvc em um arquivo chamado csi-myclonepvc.yaml. A reivindicação de volume persistente my-clone-pvc é provisionada por um volume em blocos criado pela clonagem do volume em blocos que provisiona a reivindicação de volume persistente my-source-pvc:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-clone-pvc
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: custom-clone-storage-class
  resources:
    requests:
      storage: 50Gi
  dataSource:
    kind: PersistentVolumeClaim
    name: my-source-pvc

Crie a reivindicação de volume persistente:

kubectl create -f csi-myclonepvc.yaml

Você pode usar a reivindicação de volume persistente ao definir outros objetos, como pods. Por exemplo, a definição de pod a seguir instrui o sistema a usar a reivindicação de volume persistente my-clone-pvc como volume nginx, que é montado pelo pod em /sample-volume.

apiVersion: v1
kind: Pod
metadata:
  name: sample-pod
spec:
  containers:
    - name: sample-nginx
      image: nginx
      ports:
        - containerPort: 80
          name: "http-server"
      volumeMounts:
        - mountPath: "/usr/share/nginx/html"
          name: sample-volume
  volumes:
  - name: sample-volume
    persistentVolumeClaim:
      claimName: my-clone-pvc

Tendo criado o novo pod, a reivindicação de volume persistente my-clone-pvc é vinculada a um novo volume persistente provisionado por um volume em blocos que foi clonado do volume em blocos provisionando a reivindicação de volume persistente my-source-pvc.

Marcando Volumes em Blocos Clonados

Quando você usa o plug-in de volume CSI para provisionar um volume persistente clonando um volume em blocos provisionando outra reivindicação de volume persistente, as mesmas tags de formato livre e tags definidas que foram aplicadas ao volume em blocos de origem também são aplicadas ao novo volume em blocos. O plug-in de volume CSI não aplica tags adicionais ao novo volume em blocos.

Criando uma PVC com Base em um Volume em Blocos ou Backup Existente Usando o Plug-in de Volume FlexVolume

Você pode criar uma PVC com base em um volume em blocos existente ou em um backup de volume em blocos para uso pelo plug-in de volume FlexVolume. Por exemplo, se o administrador do cluster tiver criado um backup de volume em blocos para você usar ao provisionar uma nova reivindicação de volume persistente. Esse backup de volume em blocos pode vir com dados prontos para uso de outros objetos, como pods.

Você define uma PVC em um arquivo chamado flex-pvcfrombackup.yaml. Use o elemento de anotação volume.beta.kubernetes.io/oci-volume-source para especificar a origem do volume em blocos a ser usado ao provisionar uma nova reivindicação de volume persistente usando o plug-in de volume FlexVolume. Você pode especificar o OCID de um volume em blocos ou de um backup de volume em blocos como valor da anotação. Neste exemplo, você especifica o OCID do backup de volume em blocos criado pelo administrador do cluster. Por exemplo:

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: myvolume
  annotations:
    volume.beta.kubernetes.io/oci-volume-source: ocid1.volumebackup.oc1.iad.abuw...
spec:
  selector:
    matchLabels:
      topology.kubernetes.io/zone: US-ASHBURN-AD-1
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 50Gi

Observe que o arquivo flex-pvcfrombackup.yaml inclui o elemento matchLabels, que só se aplica no caso do plug-in de volume FlexVolume.

Digite o seguinte comando para criar a PVC com base no arquivo flex-pvcfrombackup.yaml:

kubectl create -f flex-pvcfrombackup.yaml

A saída do comando anterior confirma a criação da PVC:

persistentvolumeclaim "myvolume" created

Verifique se a PVC foi criada e vinculada a um novo volume persistente criado com base no backup de volume digitando:

kubectl get pvc

A saída do comando anterior mostra o status atual da PVC:

			
NAME           STATUS    VOLUME                               CAPACITY   ACCESSMODES   STORAGECLASS   AGE
myvolume       Bound     ocid1.volume.oc1.iad.<unique_ID>     50Gi       RWO           oci            4m

Você pode usar o novo volume persistente criado do backup de volume ao definir outros objetos, como pods. Por exemplo, a definição de pod a seguir instrui o sistema a usar a PVC myvolume como volume nginx, que é montado pelo pod em /data.

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
    - name: nginx
      image: nginx:latest
      ports:
        - name: http
          containerPort: 80
      volumeMounts:
        - name: data
          mountPath: /usr/share/nginx/html
  volumes:
    - name: data
      persistentVolumeClaim:
        claimName: myvolume

Depois de ter criado o novo pod, você poderá verificar se ele está sendo executado e usando a nova reivindicação de volume persistente digitando:

kubectl describe pod nginx
Observação

No exemplo FlexVolume deste tópico, a PVC solicita armazenamento em um domínio de disponibilidade na região Ashburn usando o label topology.kubernetes.io/zone. Para obter mais informações sobre como usar esse label (e as versões curtas dos nomes de domínio de disponibilidade a serem especificadas), consulte topology.kubernetes.io/zone.

Criptografando Dados em Repouso e Dados em Trânsito com o Serviço Block Volume

O serviço Oracle Cloud Infrastructure Block Volume sempre criptografa todos os volumes em blocos e backups de volume em armazenamento usando o algoritmo AES (Advanced Encryption Standard) com criptografia de 256 bits. Por padrão, todos os volumes e seus backups são criptografados usando as chaves de criptografia fornecidas pela Oracle. Cada vez que um volume é clonado ou restaurado de um backup, ele recebe uma nova chave de criptografia exclusiva.

Você tem a opção de criptografar todos os volumes e seus backups usando as chaves que possui e gerencia usando o serviço Vault. Para obter mais informações, consulte Key Management. Se você não configurar um volume para usar o serviço Vault ou posteriormente cancelar a designação de uma chave do volume, o serviço Block Volume usará a chave de criptografia fornecida pela Oracle. Isso se aplica à criptografia em repouso e em trânsito paravirtualizada.

Todos os dados em movimento entre a instância e o volume em blocos são transferidos por meio de uma rede interna altamente segura. Se você tiver requisitos de conformidade específicos relacionados à criptografia dos dados durante a movimentação entre a instância e o volume em blocos, o serviço Block Volume fornecerá a opção de ativar a criptografia em trânsito para anexos de volume paravirtualizados em instâncias de máquina virtual (VM). Algumas formas bare metal suportam criptografia em trânsito para os volumes em blocos anexados ao iSCSI da instância.

Para obter mais informações sobre criptografia de volume em blocos e suporte a criptografia em trânsito, consulte Criptografia de Volume em Blocos.

Quando as PVCs do Kubernetes são respaldadas pelo serviço Block Volume, você escolhe como os volumes em blocos são criptografados especificando:

  • A chave de criptografia mestra a ser usada, definindo a propriedade kms-key-id na definição da classe de armazenamento do Kubernetes. Você pode especificar o OCID de uma chave de criptografia principal no serviço Vault.
  • Como o volume em blocos é anexado à instância de computação, definindo a propriedade attachment-type na definição da classe de armazenamento do Kubernetes como iscsi ou paravirtualized.
  • Se a criptografia em trânsito está ativada para cada pool de nós em um cluster, definindo a propriedade isPvEncryptionInTransitEnabled do pool de nós (usando a CLI, a API ou a opção Usar criptografia em trânsito: do pool de nós na Console).

A interação das definições especificadas determina como os volumes em blocos são criptografados, conforme mostrado na tabela:

Propriedade isPvEncryptionInTransitEnabled do pool de nós definida como: Propriedade class kms-key-id de armazenamento definida como: Propriedade attachment-type da classe de armazenamento definida como Os dados são criptografados em armazenamento? Os dados são criptografados em trânsito? Observações
true OCID de uma chave no Vault paravirtualized Sim (chave gerenciada pelo usuário) Sim (chave gerenciada pelo usuário)
true OCID de uma chave no Vault iscsi Erro Erro O PV não pode ser provisionado porque a propriedade attachment-type deve ser definida como paravirtualized quando isPvEncryptionInTransitEnabled for definido como True.
true não definida paravirtualized Sim (chave gerenciada pela Oracle) Sim (chave gerenciada pela Oracle)
true não definida iscsi Erro Erro O PV não pode ser provisionado porque a propriedade attachment-type deve ser definida como paravirtualized quando isPvEncryptionInTransitEnabled for definido como True.
false OCID de uma chave no Vault paravirtualized Sim (chave gerenciada pelo usuário) No
false OCID de uma chave no Vault iscsi Sim (chave gerenciada pelo usuário) Número
false não definida paravirtualized Sim (chave gerenciada pela Oracle) Número
false não definida iscsi Sim (chave gerenciada pela Oracle) Número

Para poder criar um cluster para o qual você mesmo deseja gerenciar a chave de criptografia mestra, é necessário:

Para obter mais informações sobre rotação de chaves no serviço Vault, consulte Rotacionando uma Chave do Vault.

Exemplo: Configurando uma classe de armazenamento para ativar a criptografia em repouso e em trânsito usando a chave padrão gerenciada pela Oracle

Para provisionar uma PVC em um volume em blocos, usando uma chave de criptografia mestra gerenciada pela Oracle para criptografar dados em repouso (e opcionalmente em trânsito), defina uma classe de armazenamento e defina:

  • provisioner: a blockvolume.csi.oraclecloud.com
  • attachment-type a paravirtualized

Por exemplo:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: bv-encrypted-storage-class
provisioner: blockvolume.csi.oraclecloud.com
parameters:
  attachment-type: "paravirtualized"
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer

Em seguida, você pode criar uma PVC provisionada pela classe de armazenamento que você criou.

Após definir a classe de armazenamento e criar a PVC, defina a propriedade isPvEncryptionInTransitEnabled de cada pool de nós como true (usando a CLI, a API ou a opção Usar criptografia em trânsito: do pool de nós na Console). Observe que a criptografia de dados em trânsito só é suportada em algumas situações (consulte Criptografando Dados em Repouso e Dados em Trânsito com o Serviço Block Volume).

Exemplo: Configurando uma classe de armazenamento para ativar a criptografia em repouso e em trânsito usando uma chave que você gerencia

Para provisionar uma PVC em um volume em blocos, usando uma chave de criptografia mestra gerenciada por você para criptografar dados em repouso (e opcionalmente em trânsito), você precisa:

Tendo criado uma chave e uma política de criptografia mestra adequadas, defina uma classe de armazenamento e defina:

  • provisioner: a blockvolume.csi.oraclecloud.com
  • attachment-type a paravirtualized
  • kms-key-id para o OCID da chave de criptografia principal no serviço Vault que você deseja usar para criptografar dados

Por exemplo:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: bv-user-encrypted-storage-class
provisioner: blockvolume.csi.oraclecloud.com
parameters:
  attachment-type: "paravirtualized"
  kms-key-id: "ocid1.key.oc1.iad.anntl______usjh"
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer

Em seguida, você pode criar uma PVC provisionada pela classe de armazenamento que você criou.

Após definir a classe de armazenamento e criar a PVC, defina a propriedade isPvEncryptionInTransitEnabled de cada pool de nós como true (usando a CLI, a API ou a opção Usar criptografia em trânsito: do pool de nós na Console). Observe que a criptografia de dados em trânsito só é suportada em algumas situações (consulte Criptografando Dados em Repouso e Dados em Trânsito com o Serviço Block Volume).

Expandindo um Volume em Blocos

Quando uma PVC é criada usando o plug-in de volume CSI (provisioner: blockvolume.csi.oraclecloud.com), você pode expandir o tamanho do volume on-line. Ao fazer isso, você torna possível implantar inicialmente aplicativos com uma certa quantidade de armazenamento e, em seguida, aumentar o armazenamento disponível sem qualquer tempo de inatividade.

Se você quiser suportar aumentos de solicitação de armazenamento, defina allowVolumeExpansion: true na definição da classe de armazenamento especificada para a PVC. Por exemplo:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: my-bv
provisioner: blockvolume.csi.oraclecloud.com
parameters:
  attachment-type: "paravirtualized"
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true

A classe de armazenamento oci-bv padrão para o plug-in de volume CSI tem allowVolumeExpansion: true por padrão.

Para expandir o tamanho de um volume, edite o manifesto de PVC e atualize o tamanho do volume e aplique o manifesto. Quando o disco for submetido a nova verificação para permitir que o sistema operacional identifique o tamanho do volume expandido (o que pode levar alguns minutos), o armazenamento aumentado ficará automaticamente disponível para pods usando a PVC. Os pods não precisam ser reiniciados.

Digite o seguinte comando para confirmar se a PVC foi vinculada a um volume em blocos recém-alargado:

kubectl get pvc <pvc_name> -o yaml

Observe o seguinte:

  • A expansão de volume é suportada em clusters que executam o Kubernetes 1.19 ou posterior.
  • A classe de armazenamento oci-bv padrão para o plug-in de volume CSI é configurada com allowVolumeExpansion: true em clusters que executam o Kubernetes 1.19 ou posterior. As definições de classes de armazenamento oci-bv em clusters existentes que executam o Kubernetes 1.19 ou posterior são editadas automaticamente para definir allowVolumeExpansion: true.
  • Não é possível reduzir o tamanho de um volume em blocos. Você só pode especificar um valor maior que o tamanho atual do volume em blocos. Se você atualizar um manifesto de PVC para solicitar menos armazenamento do que o solicitado anteriormente, a solicitação de armazenamento falhará.
  • Para obter mais informações sobre como aumentar os tamanhos do volume em blocos no serviço Block Volume, consulte Redimensionando um Volume. Em particular, observe a recomendação de criar um backup antes de redimensionar um volume em blocos.

Exemplo: Configurando uma classe de armazenamento para ativar a expansão do volume em blocos

Edite o manifesto de uma PVC provisionada pela classe de armazenamento oci-bv e inclua uma solicitação de armazenamento. Por exemplo, você pode definir inicialmente storage: 100Gi para solicitar 100 GB de armazenamento para a PVC, em um arquivo chamado csi-bvs-PVC-exp.yaml:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
 name: my-pvc
spec:
 storageClassName: oci-bv
 resources:
  requests:
    storage: 100Gi
 volumeName: pvc-bv1

Digite o seguinte comando para criar a PVC com base no arquivo csi-bvs-PVC-exp.yaml:

kubectl apply -f csi-bvs-pvc-exp.yaml

Posteriormente, você pode achar que precisa aumentar a quantidade de armazenamento disponível para a PVC. Por exemplo, você pode alterar o manifesto e definir storage: 200Gi:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
 name: my-pvc
spec:
 storageClassName: oci-bv
 resources:
  requests:
    storage: 200Gi
 volumeName: pvc-bv1

Depois de aplicar o manifesto, o PV que provisiona o PVC é aumentado para 200 GB. A atualização do manifesto aciona o serviço Block Volume para aumentar o tamanho do volume em blocos existente para 200 GB. Quando o disco é verificado novamente (o que pode levar alguns minutos), o armazenamento aumentado fica automaticamente disponível para pods usando o PVC.

Especificando o Desempenho do Serviço Block Volume

Os volumes em blocos no serviço Block Volume podem ser configurados para diferentes níveis de desempenho, de acordo com os requisitos esperados de E/S da carga de trabalho. O desempenho do volume em blocos é expresso em unidades de desempenho de volumes (VPUs). Vários níveis de desempenho estão disponíveis, incluindo:

  • Menor Custo (0 VPUs)
  • Balanceado (10 VPUs)
  • Melhor Desempenho (20 VPUs)
  • Altíssimo Desempenho (entre 30 VPUs e 120 VPUs)

Por padrão, os volumes em blocos são configurados para o nível de desempenho Balanceado (10 VPUs). Para obter mais informações sobre os diferentes níveis de desempenho do volume em blocos, consulte Níveis de Desempenho do Volume em Blocos.

Ao definir uma PVC usando o plug-in de volume CSI (provisioner: blockvolume.csi.oraclecloud.com), você pode especificar outro nível de desempenho de volume em blocos na definição de classe de armazenamento apropriada para a carga de trabalho esperada.

Observe que não é possível alterar subsequentemente o nível de desempenho de um volume em blocos que oferece suporte a uma PVC. Em vez disso, você precisa definir uma nova classe de armazenamento, definir o nível de desempenho conforme necessário e criar uma nova PVC provisionada por essa nova classe de armazenamento.

Criando PVCs com níveis de desempenho de custo reduzido (0 VPUs), balanceado (10 VPUs) e alto desempenho (20 VPUs)

Para criar uma PVC suportada por um volume em blocos com um nível de desempenho de Menor Custo, Balanceado ou Melhor Desempenho, defina vpusPerGB na definição da classe de armazenamento da seguinte forma:

  • para um nível de desempenho de Menor Custo, defina vpusPerGB: "0"
  • para um nível de desempenho Balanceado, defina vpusPerGB: "10"
  • para um nível de desempenho Melhor Desempenho, defina vpusPerGB: "20"

Por exemplo:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: oci-high
provisioner: blockvolume.csi.oraclecloud.com
parameters:
  vpusPerGB: "20"
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true

O valor de vpusPerGB deve ser "0", "10" ou "20". Outros valores não são suportados.

Crie um manifesto para uma PVC provisionada pela classe de armazenamento oci-high e inclua uma solicitação de armazenamento. Por exemplo, em um arquivo chamado csi-bvs-pvc-perf.yaml:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: oci-pvc-high
spec:
  storageClassName: oci-high
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi

Digite o seguinte comando para criar a PVC com base no arquivo csi-bvs-PVC-perf.yaml:

kubectl apply -f csi-bvs-pvc-perf.yaml

Depois de criar a PVC, você pode usá-la ao criar outros objetos, como pods. Por exemplo, você pode criar um novo pod com base na seguinte definição de pod, que instrui o sistema a usar a PVC oci-pvc-high:

apiVersion: v1
kind: Pod
metadata:
  name: pod-high
spec:
  containers:
    - name: app
      image: busybox:latest
      command: ["/bin/sh"]
      args: ["-c", "while true; do echo $(date -u) >> /data/out.txt; sleep 5; done"]
      volumeMounts:
        - name: persistent-storage
          mountPath: /data
  volumes:
    - name: persistent-storage
      persistentVolumeClaim:
        claimName: oci-pvc-high

Quando você cria o pod, um novo volume em blocos é criado no serviço Block Volume para fazer backup da PVC. O novo volume em blocos tem o nível de desempenho especificado na definição da classe de armazenamento oci-high.

Criando PVCs com níveis de Desempenho Ultra-Alto (30 a 120 VPUs)

Para criar uma PVC suportada por um volume em blocos com um nível Altíssimo Desempenho, você precisa concluir várias etapas. As etapas são descritas em detalhes nesta seção, mas, em resumo, você precisa:

  • Crie um pool de nós com nós de trabalho de uma forma suportada.
  • Se estiver anexando um volume em blocos a instâncias de computação como um anexo iSCSI, instale e ative o plug-in Gerenciamento de Volume em Blocos nas instâncias que hospedam os nós de trabalho.
  • Crie uma definição de classe de armazenamento e defina vpusPerGB na definição de classe de armazenamento para um valor entre 30 e 120.
  • Crie uma PVC provisionada pela classe de armazenamento e inclua uma solicitação de armazenamento.

Depois de criar uma PVC adequada, você pode definir um pod que use um volume em blocos Altíssimo Desempenho e programar o pod em um nó que suporte volumes em blocos Altíssimo Desempenho.

Para oferecer características de Altíssimo Desempenho, os volumes em blocos Altíssimo Desempenho devem ser anexados a instâncias de computação que hospedam nós de trabalho usando um anexo ativado para multipath. No entanto, somente o primeiro volume em blocos Altíssimo Desempenho anexado a uma instância é anexado a um anexo ativado para multipath. Como resultado, somente o primeiro volume em blocos Altíssimo Desempenho anexado a uma instância tem características Altíssimo Desempenho.

Se você pretende usar mais de um volume em blocos Altíssimo Desempenho em um cluster, crie o mesmo número de nós que suportam volumes em blocos Altíssimo Desempenho, pois há volumes em blocos Altíssimo Desempenho.

Para criar uma PVC suportada por um volume em blocos com um nível Altíssimo Desempenho:

  1. Siga as instruções para criar um pool de nós (consulte Criando um Pool de Nós) e especifique o seguinte:
    1. Especifique uma forma Bare Metal (BM) ou de Máquina Virtual (VM) suportada pelo Kubernetes Engine e que também suporte o nível Altíssimo Desempenho.

      Observe que os volumes em blocos Altíssimo Desempenho exigem formas que suportem anexos ativados para multipath. Observe também que, se você quiser anexar o volume em blocos às instâncias de computação que hospedam nós de trabalho no pool de nós como um anexo paravirtualizado, o VM.Standard.E4. A forma flexível é a única forma suportada.

      Consulte:

    2. Especifique um label a ser adicionado a todos os nós de trabalho no pool de nós para indicar que os nós de trabalho suportam o nível Altíssimo Desempenho. Por exemplo, uhp: supported
  2. Se você quiser anexar um volume em blocos Altíssimo Desempenho às instâncias de computação que hospedam nós de trabalho no pool de nós como um anexo iSCSI, instale e ative o plug-in de Gerenciamento de Volume em Blocos nas instâncias.

    Há diferentes maneiras de instalar e ativar o plug-in de Gerenciamento de Volume em Blocos, como usar a Console ou a CLI. Como alternativa, você pode instalar e ativar o plug-in Gerenciamento de Volume em Blocos especificando um script cloud-init personalizado semelhante ao seguinte:

    #!/bin/bash
    curl --fail -H "Authorization: Bearer Oracle" -L0 http://169.254.169.254/opc/v2/instance/metadata/oke_init_script | base64 --decode >/var/run/oke-init.sh
    bash /var/run/oke-init.sh
    
    echo "Installing oci cli package"
    
    sudo yum install -y python36-oci-cli
    echo "Completed oci cli package"
    
    instance_id=$(curl -H "Authorization: Bearer Oracle" -L http://169.254.169.254/opc/v2/instance/id)
    
    echo "Instance Id : $instance_id"
    
    echo "Updating compute instance agent config."
    
    oci compute instance update --instance-id $instance_id --force --agent-config '{
        "is-agent-disabled": false,
        "plugins-config": [
            {"name": "Block Volume Management", "desiredState": "ENABLED" }
        ]
    }' --auth instance_principal
    
    echo "Update completed for instance agent config."
    

    Observe o seguinte ao instalar e ativar o plug-in de Gerenciamento de Volume em Blocos:

    • O plug-in de Gerenciamento de Volume em Blocos deve ser capaz de estabelecer conexão com os serviços Oracle, seja porque a instância de computação tem um endereço IP público ou porque a VCN tem um gateway de serviço.
    • As permissões devem ser configuradas para permitir que o plug-in de Gerenciamento de Volume em Blocos relate os resultados da configuração iSCSI para anexos iSCSI ativados para multipath.

    Para obter mais informações:

  3. Crie uma definição de classe de armazenamento para volumes em blocos com um nível de desempenho Altíssimo Desempenho e defina vpusPerGB na definição de classe de armazenamento com um valor entre 30 e 120.

    Por exemplo:

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: oci-uhp-sc
    provisioner: blockvolume.csi.oraclecloud.com
    parameters:
      vpusPerGB: "30"
      attachment-type: "iscsi"
    reclaimPolicy: Delete
    volumeBindingMode: WaitForFirstConsumer
    allowVolumeExpansion: true
  4. Crie uma PVC provisionada pela classe de armazenamento que você acabou de criar e inclua uma solicitação de armazenamento, da seguinte forma:

    1. Crie um manifesto para a PVC.

      Por exemplo, em um arquivo chamado csi-bvs-pvc-uhp.yaml:

      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
        name: uhp-claim
      spec:
        storageClassName: "oci-uhp-sc"
        accessModes:
          - ReadWriteOnce
        resources:
          requests:
            storage: 50Gi
    2. Crie a PVC com base no arquivo de manifesto.

      Por exemplo, informando:

      kubectl apply -f csi-bvs-pvc-uhp.yaml

Depois de criar a PVC, você pode usá-la ao criar outros objetos, como pods. Por exemplo, você pode criar um novo pod com base na seguinte definição de pod:

apiVersion: v1
kind: Pod
metadata:
  name: pod-uhp
  labels:
    uhp-pod: "true"
spec:
  affinity:
    podAntiAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: uhp-pod
            operator: In
            values:
            - "true"
        topologyKey: kubernetes.io/hostname
  containers:
    - name: app
      image: iad.ocir.io/odx-oke/oke-public/busybox:latest
      command: ["/bin/sh"]
      args: ["-c", "while true; do echo $(date -u) >> /data/out.txt; sleep 5; done"]
      volumeMounts:
        - name: persistent-storage
          mountPath: /data
  volumes:
    - name: persistent-storage
      persistentVolumeClaim:
        claimName: uhp-claim
  nodeSelector:
    uhp: supported

Neste exemplo, você especificou:

  • Um rótulo para o pod indicar que ele usa um volume em blocos Altíssimo Desempenho. Neste exemplo, uhp-pod: "true"
  • Uma regra de antiafinidade que usa o rótulo do pod para garantir que apenas um pod use o volume em blocos Altíssimo Desempenho seja executado em qualquer nó de trabalho.
  • Um seletor de nós, de modo que o pod só seja executado em nós de trabalho com um label específico (derivado do label do pool de nós). Neste exemplo, uhp: supported
  • Uma PVC suportada por um volume em blocos Altíssimo Desempenho. Neste exemplo, claimName: uhp-claim

Quando você cria um pod com base na definição, o pod é executado em um nó de trabalho hospedado em uma instância que tem uma forma adequada para o nível de desempenho Altíssimo Desempenho. Um novo volume em blocos é criado no serviço Block Volume para fazer backup da PVC. O novo volume em blocos tem o nível de desempenho Altíssimo Desempenho especificado na definição da classe de armazenamento.

Especificando Tipos de Sistema de Arquivos para Volumes em Blocos

Os volumes em blocos no serviço Block Volume podem ser configurados para diferentes tipos de sistema de arquivos. O sistema de arquivos mais apropriado a ser usado depende (entre outras coisas) do tamanho de arquivo esperado e do número de arquivos a serem processados. Vários tipos de sistema de arquivos estão disponíveis, incluindo:

  • ext3: O tipo de sistema de arquivos ext3 inclui recursos de diário para melhorar a confiabilidade e a disponibilidade. Verificações de consistência após uma falha de energia ou um desligamento descontrolado do sistema são desnecessárias.
  • ext4: Além dos recursos ext3, o tipo de sistema de arquivos ext4 suporta extensões (blocos físicos contíguos), pré-alocação, alocação atrasada, verificação mais rápida do sistema de arquivos, registro em diário mais robusto e outros aprimoramentos.
  • XFS: O sistema de arquivos XFS é um tipo de sistema de arquivos de registro em diário de alto desempenho, que fornece alta escalabilidade para threads de E/S, largura de banda do sistema de arquivos, tamanho do arquivo e do sistema de arquivos, mesmo quando o sistema de arquivos abrange muitos dispositivos de armazenamento.

Os sistemas de arquivos ext3 e ext4 são geralmente considerados mais adequados para aplicativos que usam um único thread de leitura/gravação e arquivos pequenos. Considerando que, o sistema de arquivos XFS é geralmente considerado mais adequado para aplicativos que têm vários threads de leitura/gravação e arquivos maiores.

Quando uma PVC é criada usando o plug-in de volume CSI (provisioner: blockvolume.csi.oraclecloud.com), você pode especificar um tipo de sistema de arquivos para o volume em blocos apropriado para a carga de trabalho esperada.

Observação

Os volumes em blocos são configurados com um sistema de arquivos ext4 por padrão. Se um sistema de arquivos ext4 for apropriado para a carga de trabalho esperada, você não precisará especificar explicitamente o tipo de sistema de arquivos na definição da classe de armazenamento, conforme descrito no restante deste tópico.

Por padrão, os volumes em blocos são configurados com um sistema de arquivos ext4. Se o sistema de arquivos ext4 não for o sistema de arquivos mais apropriado para a carga de trabalho esperada, você poderá especificar um tipo de sistema de arquivos alternativo na definição da classe de armazenamento.

Para criar uma PVC suportada por um volume em blocos com um sistema de arquivos ext3 ou XFS, defina o parâmetro fstype na definição da classe de armazenamento personalizada da seguinte forma:

  • para ext3, defina csi.storage.k8s.io/fstype: ext3
  • para XFS, defina csi.storage.k8s.io/fstype: xfs

Por exemplo, para criar uma PVC suportada por um volume em blocos com um sistema de arquivos ext3:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: oci-bv-ext3
provisioner: blockvolume.csi.oraclecloud.com
parameters:
  csi.storage.k8s.io/fstype: ext3
reclaimPolicy: Retain
allowVolumeExpansion: true
volumeBindingMode: WaitForConsumer

Crie um manifesto para uma PVC provisionada pela classe de armazenamento oci-bv-ext3 e inclua uma solicitação de armazenamento. Por exemplo, em um arquivo chamado csi-bvs-pvc-fstype.yaml:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: oci-bv-claim-ext3
spec:
  storageClassName: oci-bv-ext3
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 50Gi

Digite o seguinte comando para criar a PVC com base no arquivo csi-bvs-PVC-fstype.yaml:

kubectl apply -f csi-bvs-pvc-fstype.yaml

Depois de criar a PVC, você pode usá-la ao criar outros objetos, como pods. Por exemplo, você pode criar um novo pod com base na definição de pod a seguir, que instrui o sistema a usar a PVC oci-bv-claim-ext3 como volume nginx, que é montado pelo pod em /data.

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
    - name: nginx
      image: nginx:latest
      ports:
        - name: http
          containerPort: 80
      volumeMounts:
        - name: data
          mountPath: /usr/share/nginx/html
  volumes:
    - name: data
      persistentVolumeClaim:
        claimName: oci-bv-claim-ext3

Depois de ter criado o novo pod, você poderá verificar se a PVC foi vinculada a um novo volume persistente digitando:

kubectl get pvc

A saída do comando anterior confirma que a PVC foi vinculada:

			
NAME                    STATUS    VOLUME                               CAPACITY   ACCESSMODES   STORAGECLASS        AGE
oci-bv-claim-ext3       Bound     ocid1.volume.oc1.iad.<unique_ID>     50Gi       RWO           oci-bv-ext3         4m

Você pode verificar se o pod está usando a nova reivindicação de volume persistente digitando:

kubectl describe pod nginx

Observe que não é possível alterar subsequentemente o sistema de arquivos de um volume em blocos que suporta uma PVC. Em vez disso, você precisa definir uma nova classe de armazenamento, definir o sistema de arquivos conforme necessário e criar uma nova PVC provisionada por essa nova classe de armazenamento.