Como usar discos permanentes preexistentes como PersistentVolumes

Nesta página, explicamos como criar um PersistentVolume usando um disco permanente do Compute Engine preenchido com dados e como usar o PersistentVolume em um pod.

Como criar o PersistentVolume e o PersistentVolumeClaim

Se você já tem um disco permanente de 500 GB chamado pd-name, o seguinte arquivo de manifesto (chamado existing-pd.yaml) descreve um PersistentVolume e um PersistentVolumeClaim correspondentes.

Há várias maneiras de vincular um PersistentVolumeClaim a um PersistentVolume específico. Este exemplo usa um claimRef que garante que o PersistentVolume só possa ser vinculado ao PersistentVolumeClaim especificado.

Para que um PersistentVolume seja vinculado a um PersistentVolumeClaim, o storageClassName dos dois recursos precisa corresponder, bem como capacity, accessModes e volumeMode. É possível fornecer um nome vazio, mas é preciso usar explicitamente "" para evitar que o StorageClass padrão do cluster seja usado.

O storageClassName não precisa se referir a um objeto StorageClass existente. Um nome arbitrário pode ser usado se tudo que for necessário é vincular a declaração a um volume. Se você precisar de funcionalidade extra configurada por um StorageClass, por exemplo, redimensionamento do volume, storageClassName precisará se referir a um objeto StorageClass existente.

Para saber mais, consulte a documentação do Kubernetes sobre PersistentVolumes.

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-demo
spec:
  storageClassName: "example-storageclass"
  capacity:
    storage: 500G
  accessModes:
    - ReadWriteOnce
  claimRef:
    namespace: default
    name: pv-claim-demo
  gcePersistentDisk:
    pdName: pd-name
    fsType: ext4
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pv-claim-demo
spec:
  storageClassName: "example-storageclass"
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 500G

Para criar o PersistentVolume e o PersistentVolumeClaim, use kubectl apply -f existing-pd.yaml.

Como usar o PersistentVolume em um pod

Depois que o PersistentVolume e o PersistentVolumeClaim estiverem no cluster, será possível conceder aos contêineres do pod acesso ao volume especificando os valores no campo volumeMounts. Neste exemplo, esses campos especificam que o volume nomeado task-pv-storage está montado no caminho do arquivo /usr/share/nginx/html.

kind: Pod
apiVersion: v1
metadata:
  name: task-pv-pod
spec:
  volumes:
    - name: task-pv-storage
      persistentVolumeClaim:
       claimName: pv-claim-demo
  containers:
    - name: task-pv-container
      image: nginx
      ports:
        - containerPort: 80
          name: "http-server"
      volumeMounts:
        - mountPath: "/usr/share/nginx/html"
          name: task-pv-storage

Quando você aplica esse manifesto a um cluster, o pod é criado e o contêiner task-pv-container tem acesso ao volume no diretório /usr/share/nginx/html/.

Como usar um disco preexistente em um StatefulSet

Para usar um disco preexistente em um StatefulSet, conclua as seguintes tarefas:

  1. Decida o nome do StatefulSet, volumeClaimTemplates.name, o número de réplicas do StatefulSet e registre os valores. Não crie o StatefulSet até terminar de criar o PersistentVolumeClaim.
  2. Defina o nome PersistentVolumeClaim gerado automaticamente pelo StatefulSet. Em StatefulSets, o nome PersistentVolumeClaim segue um padrão previsível: volumeclaimtemplates-name-statefulset-name-replica-index. Por exemplo, se você decidir que o nome do StatefulSet será "Web", o volumeClaimTemplates.name do StatefulSet será "www", e haverá duas réplicas do StatefulSet. Os dois nomes PersistentVolumeClaim serão www-web-0 e www-web-1.
  3. Crie PersistentVolumes com um campo claimRef e defina claimRef.name como o nome PersistentVolumeClaim gerado. Quando há mais de uma réplica, é necessário criar um PersistentVolume para cada réplica.

    Estes exemplos de PersistentVolumes referem-se a um ambiente com os seguintes recursos:

    • Um StatefulSet que estará no namespace padrão.
    • Um StatefulSet que terá duas réplicas.
    • Um StatefulSet em que os nomes PersistentVolumeClaim gerados automaticamente são www-web-0 e www-web-1.
    • Dois discos permanentes existentes chamados pd-zero e pd-one.
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv-statefulset-demo-0
    spec:
      storageClassName: "example-storageclass"
      capacity:
        storage: 100Gi
      accessModes:
        - ReadWriteOnce
      claimRef:
        namespace: default
        name: www-web-0
      gcePersistentDisk:
        pdName: pd-zero
        fsType: ext4
    
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv-statefulset-demo-1
    spec:
      storageClassName: "example-storageclass"
      capacity:
        storage: 100Gi
      accessModes:
        - ReadWriteOnce
      claimRef:
        namespace: default
        name: www-web-1
      gcePersistentDisk:
        pdName: pd-one
        fsType: ext4
    
  4. Crie um StatefulSet usando os valores escolhidos na primeira etapa. Verifique se o armazenamento especificado em volumeClaimTemplates é menor ou igual à capacidade dos PersistentVolumes. Por exemplo:

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: web
    spec:
      selector:
        matchLabels:
          app: nginx
      serviceName: "nginx"
      replicas: 2
      template:
        metadata:
          labels:
            app: nginx
        spec:
          terminationGracePeriodSeconds: 10
          containers:
          - name: nginx
            image: k8s.gcr.io/nginx-slim:0.8
            ports:
            - containerPort: 80
              name: web
            volumeMounts:
            - name: www
              mountPath: /usr/share/nginx/html
      volumeClaimTemplates:
      - metadata:
          name: www
        spec:
          accessModes: [ "ReadWriteOnce" ]
          resources:
            requests:
              storage: 100Gi