Esta página explica como criar um PersistentVolume usando discos persistentes existentes preenchidos com dados e como usar o PersistentVolume num Pod.
Vista geral
Existem dois cenários comuns que usam um disco persistente pré-existente.
- Criar manualmente uma PersistentVolumeClaim e um PersistentVolume, associá-los e referir-se à PersistentVolumeClaim numa especificação de Pod.
- Use um StatefulSet para gerar automaticamente PersistentVolumeClaims que estão associados a PersistentVolumes gerados manualmente correspondentes a uma série de discos persistentes pré-existentes.
Os exemplos nesta página usam discos persistentes do Compute Engine existentes.
Embora o ext4
seja o tipo de sistema de ficheiros predefinido, pode usar um disco persistente pré-existente com o sistema de ficheiros xfs
, desde que a imagem do nó o suporte. Para usar um disco xfs
, altere spec.csi.fsType
para xfs
no manifesto PersistentVolume.
O Windows não suporta o tipo de sistema de ficheiros ext4
. Tem de usar o sistema de ficheiros NTFS
para pools de nós do Windows Server.
Para usar um disco NTFS
, altere spec.csi.fsType
para NTFS
no manifesto PersistentVolume.
Antes de começar
Antes de começar, certifique-se de que realizou as seguintes tarefas:
- Ative a API Google Kubernetes Engine. Ative a API Google Kubernetes Engine
- Se quiser usar a CLI gcloud para esta tarefa,
instale-a e, em seguida,
inicialize-a. Se instalou anteriormente a CLI gcloud, execute
gcloud components update
para obter a versão mais recente.
- Certifique-se de que tem discos persistentes existentes. Para aprovisionar um disco, consulte o artigo Aprovisionar discos persistentes regionais.
- Certifique-se de que o cluster usa o controlador CSI do disco persistente do Compute Engine.
Usando uma PersistentVolumeClaim associada ao PersistentVolume
Para que um contentor aceda ao seu disco persistente pré-existente, tem de fazer o seguinte:
- Aprovisione o disco persistente existente como um PersistentVolume.
- Associe o PersistentVolume a um PersistentVolumeClaim.
- Dê aos contentores no Pod acesso ao PersistentVolume.
Crie o PersistentVolume e o PersistentVolumeClaim
Existem várias formas de associar um PersistentVolumeClaim a um PersistentVolume específico. Por exemplo, o manifesto YAML seguinte cria um novo PersistentVolume e PersistentVolumeClaim e, em seguida, associa o volume à reivindicação através do claimRef
definido no PersistentVolume.
Para associar um PersistentVolume a um PersistentVolumeClaim, o
storageClassName
dos dois recursos tem de corresponder, bem como capacity
,
accessModes
e volumeMode
. Pode omitir o elemento storageClassName
, mas
tem de especificar o elemento ""
para impedir que o Kubernetes use a StorageClass predefinida.
O storageClassName
não tem de se referir a um objeto StorageClass existente. Se só precisar de associar a reivindicação a um volume, pode usar qualquer nome que quiser. No entanto, se precisar de funcionalidades adicionais configuradas por uma StorageClass, como a alteração do tamanho do volume, o storageClassName
tem de fazer referência a um objeto StorageClass existente.
Para mais detalhes, consulte a documentação do Kubernetes sobre PersistentVolumes.
Guarde o seguinte manifesto YAML:
apiVersion: v1 kind: PersistentVolume metadata: name: PV_NAME spec: storageClassName: "STORAGE_CLASS_NAME" capacity: storage: DISK_SIZE accessModes: - ReadWriteOnce claimRef: name: PV_CLAIM_NAME namespace: default csi: driver: pd.csi.storage.gke.io volumeHandle: DISK_ID fsType: FS_TYPE --- apiVersion: v1 kind: PersistentVolumeClaim metadata: namespace: default name: PV_CLAIM_NAME spec: storageClassName: "STORAGE_CLASS_NAME" accessModes: - ReadWriteOnce resources: requests: storage: DISK_SIZE
Substitua o seguinte:
PV_NAME
: o nome do seu novo PersistentVolume.STORAGE_CLASS_NAME
: o nome da nova StorageClass.DISK_SIZE
: o tamanho do disco persistente pré-existente. Por exemplo,500G
.PV_CLAIM_NAME
: o nome do novo PersistentVolumeClaim.DISK_ID
: o identificador do disco persistente preexistente. O formato éprojects/{project_id}/zones/{zone_name}/disks/{disk_name}
para discos persistentes zonais ouprojects/{project_id}/regions/{region_name}/disks/{disk_name}
para discos persistentes regionais.FS_TYPE
: o tipo de sistema de ficheiros. Pode deixar esta opção como predefinição (ext4
) ou usarxfs
. Se os seus clusters usarem um conjunto de nós do Windows Server, tem de alterar esta opção paraNTFS
.
Para aplicar a configuração e criar os recursos PersistentVolume e PersistentVolumeClaim, execute o seguinte comando:
kubectl apply -f FILE_PATH
Substitua
FILE_PATH
pelo caminho para o ficheiro YAML.
Use o PersistentVolume num Pod
Depois de criar e associar o PersistentVolume e o PersistentVolumeClaim, pode dar aos contentores de um pod acesso ao volume especificando valores no campo volumeMounts
.
A seguinte configuração YAML cria um novo pod e um contentor que executa uma imagem nginx
e, em seguida, monta o PersistentVolume no pod:
kind: Pod
apiVersion: v1
metadata:
name: POD_NAME
spec:
volumes:
- name: VOLUME_NAME
persistentVolumeClaim:
claimName: PV_CLAIM_NAME
containers:
- name: CONTAINER_NAME
image: nginx
ports:
- containerPort: 80
name: "http-server"
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: VOLUME_NAME
Substitua o seguinte:
POD_NAME
: o nome do novo Pod.VOLUME_NAME
: o nome do volume.PV_CLAIM_NAME
: o nome do PersistentVolumeClaim que criou no passo anterior.CONTAINER_NAME
: o nome do novo contentor.
Aplique a configuração:
kubectl apply -f FILE_PATH
Substitua FILE_PATH
pelo caminho para o ficheiro YAML.
Para verificar se o volume foi montado, execute o seguinte comando:
kubectl describe pods POD_NAME
Na saída, verifique se o PersistentVolumeClaim foi montado:
...
Volumes:
VOLUME_NAME:
Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
ClaimName: PV_CLAIM_NAME
ReadOnly: false
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 29s default-scheduler Successfully assigned default/POD_NAME to gke-cluster-1-default-pool-d5cde866-o4g4
Normal SuccessfulAttachVolume 21s attachdetach-controller AttachVolume.Attach succeeded for volume "PV_NAME"
Normal Pulling 19s kubelet Pulling image "nginx"
Normal Pulled 19s kubelet Successfully pulled image "nginx"
Normal Created 18s kubelet Created container CONTAINER_NAME
Normal Started 18s kubelet Started container CONTAINER_NAME
Usar um disco pré-existente num StatefulSet
Pode usar Persistent Disks do Compute Engine pré-existentes num StatefulSet através de PersistentVolumes. O StatefulSet gera automaticamente um PersistentVolumeClaim para cada réplica. Pode prever os nomes dos PersistentVolumeClaims gerados e associá-los aos PersistentVolumes através de claimRef
.
No exemplo seguinte, vai usar dois discos persistentes preexistentes, criar PersistentVolumes para usar os discos e, em seguida, montar os volumes num StatefulSet com duas réplicas no espaço de nomes predefinido.
- Decida um nome para o novo StatefulSet, um nome para o modelo PersistentVolumeClaim e o número de réplicas no StatefulSet.
Determinar os nomes dos PersistentVolumeClaims gerados automaticamente. O StatefulSet usa o seguinte formato para os nomes PersistentVolumeClaim:
PVC_TEMPLATE_NAME-STATEFULSET_NAME-REPLICA_INDEX
Substitua o seguinte:
PVC_TEMPLATE_NAME
: o nome do novo modelo PersistentVolumeClaim.STATEFULSET_NAME
: o nome do seu novo StatefulSet.REPLICA_INDEX
: o índice da réplica do StatefulSet. Para este exemplo, use0
e1
.
Crie os PersistentVolumes. Tem de criar um PersistentVolume para cada réplica no StatefulSet.
Guarde o seguinte manifesto YAML:
apiVersion: v1 kind: PersistentVolume metadata: name: pv-ss-demo-0 spec: storageClassName: "STORAGE_CLASS_NAME" capacity: storage: DISK1_SIZE accessModes: - ReadWriteOnce claimRef: namespace: default name: PVC_TEMPLATE_NAME-STATEFULSET_NAME-0 csi: driver: pd.csi.storage.gke.io volumeHandle: DISK1_ID fsType: FS_TYPE --- apiVersion: v1 kind: PersistentVolume metadata: name: pv-ss-demo-1 spec: storageClassName: "STORAGE_CLASS_NAME" capacity: storage: DISK2_SIZE accessModes: - ReadWriteOnce claimRef: namespace: default name: PVC_TEMPLATE_NAME-STATEFULSET_NAME-1 csi: driver: pd.csi.storage.gke.io volumeHandle: DISK2_ID fsType: FS_TYPE
Substitua o seguinte:
DISK1_SIZE and DISK2_SIZE
: os tamanhos dos seus discos persistentes preexistentes.DISK1_ID and DISK2_ID
: os identificadores dos seus discos persistentes pré-existentes.PVC_TEMPLATE_NAME-STATEFULSET_NAME-0 and PVC_TEMPLATE_NAME-STATEFULSET_NAME-1
: os nomes dos PersistentVolumeClaims gerados automaticamente no formato definido no passo anterior.STORAGE_CLASS_NAME
: o nome da sua StorageClass.
Aplique a configuração:
kubectl apply -f FILE_PATH
Substitua
FILE_PATH
pelo caminho para o ficheiro YAML.
Crie um StatefulSet com os valores que escolheu no passo 1. Certifique-se de que o armazenamento especificado no
volumeClaimTemplates
é inferior ou igual à capacidade total dos seus PersistentVolumes.Guarde o seguinte manifesto YAML:
apiVersion: apps/v1 kind: StatefulSet metadata: name: STATEFULSET_NAME spec: selector: matchLabels: app: nginx serviceName: "nginx" replicas: 2 template: metadata: labels: app: nginx spec: terminationGracePeriodSeconds: 10 containers: - name: nginx image: registry.k8s.io/nginx-slim:0.8 ports: - containerPort: 80 name: web volumeMounts: - name: PVC_TEMPLATE_NAME mountPath: /usr/share/nginx/html volumeClaimTemplates: - metadata: name: PVC_TEMPLATE_NAME spec: accessModes: [ "ReadWriteOnce" ] storageClassName: "STORAGE_CLASS_NAME" resources: requests: storage: 100Gi
Substitua o seguinte:
STATEFULSET_NAME
: o nome do seu novo StatefulSet.PVC_TEMPLATE_NAME
: o nome do novo modelo PersistentVolumeClaim.STORAGE_CLASS_NAME
: o nome da sua StorageClass.
Aplique a configuração:
kubectl apply -f FILE_PATH
Substitua
FILE_PATH
pelo caminho para o ficheiro YAML.