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.
- 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.
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 armazenamentooci-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 armazenamentooci
é usada pelo plug-in de volume FlexVolume.
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:
- 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"}}}'
- 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 objetoVolumeSnapshotClass
. 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.
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 objetosVolumeSnapshot
.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. Especifiqueincremental
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 objetoVolumeSnapshot
associado for excluído. EspecifiqueRetain
para manter um backup de volume em blocos se o objetoVolumeSnapshot
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
volumeSnapshotClassName: my-snapclass
especificamy-snapclass
como o objetoVolumeSnapshotClass
do qual obter parâmetros a serem usados ao criar o backup de volume em blocos. Observe que você não pode alterarvolumeSnapshotClassName
depois de criar o objetoVolumeSnapshot
(você precisa criar um novo objetoVolumeSnapshot
).persistentVolumeClaimName: sample-pvc
especificasample-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 objetoVolumeSnapshot
(você precisa criar um novo objetoVolumeSnapshot
).
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
deletionPolicy: Retain
especifica o que acontece com um backup de volume em blocos se o objetoVolumeSnapshot
associado for excluído. EspecifiqueDelete
para excluir um backup de volume em blocos se o objetoVolumeSnapshot
associado for excluído.driver: blockvolume.csi.oraclecloud.com
especifica o uso do plug-in de volume CSI para provisionar objetosVolumeSnapshot
.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 objetoVolumeSnapshot
correspondente a ser provisionado com base no backup de volume em blocos existente. Esse campo é obrigatório. Observe que o objetoVolumeSnapshot
não precisa existir quando você cria o objetoVolumeSnapshotContent
.namespace: default
especifica o namespace que contém o objetoVolumeSnapshot
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 objetoVolumeSnapshot
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
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 comoiscsi
ouparavirtualized
. - 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:
- Crie uma chave principal de criptografia adequada no Vault (ou obtenha o OCID dessa chave). Consulte Gerenciando Chaves.
- Crie uma política que conceda acesso à chave de criptografia principal. Consulte Criar Política para Acessar Chaves de Criptografia Gerenciadas pelo Usuário para Criptografar Volumes de Inicialização, Volumes em Blocos e/ou Sistemas de Arquivos.
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:
ablockvolume.csi.oraclecloud.com
-
attachment-type
aparavirtualized
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:
- Crie uma chave principal de criptografia adequada no Vault (ou obtenha o OCID dessa chave). Consulte Gerenciando Chaves.
- Crie uma política que conceda acesso à chave de criptografia principal. Consulte Criar Política para Acessar Chaves de Criptografia Gerenciadas pelo Usuário para Criptografar Volumes de Inicialização, Volumes em Blocos e/ou Sistemas de Arquivos.
Tendo criado uma chave e uma política de criptografia mestra adequadas, defina uma classe de armazenamento e defina:
provisioner:
ablockvolume.csi.oraclecloud.com
attachment-type
aparavirtualized
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 comallowVolumeExpansion: true
em clusters que executam o Kubernetes 1.19 ou posterior. As definições de classes de armazenamentooci-bv
em clusters existentes que executam o Kubernetes 1.19 ou posterior são editadas automaticamente para definirallowVolumeExpansion: 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:
- Siga as instruções para criar um pool de nós (consulte Criando um Pool de Nós) e especifique o seguinte:
- 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:
- Formas Suportadas para Nós Gerenciados e Nós Virtuais para as formas suportadas pelo Kubernetes Engine
- Detalhes de Desempenho das Formas de Instância para as formas que suportam o nível Altíssimo Desempenho.
- 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
- 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.
- 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:
- Sobre o plug-in de Gerenciamento de Serviço Block Volume, consulte Ativando o Plug-in de Gerenciamento de Serviço Block Volume.
- Sobre a gravação de scripts cloud-init personalizados, consulte Usando Scripts de Inicialização Cloud-init Personalizados para Configurar Nós Gerenciados.
- 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
-
Crie uma PVC provisionada pela classe de armazenamento que você acabou de criar e inclua uma solicitação de armazenamento, da seguinte forma:
-
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
- 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.
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.