GKE on AWS 会自动部署容器存储接口 (CSI) Amazon Elastic Block Store (EBS) 和 Amazon Elastic File Store (EFS)。
EBS CSI 驱动程序和 EFS CSI 驱动程序版本与 GKE on AWS Kubernetes 版本相关联。此驱动程序版本通常是发布 GKE 版本时可用的最新版本。集群升级后,驱动程序会自动更新。
使用默认 StorageClass
如果在不设置字段 spec.storageClassName
的情况下创建 PersistentVolumeClaim,则系统会使用默认的 GKE on AWS EBS CSI 驱动程序 StorageClass 预配通用 SSD (gp2) 卷。
以下 YAML 会创建一个名为 mypvc
的 PersistentVolumeClaim (PVC),其大小为 30 吉比字节。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mypvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 30Gi
使用其他预安装的 StorageClass
GKE on AWS EBS CSI 驱动程序还包含 premium-rwo
StorageClass,它可预配吞吐量更高的预配 IOPS SSD (io1
) 卷。
您可以通过在 PVC 的 spec.storageClassName
中指定该 StorageClass 来使用它。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mypvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 30Gi
storageClassName: premium-rwo
使用自定义 StorageClass
如果默认 StorageClass 和 premium-rwo
StorageClass 都不符合您的需求,您可以为 EBS 卷创建额外的 StorageClass,或使用容器存储接口 (CSI) 驱动程序。
选择您使用的是 EBS 卷还是其他 CSI 驱动程序。
EBS 卷
此标签页介绍如何创建用于指定 EBS 卷类型、文件系统类型和其他参数的自定义 StorageClass。您可以在 GKE on AWS EBS CSI 驱动程序的 GitHub 页面上找到额外的 StorageClass 参数。
如需配置自定义 StorageClass,请将以下 YAML 清单复制到名为
my-custom-class.yaml
的文件中。apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: CLASS_NAME provisioner: ebs.csi.aws.com allowVolumeExpansion: true volumeBindingMode: WaitForFirstConsumer
将
CLASS_NAME
替换为新 StorageClass 的名称。例如,以下 YAML 会创建一个新的 StorageClass,用于预配使用 XFS 文件系统格式化的吞吐量优化型 HDD EBS 卷。
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: my-custom-class provisioner: ebs.csi.aws.com allowVolumeExpansion: true volumeBindingMode: WaitForFirstConsumer parameters: csi.storage.k8s.io/fsType: xfs type: st1
自定义 EFS StorageClass
此标签页介绍如何为 EFS CSI 驱动程序预配工具创建自定义 StorageClass。如需查看此 StorageClass 的前提条件列表,请参阅使用 EFS 资源。“EFS CSI 驱动程序”页面列出了除以下清单中的参数之外的其他 StorageClass 参数。
将以下 YAML 清单复制到名为
my-custom-class.yaml
的文件中。kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: <var>EFS_STORAGE_CLASS_NAME</var> provisioner: efs.csi.aws.com mountOptions: - tls parameters: provisioningMode: efs-ap fileSystemId: EFS_ID directoryPerms: "700"
您需要将其中的:
- 将 EFS_STORAGE_CLASS_NAME 替换为
StorageClass
的名称。 - 将 EFS_ID 替换为您的 EFS 文件系统 ID,例如 fs-12345678a。
CSI 驱动程序
您可以在
provisioner
字段中指定其他 CSI 驱动程序。如需使用其他 CSI 驱动程序创建 StorageClass,您可以使用以下 YAML 示例。
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: CLASS_NAME provisioner: CSI_DRIVER_NAME allowVolumeExpansion: true volumeBindingMode: WaitForFirstConsumer parameters: ...
替换以下内容:
- 将
CSI_DRIVER_NAME
替换为 CSI 驱动程序的名称,例如csi.example.com
- 将
CLASS_NAME
替换为 StorageClass 的名称,例如my-custom-class
根据您的 CSI 驱动程序,配置
parameters
下的子字段。- 将 EFS_STORAGE_CLASS_NAME 替换为
将 YAML 应用到您的集群。
kubectl apply -f my-custom-class.yaml
使用自定义 StorageClass 创建 PersistentVolumeClaim
创建自定义 StorageClass 后,您可以在 PVC 中指定它。以下示例将创建一个名为
my-pvc
且引用 StorageClassmy-custom-class
的 PVC。apiVersion: v1 kind: PersistentVolumeClaim metadata: name: my-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 30Gi storageClassName: my-custom-class
设置默认 StorageClass
GKE on AWS 使用一个名为 standard-rwo
的默认 StorageClass,用于预配 gp2 EBS 卷您可以将默认 StorageClass 更改为另一个 StorageClass。
要更改默认 StorageClass,请执行以下操作:
使用
kubectl patch
更新standard-rwo
StorageClass 的is-default-class
注释。kubectl patch storageclass standard-rwo -p \ '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}'
创建一个具有注释
storageclass.kubernetes.io/is-default-class: true
的新 StorageClass。以下示例 StorageClass 使用
ebs.csi.aws.com
驱动程序。如需安装其他存储驱动程序,请参阅安装其他 CSI 驱动程序。将以下 YAML 复制到名为
my-custom-class.yaml
的文件中。apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: CLASS_NAME annotations: storageclass.kubernetes.io/is-default-class: true provisioner: ebs.csi.aws.com allowVolumeExpansion: true volumeBindingMode: WaitForFirstConsumer parameters: type: EBS_VOLUME_TYPE
请替换以下内容:
EBS_VOLUME_TYPE
:StorageClass 创建的 AWS EBS 卷类型。- 将
CLASS_NAME
替换为新 StorageClass 的名称
例如,以下 YAML 会创建一个新的默认 StorageClass,用于预配通用 SSD 卷 (gp3)。
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: my-custom-default-class annotations: storageclass.kubernetes.io/is-default-class: "true" provisioner: ebs.csi.aws.com allowVolumeExpansion: true volumeBindingMode: WaitForFirstConsumer parameters: type: gp3
将新的自定义类应用于您的集群。
kubectl apply -f my-custom-class.yaml
应用此清单后,GKE on AWS 使用 my-custom-default-class
StorageClass 处理新的存储请求。
在 StatefulSet 中引用 StorageClass
要使用新的 StorageClass,您必须在 StatefulSet 的 volumeClaimTemplates
中引用它。
当您在 StatefulSet 的 volumeClaimTemplates
规范中引用 StorageClass 时,Kubernetes 会使用 PersistentVolume (PV) 提供稳定的存储。Kubernetes 会调用在 StorageClass 中定义的预配工具以创建新的存储卷。预配了卷之后,Kubernetes 会自动创建一个 PV。
以下 StatefulSet 引用 my-custom-class
StorageClass,并预配 1 GiB 的卷:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: registry.k8s.io/nginx-slim:0.8
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates: # This is the specification in which you reference the StorageClass
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
storageClassName: my-custom-class # This field references the existing StorageClass
后续步骤
了解 GKE 中的永久性卷和动态预配。
在 GKE on AWS 上安装其他 CSI 驱动程序。
参考快速入门,部署您的第一个工作负载。