本页面介绍如何为 Hyperdisk Balanced 高可用性卷和区域级永久性磁盘启用动态预配功能,以及如何在 Google Kubernetes Engine (GKE) 中手动预配它们。如需了解机器类型兼容性,请参阅区域级磁盘的限制和机器系列对 Hyperdisk 的支持。一般来说,对于第 3 代机器系列或更新的机器系列,您应使用 Hyperdisk Balanced 高可用性卷;对于第 2 代机器系列或更旧的机器系列,您应使用区域级永久性磁盘。如需详细了解机器系列世代,请参阅 Compute Engine 术语。
如需了解如何为使用区域级永久性磁盘的高可用性应用创建端到端解决方案,请参阅使用 Stateful HA Operator 提高有状态应用的可用性。此功能不支持 Hyperdisk Balanced 高可用性卷。
Hyperdisk Balanced 高可用性
此示例展示了如何根据需要动态预配 Hyperdisk Balanced 高可用性卷,或如何由集群管理员提前手动预配该卷。
动态预配
将以下清单保存在名为
balanced-ha-storage.yaml
的文件中。apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: balanced-ha-storage provisioner: pd.csi.storage.gke.io volumeBindingMode: WaitForFirstConsumer allowVolumeExpansion: true parameters: type: hyperdisk-balanced-high-availability provisioned-throughput-on-create: "250Mi" provisioned-iops-on-create: "7000" allowedTopologies: - matchLabelExpressions: - key: topology.gke.io/zone values: - ZONE1 - ZONE2
替换以下内容:
ZONE1
、ZONE2
:将复制动态预配的卷的区域内的可用区。
创建 StorageClass:
kubectl create -f hdb-ha-example-class.yaml
将以下 PersistentVolumeClaim 清单保存到名为
pvc-example.yaml
的文件中:kind: PersistentVolumeClaim apiVersion: v1 metadata: name: podpvc spec: accessModes: - ACCESS_MODE storageClassName: balanced-ha-storage resources: requests: storage: 20Gi
替换以下内容:
ACCESS_MODE
:Hyperdisk Balanced 高可用性支持ReadWriteOnce
、ReadWriteMany
和ReadWriteOncePod
。如需了解每种访问模式的差异和应用场景,请参阅永久性卷访问模式。
应用引用您之前创建的 StorageClass 的 PersistentVolumeClaim:
kubectl apply -f pvc-example.yaml
手动预配
按照 Compute Engine 文档手动创建 Hyperdisk Balanced 高可用性卷。
将以下 PersistentVolume 清单保存在名为
pv-example.yaml
的文件中。清单引用了您刚刚创建的 Hyperdisk Balanced 高可用性卷:apiVersion: v1 kind: PersistentVolume metadata: name: pv-demo spec: capacity: storage: 500Gi accessModes: - ACCESS_MODE claimRef: namespace: default name: podpvc csi: driver: pd.csi.storage.gke.io volumeHandle: projects/PROJECT_ID/regions/REGION/disks/gce-disk-1 nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: topology.gke.io/zone operator: In values: - ZONE1 - ZONE2
替换以下内容:
PROJECT_ID
:您创建的卷的项目 ID。REGION
:您创建的磁盘的区域。如需了解最新的区域可用性,请参阅 Compute Engine 文档。ZONE1
和ZONE2
:复制您创建的卷的区域内的可用区。ACCESS_MODE
:Hyperdisk Balanced 高可用性支持ReadWriteOnce
、ReadWriteMany
和ReadWriteOncePod
。如需了解每种访问模式的差异和应用场景,请参阅永久性卷访问模式。
创建引用您之前创建的 Hyperdisk Balanced 高可用性卷的永久性卷:
kubectl apply -f pv-example.yaml
将以下 PersistentVolumeClaim 清单保存到名为
pvc-example.yaml
的文件中:kind: PersistentVolumeClaim apiVersion: v1 metadata: name: podpvc spec: accessModes: - ACCESS_MODE storageClassName: balanced-ha-storage resources: requests: storage: 20Gi
替换以下内容:
ACCESS_MODE
:Hyperdisk Balanced 高可用性支持ReadWriteOnce
、ReadWriteMany
和ReadWriteOncePod
。必须与上一步中在 PersistentVolume 中指定的访问模式相同。如需了解每种访问模式的差异和应用场景,请参阅永久性卷访问模式。
应用引用您之前创建的 PersistentVolume 的 PersistentVolumeClaim:
kubectl apply -f pvc-example.yaml
区域级永久性磁盘
与地区永久性磁盘一样,区域永久性磁盘可以根据需要动态预配,也可以由集群管理员提前预配,但建议使用动态预配。
如需利用 pd-standard
类型的区域级永久性磁盘,请将 PersistentVolumeClaim 的 spec.resources.requests.storage
属性设置为至少 200 GiB。如果您的用例需要较小的卷,请考虑改用 pd-balanced
或 pd-ssd
。
动态预配
如需启用区域永久性磁盘的动态预配,请使用 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 无法区分同名的地区永久性磁盘和区域永久性磁盘。如需解决此问题,请确保永久性磁盘的名称各不相同。如果使用动态预配的永久性磁盘,则不会出现此问题。