Como provisionar discos permanentes regionais

Nesta página, explicamos como ativar o provisionamento dinâmico de discos permanentes regionais e como provisioná-los manualmente no Google Kubernetes Engine (GKE).

Discos permanentes regionais

Como acontece com discos permanentes zonais, os discos permanentes regionais podem ser provisionados dinamicamente conforme necessário ou provisionados manualmente com antecedência pelo administrador do cluster, embora o provisionamento dinâmico seja recomendado.

Provisionamento dinâmico

Para ativar o provisionamento dinâmico de discos permanentes regionais, crie um StorageClass com o parâmetro replication-type e especifique restrições de zona em allowedTopologies.

Por exemplo, o seguinte manifesto descreve um StorageClass chamado regionalpd-storageclass que usa discos permanentes padrão e que replica dados para as zonas europe-west1-b e europe-west1-c:

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: regionalpd-storageclass
provisioner: kubernetes.io/gce-pd
parameters:
  type: pd-standard
  replication-type: regional-pd
volumeBindingMode: WaitForFirstConsumer
allowedTopologies:
- matchLabelExpressions:
  - key: failure-domain.beta.kubernetes.io/zone
    values:
    - europe-west1-b
    - europe-west1-c

Deixe allowedTopologies não especificado. Se você fizer isso, ao criar um pod que consome um PersistentVolumeClaim que usa este StorageClass, um disco permanente regional será provisionado com duas zonas. Uma zona é igual à zona em que o pod está programado. A outra zona é escolhida aleatoriamente entre as zonas disponíveis para o cluster.

Crie um objeto PersistentVolumeClaim e use o campo storageClassName para se referir ao StorageClass criado por você. Por exemplo, o seguinte manifesto cria um PersistentVolumeClaim chamado regional-pvc e refere-se ao regionalpd-storageclass:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: regional-pvc
  namespace: testns
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 200Gi
  storageClassName: regionalpd-storageclass

Como o StorageClass é configurado com volumeBindingMode: WaitForFirstConsumer, o PersistentVolume não é provisionado até que um pod que use o PersistentVolumeClaim seja criado.

O manifesto a seguir é um exemplo de pod que usa o PersistentVolumeClaim criado anteriormente:

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

Provisionamento manual

Primeiro, crie um disco permanente regional. No seguinte exemplo, criamos um disco chamado gce-disk-1 replicado para as zonas europe-west1-b e europe-west1-c:

gcloud beta compute disks create \
 gce-disk-1 \
   --region europe-west1 \
   --replica-zones europe-west1-b,europe-west1-c

Em seguida, crie um PersistentVolume que se refira ao disco permanente regional. Além dos objetos em Como usar discos permanentes preexistentes como PersistentVolumes, o PersistentVolume para um disco permanente regional também deve conter afinidade de nó, por exemplo:

  spec:
    ...
    nodeAffinity:
      required:
        nodeSelectorTerms:
          - matchExpressions:
              - key: failure-domain.beta.kubernetes.io/zone
                operator: In
                values:
                  - europe-west1-b
                  - europe-west1-c

Como nomear discos permanentes

No Kubernetes, não há distinção entre discos permanentes regionais e zonais com o mesmo nome. Como solução alternativa, garanta que os discos permanentes tenham nomes exclusivos. Esse problema não ocorre quando você usa discos permanentes provisionados dinamicamente.

A seguir