Nesta página, explicamos como criar um PersistentVolume usando discos permanentes atuais preenchidos com dados e como usar o PersistentVolume em um pod.
Visão geral
Há dois cenários comuns que usam um disco permanente preexistente.
- Criar manualmente de um PersistentVolumeClaim e um PersistentVolume, vinculando-os e referindo-se ao PersistentVolumeClaim em uma especificação de pod.
- Usar um StatefulSet para gerar automaticamente PersistentVolumeClaims vinculados a PersistentVolumes gerados manualmente correspondentes a uma série de discos permanentes preexistentes.
Os exemplos nesta página usam discos permanentes do Compute Engine.
Se ext4 for o tipo de sistema de arquivos padrão, será possível usar um disco permanente
preexistente com o sistema de arquivos xfs, desde que a imagem de nó seja compatível. Para usar um disco xfs, mude spec.csi.fsType para xfs no
manifesto do PersistentVolume.
O Windows não é compatível com o tipo de sistema de arquivos ext4. Use o sistema de arquivos NTFS para pools de nós do Windows Server.
Para usar um disco NTFS, mude spec.csi.fsType para NTFS no
manifesto do PersistentVolume.
Antes de começar
Antes de começar, verifique se você realizou as tarefas a seguir:
- Ativar a API Google Kubernetes Engine. Ativar a API Google Kubernetes Engine
- Se você quiser usar a CLI do Google Cloud para essa tarefa,
instale e inicialize a
gcloud CLI. Se você instalou a CLI gcloud anteriormente, instale a versão
mais recente executando o comando
gcloud components update. Talvez as versões anteriores da CLI gcloud não sejam compatíveis com a execução dos comandos neste documento.
- Verifique se você tem discos permanentes. Para provisionar um disco, consulte Como provisionar discos permanentes regionais.
- Verifique se o cluster usa o driver CSI de disco permanente do Compute Engine.
Como usar um PersistentVolumeClaim vinculado ao PersistentVolume
Para que um contêiner acesse o disco permanente preexistente, é necessário fazer o seguinte:
- Provisione o disco permanente atual como um PersistentVolume.
- Vincule o PersistentVolume a um PersistentVolumeClaim.
- Conceda aos contêineres no pod acesso ao PersistentVolume.
Criar o PersistentVolume e o PersistentVolumeClaim
Há várias maneiras de vincular um PersistentVolumeClaim a um PersistentVolume específico. Por exemplo, o manifesto YAML a seguir cria um novo PersistentVolume e PersistentVolumeClaim e, em seguida, vincula o volume à declaração usando o claimRef definido no PersistentVolume.
Para vincular um PersistentVolume a um PersistentVolumeClaim, o storageClassName dos dois recursos precisa corresponder, bem como capacity, accessModes e volumeMode. É possível omitir storageClassName, mas
é necessário especificar "" para impedir que o Kubernetes use o StorageClass padrão.
O storageClassName não precisa se referir a um objeto StorageClass existente. Se basta vincular a declaração a um volume, use o nome que quiser. No entanto, se você precisar de uma funcionalidade extra configurada por um StorageClass, como um redimensionamento de volume, storageClassName precisará se referir a um objeto StorageClass existente.
Para saber mais, consulte a documentação do Kubernetes sobre PersistentVolumes.
Salve 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:
PV_NAME: o nome do novo PersistentVolume.STORAGE_CLASS_NAME: o nome do novo StorageClass.DISK_SIZE: o tamanho do disco permanente preexistente. Por exemplo,500G.PV_CLAIM_NAME: o nome do novo PersistentVolumeClaim.DISK_ID: o identificador do disco permanente preexistente. O formato éprojects/{project_id}/zones/{zone_name}/disks/{disk_name}para discos permanentes zonais ouprojects/{project_id}/regions/{region_name}/disks/{disk_name}para discos permanentes regionais.FS_TYPE: o tipo de sistema de arquivos. Você pode deixar como padrão (ext4) ou usarxfs. Se os clusters usarem um pool de nós do Windows Server, altere esse valor 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 arquivo YAML.
Usar o PersistentVolume em um pod
Depois de criar e vincular o PersistentVolume e o PersistentVolumeClaim, é possível conceder aos contêineres do pod acesso ao volume especificando os valores no campo volumeMounts.
A seguinte configuração YAML cria um novo pod e um contêiner que executa uma imagem nginx e ativa 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:
POD_NAME: o nome do novo pod.VOLUME_NAME: o nome do volume.PV_CLAIM_NAME: o nome do PersistentVolumeClaim que você criou na etapa anterior.CONTAINER_NAME: o nome do novo contêiner;
Aplique a configuração:
kubectl apply -f FILE_PATH
Substitua FILE_PATH pelo caminho para o arquivo YAML.
Para verificar se o volume foi ativado, execute o seguinte comando:
kubectl describe pods POD_NAME
Na saída, verifique se o PersistentVolumeClaim foi ativado:
...
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
Como usar um disco preexistente em um StatefulSet
É possível usar discos permanentes preexistentes do Compute Engine em um
StatefulSet usando
PersistentVolumes. O StatefulSet gera automaticamente um PersistentVolumeClaim para cada réplica. É possível prever os nomes dos
PersistentVolumeClaims gerados e vinculá-los aos PersistentVolumes usando
claimRef.
No exemplo a seguir, você usa dois discos permanentes preexistentes, cria PersistentVolumes para usar os discos e ativa os volumes em um StatefulSet com duas réplicas no namespace padrão.
- Escolha um nome para o novo StatefulSet, um nome para o modelo PersistentVolumeClaim e o número de réplicas no StatefulSet.
Trabalhe os nomes dos PersistentVolumeClaims gerados automaticamente. O StatefulSet usa o seguinte formato para nomes PersistentVolumeClaim:
PVC_TEMPLATE_NAME-STATEFULSET_NAME-REPLICA_INDEXSubstitua:
PVC_TEMPLATE_NAME: o nome do novo modelo do PersistentVolumeClaim.STATEFULSET_NAME: o nome do novo StatefulSet;REPLICA_INDEX: o índice da réplica do StatefulSet. Neste exemplo, use0e1.
Crie os PersistentVolumes. Crie um PersistentVolume para cada réplica no StatefulSet.
Salve 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:
DISK1_SIZE and DISK2_SIZE: os tamanhos dos discos permanentes preexistentes;DISK1_ID and DISK2_ID: os identificadores dos discos permanentes preexistentes.PVC_TEMPLATE_NAME-STATEFULSET_NAME-0 and PVC_TEMPLATE_NAME-STATEFULSET_NAME-1: os nomes das PersistentVolumeClaims geradas automaticamente no formato definido na etapa anterior.STORAGE_CLASS_NAME: o nome do StorageClass.
Aplique a configuração:
kubectl apply -f FILE_PATHSubstitua
FILE_PATHpelo caminho para o arquivo YAML.
Crie um StatefulSet usando os valores escolhidos na etapa 1. Verifique se o armazenamento especificado em
volumeClaimTemplatesé menor ou igual à capacidade total dos PersistentVolumes.Salve 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:
STATEFULSET_NAME: o nome do novo StatefulSet;PVC_TEMPLATE_NAME: o nome do novo modelo PersistentVolumeClaim.STORAGE_CLASS_NAME: o nome do StorageClass.
Aplique a configuração:
kubectl apply -f FILE_PATHSubstitua
FILE_PATHpelo caminho para o arquivo YAML.