安装容器存储接口驱动程序

本页面介绍如何将容器存储接口 (CSI) 存储驱动程序安装到 GKE on Bare Metal 集群。

概览

容器存储接口 (CSI) 是许多主流存储供应商支持的开放式标准 API,可让 Kubernetes 将任意存储系统提供给容器化工作负载。

Kubernetes 卷由特定于供应商的存储驱动程序管理,这些驱动程序历来被编译为 Kubernetes 二进制文件。以前,您无法使用未包含在 Kubernetes 中的存储驱动程序。安装 CSI 驱动程序会添加对 Kubernetes 本身不支持的存储系统的支持。此外,CSI 还支持使用现代存储功能,例如快照和调整大小。

如需使用 CSI 驱动程序,您需要创建一个 Kubernetes StorageClass。您可以将 CSI 驱动程序设置为 StorageClass 的预配工具。然后,您可以将 StorageClass 设置为集群的默认,或者将工作负载配置为使用 StorageClass(StatefulSet 示例)。

安装供应商的 CSI 驱动程序

存储供应商开发自己的 CSI 驱动程序,并负责提供安装说明。在简单情形中,安装可能只涉及将清单部署到集群。请参阅 CSI 文档中的 CSI 驱动程序列表。

对于生产存储,我们建议您安装来自 GKE Enterprise Ready 存储合作伙伴的 CSI 驱动程序。

验证驱动程序安装

安装 CSI 驱动程序之后,您可以运行以下命令来验证安装:

kubectl get csinodes -o jsonpath='{range .items[*]} \
    {.metadata.name}{": "} {range .spec.drivers[*]} {.name}{"\n"} {end}{end}'

使用 CSI 驱动程序

如需使用 CSI 驱动程序,请执行以下操作:

  1. 创建在相应的 provisioner 字段中引用驱动程序的 Kubernetes StorageClass

  2. 如需预配存储空间,您可以执行以下任一操作:

由 CSI 驱动程序支持的 StorageClass 的注意事项

创建 StorageClass 时,请考虑以下因素:

  • CSI 驱动程序文档应包含您提供给 StorageClass 的驱动程序专用参数,包括预配工具名称。
  • 您应该根据 StorageClass 的属性为其命名,而不是根据其后面的具体驱动程序或设备的名称。通过根据 StorageClass 的属性为其命名,您可以在多个集群和环境中创建具有相同名称的 StorageClass,并且您的应用可以在所有集群中获得具有相同属性的存储空间。

示例:在 StatefulSet 中引用 StorageClass

以下示例模拟如何在 StorageClass 中定义 CSI 驱动程序,然后在 StatefulSet 工作负载中引用 StorageClass。该示例假定驱动程序已安装到集群中。

下面是名为 premium-rwo 的简单 StorageClass,它使用虚构的 CSI 驱动程序 csi.example.com 作为其预配工具:

fast-sc.yaml

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: premium-rwo
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: premium-rwo # This field references the existing StorageClass

后续步骤