GKE on AWS 会自动部署适用于 Amazon Elastic Block Store (EBS) 的容器存储接口 (CSI) 驱动程序,以预配和管理集群中的 Amazon EBS 卷。
GKE on AWS EBS CSI 驱动程序版本与 GKE on AWS Kubernetes 版本相关联。此驱动程序版本通常是发布 GKE 版本时可用的最新版本。集群升级后,驱动程序会自动更新。
如何使用默认 StorageClass
如果在不设置字段 spec.storageClassName
的情况下创建 PersistentVolumeClaim,则系统会使用默认的 GKE on AWS EBS CSI 驱动程序 StorageClass 预配 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,它可预配吞吐量更高的 io1
卷。
您可以通过在 PVC 的 spec.storageclassName
中指定该 StorageClass 来使用它。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mypvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 30Gi
storageclassName: premium-rwo
如何使用自定义 StorageClass
您可以为 EBS 卷创建额外的 StorageClass,或者使用容器存储接口 (CSI) 驱动程序。
如果使用的是 EBS 卷或者特定 CSI 驱动程序,请选择使用自定义 StorageClass。
EBS 卷
您可以创建自己的自定义 StorageClass,用于指定 EBS 卷类型、文件系统类型和其他参数。您可以在 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 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 volumeBindingMode: WaitForFirstConsumer parameters: csi.storage.k8s.io/fsType: xfs type: st1
CSI 驱动程序
您可以在
provisioner
字段中指定其他 CSI 驱动程序。如需使用其他 CSI 驱动程序创建 StorageClass,您可以使用以下 YAML 示例。
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: CLASS_NAME provisioner: CSI_DRIVER_NAME volumeBindingMode: WaitForFirstConsumer parameters: ...
替换以下内容:
- 将
CSI_DRIVER_NAME
替换为 CSI 驱动程序的名称,例如csi.example.com
- 将
CLASS_NAME
替换为 StorageClass 的名称,例如my-custom-class
根据您的 CSI 驱动程序,配置
parameters
下的子字段。- 将
将 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 volumeBindingMode: WaitForFirstConsumer parameters: type: EBS_VOLUME_TYPE
请替换以下内容:
EBS_VOLUME_TYPE
:StorageClass 创建的 AWS EBS 卷类型。- 将
CLASS_NAME
替换为新 StorageClass 的名称
例如,以下 YAML 会创建一个新的默认 StorageClass,用于预配使用 XFS 文件系统格式化的吞吐量优化型 HDD EBS 卷。
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 volumeBindingMode: WaitForFirstConsumer parameters: csi.storage.k8s.io/fsType: xfs type: st1
将新的自定义类应用于您的集群。
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 集群上安装存储驱动程序。
参考快速入门,部署您的第一个工作负载。