Nesta página, explicamos como ativar o provisionamento dinâmico de volumes de alta disponibilidade balanceados do Hyperdisk e discos permanentes regionais e como provisioná-los manualmente no Google Kubernetes Engine (GKE). Para compatibilidades de tipo de máquina, consulte Limitações do disco regional e Suporte a séries de máquinas para o Hyperdisk. Em geral, use volumes de alta disponibilidade do Hyperdisk Balanced para séries de máquinas de terceira geração ou mais recentes e discos permanentes regionais em séries de máquinas de segunda geração ou mais antigas. Para mais informações sobre a geração de séries de máquinas, consulte Terminologia do Compute Engine.
Para criar soluções completas para aplicativos de alta disponibilidade com discos permanentes regionais, consulte Aumentar a disponibilidade de aplicativos com estado usando o operador de alta disponibilidade com estado. Esse recurso não é compatível com volumes do Hyperdisk Balanced High Availability.
Alta disponibilidade do hiperdisco equilibrada
Este exemplo mostra como os volumes do Hyperdisk Balanced High Availability podem ser provisionados dinamicamente conforme necessário ou manualmente com antecedência pelo administrador do cluster.
Provisionamento dinâmico
Salve o manifesto em um arquivo chamado
balanced-ha-storage.yaml
.apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: balanced-ha-storage provisioner: pd.csi.storage.gke.io volumeBindingMode: WaitForFirstConsumer # Allow volume expansion. allowVolumeExpansion: true parameters: type: hyperdisk-balanced-high-availability # Provisioned throughput in MiB/s. provisioned-throughput-on-create: "250Mi" # Provisioned IOPS (input/output operations per second). provisioned-iops-on-create: "7000" allowedTopologies: - matchLabelExpressions: - key: topology.gke.io/zone values: - ZONE1 - ZONE2
Substitua:
ZONE1
,ZONE2
: as zonas da região em que o volume provisionado dinamicamente será replicado.
Crie o StorageClass
kubectl create -f hdb-ha-example-class.yaml
Salve o seguinte manifesto PersistentVolumeClaim em um arquivo chamado
pvc-example.yaml
:kind: PersistentVolumeClaim apiVersion: v1 metadata: name: podpvc spec: accessModes: - ACCESS_MODE storageClassName: balanced-ha-storage resources: requests: storage: 20Gi
Substitua:
ACCESS_MODE
: o Hyperdisk Balanced High Availability é compatível comReadWriteOnce
,ReadWriteMany
eReadWriteOncePod
. Para conferir as diferenças e os casos de uso de cada modo de acesso, consulte Modos de acesso de volume permanente.- Se você escolher usar
ReadWriteMany
, também precisará adicionarvolumeMode: Block
aoPersistentVolumeClaim
. Essa configuração evita a corrupção de dados que pode acontecer quando vários pods gravam no armazenamento simultaneamente. A configuraçãovolumeMode: Block
expõe o disco como um dispositivo de transferência por blocos bruto que ignora o gerenciamento do sistema de arquivos pelo Kubernetes. Confira o seguinte exemplo:
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: podpvc spec: accessModes: - ReadWriteMany volumeMode: Block storageClassName: balanced-ha-storage resources: requests: storage: 20Gi ```
Aplique o PersistentVolumeClaim que faz referência ao StorageClass criado anteriormente:
kubectl apply -f pvc-example.yaml
Provisionamento manual
Siga a documentação do Compute Engine para criar um volume do Hyperdisk Balanced High Availability manualmente.
Salve o seguinte manifesto PersistentVolume em um arquivo chamado
pv-example.yaml
. O manifesto faz referência ao volume do Hyperdisk Balanced High Availability que você acabou de criar:apiVersion: v1 kind: PersistentVolume metadata: name: pv-demo spec: capacity: storage: 500Gi accessModes: - ACCESS_MODE # ClaimRef links this PersistentVolume to a PersistentVolumeClaim. claimRef: namespace: default name: podpvc csi: driver: pd.csi.storage.gke.io # The unique identifier of the Compute Engine disk resource that backs this volume. volumeHandle: projects/PROJECT_ID/regions/REGION/disks/gce-disk-1 # Node affinity to ensure the Pod is scheduled in a zone where the volume is replicated. nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: topology.gke.io/zone operator: In values: - ZONE1 - ZONE2
Substitua:
PROJECT_ID
: o ID do projeto do volume que você criou.REGION
: a região do disco que você criou. Consulte a documentação do Compute Engine para saber a disponibilidade regional mais recente.ZONE1
,ZONE2
: as zonas dentro da região em que o volume criado é replicado.ACCESS_MODE
: o Hyperdisk Balanced High Availability é compatível comReadWriteOnce
,ReadWriteMany
eReadWriteOncePod
. Para conferir as diferenças e os casos de uso de cada modo de acesso, consulte Modos de acesso de volume permanente.
Crie o volume permanente que faz referência ao volume do Hyperdisk Balanced High Availability criado anteriormente:
kubectl apply -f pv-example.yaml
Salve o seguinte manifesto PersistentVolumeClaim em um arquivo chamado
pvc-example.yaml
:kind: PersistentVolumeClaim apiVersion: v1 metadata: name: podpvc spec: accessModes: - ACCESS_MODE storageClassName: balanced-ha-storage resources: requests: storage: 20Gi
Substitua:
ACCESS_MODE
: o Hyperdisk Balanced High Availability é compatível comReadWriteOnce
,ReadWriteMany
eReadWriteOncePod
. Precisa ser o mesmo modo de acesso especificado no PersistentVolume da etapa anterior. Para conferir as diferenças e os casos de uso de cada modo de acesso, consulte Modos de acesso de volume permanente.
Aplique o PersistentVolumeClaim que faz referência ao PersistentVolume criado anteriormente:
kubectl apply -f pvc-example.yaml
Consumir um volume de vários gravadores no modo de blocos
Para usar um volume no modo de bloco, especifique volumeBlock
em vez de volumeMounts
no pod de consumo. Um exemplo de pod que usa o PersistenVolumeClaim
apresentado anteriormente seria assim:
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-server-deployment
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
# Use volumeDevices instead of volumeMounts to consume the volume as a raw block device.
volumeDevices:
# The "mountPath" field specifies the path where the block device is accessible in the container.
- mountPath: /dev/my-device
name: mypvc
volumes:
- name: mypvc
persistentVolumeClaim:
claimName: podpvc
readOnly: false
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.
Para usar discos permanentes regionais do tipo pd-standard
, defina o atributo spec.resources.requests.storage
do PersistentVolumeClaim como um mínimo de 200 GiB. Se o caso de uso exigir um volume menor, use pd-balanced
ou pd-ssd
.
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: pd.csi.storage.gke.io
parameters:
type: pd-balanced
# Specifies that the disk should be a regional persistent disk.
replication-type: regional-pd
volumeBindingMode: WaitForFirstConsumer
# Constrains which zones the regional persistent disk can be provisioned in.
allowedTopologies:
- matchLabelExpressions:
- key: topology.gke.io/zone
values:
- europe-west1-b
- europe-west1-c
Se estiver usando um cluster regional, não é necessário especificar allowedTopologies
. Se
você fizer isso, ao criar um pod que consome um PersistentVolumeClaim
que usa esse StorageClass
, um disco permanente regional será provisionado com
duas zonas. Uma zona é mesma zona em que o pod está programado. A
outra zona é escolhida aleatoriamente entre as zonas disponíveis para o cluster.
Ao usar um cluster zonal, allowedTopologies
precisa ser definido.
Depois que StorageClass
for criado, crie um objeto PersistentVolumeClaim
usando o campo storageClassName
para se referir ao StorageClass
. Por
exemplo, o seguinte manifesto cria um PersistentVolumeClaim
chamado
regional-pvc
e faz referência ao regionalpd-storageclass
:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: regional-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 500Gi
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
# This Pod uses the PVC that's associated with the
# "regionalpd-storageclass" StorageClass.
persistentVolumeClaim:
claimName: regional-pvc
containers:
- name: task-pv-container
image: nginx
ports:
- containerPort: 80
name: "http-server"
# The volume is mounted into the container at the "/usr/share/nginx/html" path.
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: task-pv-storage
Provisionamento manual
Primeiro, crie um disco permanente regional usando o
comando
gcloud compute disks create
. No exemplo a seguir, criamos um disco chamado gce-disk-1
replicado para as zonas europe-west1-b
e europe-west1-c
:
gcloud compute disks create gce-disk-1 \
--size 500Gi \
--region europe-west1 \
--replica-zones europe-west1-b,europe-west1-c
Em seguida, crie um PersistentVolume
que faça referência ao disco
permanente regional que você acabou de criar. Além de objetos em
Como usar discos permanentes preexistentes como PersistentVolumes,
o PersistentVolume
de um disco permanente regional também precisa especificar um
node-affinity
.
Se você usar um StorageClass
, ele precisa especificar o driver CSI do disco permanente.
Veja um exemplo de um manifesto de 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: pd.csi.storage.gke.io
parameters:
type: pd-balanced
# Specifies that the disk should be a regional persistent disk.
replication-type: regional-pd
volumeBindingMode: WaitForFirstConsumer
# Constrains which zones the regional persistent disk can be provisioned in.
allowedTopologies:
- matchLabelExpressions:
- key: topology.gke.io/zone
values:
- europe-west1-b
- europe-west1-c
Veja um exemplo de manifesto que cria um PersistentVolume
chamado
pv-demo
e faz referência ao regionalpd-storageclass
:
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-demo
spec:
# The StorageClass that specifies regional replication.
storageClassName: "regionalpd-storageclass"
capacity:
storage: 500Gi
accessModes:
- ReadWriteOnce
claimRef:
namespace: default
name: pv-claim-demo
csi:
driver: pd.csi.storage.gke.io
# The unique identifier for the pre-existing regional disk.
volumeHandle: projects/PROJECT_ID/regions/europe-west1/disks/gce-disk-1
# Ensures that Pods are scheduled in zones where the disk is replicated.
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: topology.gke.io/zone
operator: In
values:
- europe-west1-b
- europe-west1-c
Observe o seguinte para o exemplo PersistentVolume
:
- O campo
volumeHandle
contém detalhes da chamadagcloud compute disks create
, incluindo oPROJECT_ID
. - O campo
claimRef.namespace
precisa ser especificado mesmo quando estiver definido comodefault
.
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
- Faça um tutorial para saber mais sobre Como implantar o WordPress no GKE com discos permanentes e Cloud SQL.