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 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 o comando
gcloud components updatepara obter a versão mais recente. As versões anteriores da CLI gcloud podem não suportar a execução dos comandos neste documento.
- 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_SIZESubstitua 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 seu 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_PATHSubstitua
FILE_PATHpelo 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 discos persistentes 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_INDEXSubstitua 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, use0e1.
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_TYPESubstitua 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_PATHSubstitua
FILE_PATHpelo 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: 100GiSubstitua 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_PATHSubstitua
FILE_PATHpelo caminho para o ficheiro YAML.