手动安装 CSI 驱动程序


本页面介绍如何在 Google Kubernetes Engine (GKE) 集群中安装容器存储接口 (CSI) 存储驱动程序。

如果您使用的是 Compute Engine 永久性磁盘 CSI 驱动程序,我们建议您自动部署该驱动程序以减少管理开销。

概览

CSI 是一种开放式标准 API,可让 Kubernetes 将任意存储系统提供给容器化工作负载。Kubernetes 卷由特定于供应商的存储驱动程序管理,这些驱动程序历来被编译为 Kubernetes 二进制文件。以前,您无法使用未包含在 Kubernetes 中的存储驱动程序。安装 CSI 驱动程序会添加对 Kubernetes 本身不支持的存储系统的支持。此外,CSI 还支持使用现代存储功能,例如快照和调整大小。

安装供应商的 CSI 驱动程序

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

验证驱动程序安装

安装 CSI 驱动程序后,您可以根据集群的 GKE 版本运行以下某一命令来验证安装:

1.14+

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

1.13.x

kubectl get nodes \
-o jsonpath='{.items[*].metadata.annotations.csi\.volume\.kubernetes\.io\/nodeid}'

使用 CSI 驱动程序

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

  1. 如果驱动程序安装过程中未为您创建 StorageClass,请创建在相应的 provisioner 字段中引用驱动程序的 Kubernetes StorageClass。某些 CSI 驱动程序会在您安装它们时部署 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 提供稳定的存储。Kubernetes 会调用在 StorageClass 中定义的预配工具以创建新的存储卷。在这种情况下,Kubernetes 会调用虚构的 csi.example.com 提供程序(它会调用自身的 API)来创建卷。预配了卷之后,Kubernetes 会自动创建 PersistentVolume 来代表存储。

以下是引用 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: k8s.gcr.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

后续步骤