本主题介绍如何将容器存储接口(CSI)存储驱动程序安装到 GKE On-Prem 集群。
概览
CSI 是一种开放式标准 API,可让 Kubernetes 将任意存储系统提供给容器化工作负载。当您将 CSI 兼容的存储驱动程序部署到 GKE On-Prem 集群时,该集群可直接连接到兼容的存储设备,无需通过 vSphere 存储。
Kubernetes 卷由特定于供应商的存储驱动程序管理,这些驱动程序历来被编译为 Kubernetes 二进制文件。以前,您无法使用未包含在 Kubernetes 中的存储驱动程序。安装 CSI 驱动程序会添加对 Kubernetes 本身不支持的存储系统的支持。此外,CSI 还支持使用现代存储功能,例如快照和调整大小。
如需使用 CSI 驱动程序,您需要创建一个 Kubernetes StorageClass。您可以将 CSI 驱动程序设置为 StorageClass 的预配工具。然后,您可以将 StorageClass 设置为集群的默认类别,或使用 StorageClass(StatefulSet 示例)配置工作负载。
准备工作
查看 Kubernetes 的树内卷插件,并确认 Kubernetes 是否已包含您的驱动程序。
默认情况下,GKE On-Prem 会通过内置的 vsphereVolume 驱动程序使用 vSphere 数据存储区。此外,NFS 和 iSCSI 的内置驱动程序可以将现有卷附加并装载到您的工作负载中。
安装供应商的 CSI 驱动程序
存储供应商开发自己的 CSI 驱动程序,并负责提供安装说明。在简单情形中,安装可能只涉及将清单部署到集群。请参阅 CSI 文档中的 CSI 驱动程序列表。
验证驱动程序安装
安装 CSI 驱动程序后,您可以根据集群的 GKE On-Prem 版本运行以下命令之一来验证安装:
1.2.0-gke.5
kubectl get csinodes \ -o jsonpath='{range .items[*]} {.metadata.name}{": "} {range .spec.drivers[*]} {.name}{"\n"} {end}{end}'
1.1.0-gke.6
kubectl get nodes \ -o jsonpath='{.items[*].metadata.annotations.csi\.volume\.kubernetes\.io\/nodeid}'
使用 CSI 驱动程序
如需使用 CSI 驱动程序,请执行以下操作:
创建在相应的
provisioner
字段中引用驱动程序的 Kubernetes StorageClass。如需预配存储空间,您可以执行以下任一操作:
- 在 StatefulSet 的
volumeClaimTemplates
规范中引用 StorageClass。 - 将其设置为集群的默认 StorageClass。
- 在 StatefulSet 的
由 CSI 驱动程序支持的 StorageClass 的注意事项
创建 StorageClass 时,请考虑以下因素:
- CSI 驱动程序文档应包含您提供给 StorageClass 的驱动程序专用参数,包括预配工具名称。
- 您应根据 StorageClass 的属性(“快速”或“高度冗余”)为其命名,而不是根据特定驱动程序或其后设备的名称来命名。 通过根据 StorageClass 的属性为其命名,您可以在多个集群和环境中创建具有相同名称的 StorageClass,并且您的应用可以在所有集群中获得具有相同属性的存储空间。
示例:StatefulSet 中的参考 StorageClass
以下示例模拟如何在 StorageClass 中定义 CSI 驱动程序,然后在 StatefulSet 工作负载中引用 StorageClass。该示例假定驱动程序已安装到集群中。
下面是名为 fast
的简单 StorageClass,它使用虚构的 CSI 驱动程序 csi.example.com
作为其预配工具:
fast-sc.yaml
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: fast provisioner: csi.example.com # CSI driver parameters: # You provide vendor-specific parameters to this specification type: example-parameter # Be sure to follow the vendor's instructions datastore: my-datastore reclaimPolicy: Retain allowVolumeExpansion: true
您可以在 StatefulSet 的 volumeClaimTemplates
规范中引用 StorageClass。
当您在 StatefulSet 的 volumeClaimTemplates
规范中引用 StorageClass 时,Kubernetes 会使用 PersistentVolume (PV) 提供稳定的存储。Kubernetes 会调用在 StorageClass 中定义的预配工具以创建新的存储卷。在这种情况下,Kubernetes 会调用虚构的 csi.example.com
提供程序(它会调用自身的 API)来创建卷。预配了卷之后,Kubernetes 会自动创建 PV 来代表存储。
以下是引用 StorageClass 的简单 StatefulSet:
statefulset.yaml
apiVersion: apps/v1 kind: StatefulSet metadata: name: web spec: replicas: 2 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: fast # This field references the existing StorageClass