本页面介绍如何为区域 Persistent Disk 启用动态预配功能,以及如何在 Google Kubernetes Engine (GKE) 中手动预配它们。
如需了解如何为使用区域永久性磁盘的高可用性应用创建端到端解决方案,请参阅使用 Stateful HA Operator 提高有状态应用的可用性。
区域永久性磁盘
与地区永久性磁盘一样,区域永久性磁盘可以根据需要动态预配,也可以由集群管理员提前预配,但建议使用动态预配。
动态预配
如需启用区域永久性磁盘的动态预配,请使用 replication-type
参数创建一个 StorageClass
,并在 allowedTopologies
中指定地区限制。
例如,以下清单描述了一个名为 regionalpd-storageclass
的 StorageClass
,它使用标准永久性磁盘并将数据复制到 europe-west1-b
和 europe-west1-c
地区:
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: regionalpd-storageclass
provisioner: pd.csi.storage.gke.io
parameters:
type: pd-balanced
replication-type: regional-pd
volumeBindingMode: WaitForFirstConsumer
allowedTopologies:
- matchLabelExpressions:
- key: topology.gke.io/zone
values:
- europe-west1-b
- europe-west1-c
如果使用区域级集群,则可以不指定 allowedTopologies
。如果这样做,则在创建使用 PersistentVolumeClaim
(使用此 StorageClass
)的 Pod 时,系统会为区域永久性磁盘预配两个可用区。一个可用区是安排 Pod 的可用区。另一个可用区是从集群的可用区中随机选择的。
使用可用区级集群时,必须设置 allowedTopologies
。
创建 StorageClass
后,接下来创建 PersistentVolumeClaim
对象,以使用 storageClassName
字段引用 StorageClass
。例如,以下清单创建一个名为 regional-pvc
的 PersistentVolumeClaim
并引用 regionalpd-storageclass
:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: regional-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 500Gi
storageClassName: regionalpd-storageclass
由于 StorageClass
是使用 volumeBindingMode: WaitForFirstConsumer
进行配置的,因此在创建使用 PersistentVolumeClaim
的 Pod 之前系统不会预配 PersistentVolume
。
以下清单是使用先前创建的 PersistentVolumeClaim
的示例 Pod:
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
手动预配
首先,使用 gcloud compute disks create
命令创建区域永久性磁盘。以下示例创建了一个被复制到 europe-west1-b
和 europe-west1-c
可用区的名为 gce-disk-1
的磁盘:
gcloud compute disks create gce-disk-1 \
--size 500Gi \
--region europe-west1 \
--replica-zones europe-west1-b,europe-west1-c
然后,您可以创建一个引用您刚创建的区域永久性磁盘的 PersistentVolume
。除了将原有永久性磁盘用作 PersistentVolume 的对象,区域永久性磁盘的 PersistentVolume
还应指定node-affinity
。
如果您使用 StorageClass
,则应指定永久性磁盘 CSI 驱动程序。
下面是一个使用标准永久性磁盘并将数据复制到 europe-west1-b
和 europe-west1-c
可用区的 StorageClass
清单示例:
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: regionalpd-storageclass
provisioner: pd.csi.storage.gke.io
parameters:
type: pd-balanced
replication-type: regional-pd
volumeBindingMode: WaitForFirstConsumer
allowedTopologies:
- matchLabelExpressions:
- key: topology.gke.io/zone
values:
- europe-west1-b
- europe-west1-c
以下清单示例创建了一个名为 pv-demo
的 PersistentVolume
并引用 regionalpd-storageclass
:
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-demo
spec:
storageClassName: "regionalpd-storageclass"
capacity:
storage: 500Gi
accessModes:
- ReadWriteOnce
claimRef:
namespace: default
name: pv-claim-demo
csi:
driver: pd.csi.storage.gke.io
volumeHandle: projects/PROJECT_ID/regions/europe-west1/disks/gce-disk-1
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: topology.gke.io/zone
operator: In
values:
- europe-west1-b
- europe-west1-c
请注意 PersistentVolume
示例的以下事项:
volumeHandle
字段包含gcloud compute disks create
调用中的详细信息,包括PROJECT_ID
。- 即使
claimRef.namespace
字段设置为default
,也必须指定它。
为永久性磁盘命名
Kubernetes 无法区分同名的地区永久性磁盘和区域永久性磁盘。如需解决此问题,请确保永久性磁盘的名称各不相同。如果使用动态预配的永久性磁盘,则不会出现此问题。