Usar discos persistentes pré-existentes como PersistentVolumes

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.

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.

Usando uma PersistentVolumeClaim associada ao PersistentVolume

Para que um contentor aceda ao seu disco persistente pré-existente, tem de fazer o seguinte:

  1. Aprovisione o disco persistente existente como um PersistentVolume.
  2. Associe o PersistentVolume a um PersistentVolumeClaim.
  3. 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.

  1. 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 ou projects/{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 usar xfs. Se os seus clusters usarem um conjunto de nós do Windows Server, tem de alterar esta opção para NTFS.
  2. 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.

  1. Decida um nome para o novo StatefulSet, um nome para o modelo PersistentVolumeClaim e o número de réplicas no StatefulSet.
  2. 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, use 0 e 1.
  3. Crie os PersistentVolumes. Tem de criar um PersistentVolume para cada réplica no StatefulSet.

    1. 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.
    2. Aplique a configuração:

      kubectl apply -f FILE_PATH
      

      Substitua FILE_PATH pelo caminho para o ficheiro YAML.

  4. 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.

    1. 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.
    2. Aplique a configuração:

      kubectl apply -f FILE_PATH
      

      Substitua FILE_PATH pelo caminho para o ficheiro YAML.

O que se segue?