Harvester CSI Driver

Harvester CSI Driver 提供了一个标准的 CSI 接口,供 Harvester 中所创建的 Kubernetes 集群使用。这个 CIS 接口连接到主机集群,并将主机卷热插拔到虚拟机来提供裸金属集群磁盘的存储性能。

部署

前提

  • Kubernetes 集群是在 Harvester 虚拟机之上构建的。
  • 作为 Kubernetes 节点运行的 Harvester 虚拟机位于相同的命名空间中。

Harvester CSI Driver - 图1备注

目前,Harvester CSI Driver 仅支持单节点读写 (RWO) 卷。请留意 issue #1992 以获得后续多节点 read-only (ROX) 和 read-write (RWX) 的支持。

使用 Harvester RKE1 主机驱动进行部署

  • 选择 Harvester(Out-of-tree) 选项(可选,如不需要同时使用 Cloud Provider 功能可以选择 None 选项)。

    Harvester CSI Driver - 图2

  • 从 Rancher 应用市场安装 Harvester CSI Driver

    Harvester CSI Driver - 图3

使用 Harvester RKE2 主机驱动进行部署

当使用 Rancher RKE2 主机驱动启动 Kubernetes 集群时,Harvester CSI Driver 会在选中 Harvester 云提供商后被自动部署。

select-harvester-cloud-provider

在 RKE2 集群中手动安装 CSI Driver

如果你想在不启用 Harvester 云提供商的情况下部署 Harvester CSI Driver,在 Cloud Provider 字段中选择 Default - RKE2 EmbeddedExternal。如果你使用的是 Rancher v2.6,请选择 None

Harvester CSI Driver - 图5

前提

确保你满足以下前提条件:

  • 系统上安装了 kubectljq
  • 你拥有裸机 Harvester 集群的 kubeconfig 文件。

    1. export KUBECONFIG=/path/to/your/harvester-kubeconfig

Harvester CSI Driver - 图6

执行以下步骤手动部署 Harvester CSI Driver:

部署 Harvester CSI Driver

  1. 生成 cloud-config。

    你可以使用 generate_addon_csi.sh 脚本生成 kubeconfig 文件。你可以在 harvester/harvester-csi-driver 仓库中找到该文件。按照以下步骤获取 cloud-configcloud-init 数据:

    <serviceaccount name> 通常对应 Guest 集群的名称(下图中 Cluster Name 的值),<namespace> 需要匹配 Guest 集群的命名空间(Namespace 的值)。

    1. # ./generate_addon_csi.sh <serviceaccount name> <namespace> RKE2
    1. ########## cloud-config ############
    2. apiVersion: v1
    3. clusters:
    4. - cluster: <token>
    5. server: https://<YOUR HOST HARVESTER VIP>:6443
    6. name: default
    7. contexts:
    8. - context:
    9. cluster: default
    10. namespace: default
    11. user: rke2-guest-01-default-default
    12. name: rke2-guest-01-default-default
    13. current-context: rke2-guest-01-default-default
    14. kind: Config
    15. preferences: {}
    16. users:
    17. - name: rke2-guest-01-default-default
    18. user:
    19. token: <token>
    20. ########## cloud-init user data ############
    21. write_files:
    22. - encoding: b64
    23. content: YXBpVmVyc2lvbjogdjEKY2x1c3RlcnM6Ci0gY2x1c3RlcjoKICAgIGNlcnRpZmljYXRlLWF1dGhvcml0eS1kYXRhOiBMUzB0TFMxQ1JVZEpUaUJEUlZKVVNVWkpRMEZVUlMwdExTMHRDazFKU1VKbFZFTkRRVklyWjBGM1NVSkJaMGxDUVVSQlMwSm5aM0ZvYTJwUFVGRlJSRUZxUVd0TlUwbDNTVUZaUkZaUlVVUkVRbXg1WVRKVmVVeFlUbXdLWTI1YWJHTnBNV3BaVlVGNFRtcG5NVTE2VlhoT1JGRjNUVUkwV0VSVVNYcE5SRlY1VDFSQk5VMVVRVEJOUm05WVJGUk5lazFFVlhsT2FrRTFUVlJCTUFwTlJtOTNTa1JGYVUxRFFVZEJNVlZGUVhkM1dtTnRkR3hOYVRGNldsaEtNbHBZU1hSWk1rWkJUVlJaTkU1VVRURk5WRkV3VFVSQ1drMUNUVWRDZVhGSENsTk5ORGxCWjBWSFEwTnhSMU5OTkRsQmQwVklRVEJKUVVKSmQzRmFZMDVTVjBWU2FsQlVkalJsTUhFMk0ySmxTSEZEZDFWelducGtRa3BsU0VWbFpHTUtOVEJaUTNKTFNISklhbWdyTDJab2VXUklNME5ZVURNeFZXMWxTM1ZaVDBsVGRIVnZVbGx4YVdJMGFFZE5aekpxVVdwQ1FVMUJORWRCTVZWa1JIZEZRZ292ZDFGRlFYZEpRM0JFUVZCQ1owNVdTRkpOUWtGbU9FVkNWRUZFUVZGSUwwMUNNRWRCTVZWa1JHZFJWMEpDVWpaRGEzbEJOSEZqYldKSlVESlFWVW81Q2xacWJWVTNVV2R2WjJwQlMwSm5aM0ZvYTJwUFVGRlJSRUZuVGtsQlJFSkdRV2xCZUZKNU4xUTNRMVpEYVZWTVdFMDRZazVaVWtWek1HSnBZbWxVSzJzS1kwRnhlVmt5Tm5CaGMwcHpMM2RKYUVGTVNsQnFVVzVxZEcwMVptNTZWR3AxUVVsblRuTkdibFozWkZRMldXWXpieTg0ZFRsS05tMWhSR2RXQ2kwdExTMHRSVTVFSUVORlVsUkpSa2xEUVZSRkxTMHRMUzBLCiAgICBzZXJ2ZXI6IGh0dHBzOi8vMTkyLjE2OC4wLjEzMTo2NDQzCiAgbmFtZTogZGVmYXVsdApjb250ZXh0czoKLSBjb250ZXh0OgogICAgY2x1c3RlcjogZGVmYXVsdAogICAgbmFtZXNwYWNlOiBkZWZhdWx0CiAgICB1c2VyOiBya2UyLWd1ZXN0LTAxLWRlZmF1bHQtZGVmYXVsdAogIG5hbWU6IHJrZTItZ3Vlc3QtMDEtZGVmYXVsdC1kZWZhdWx0CmN1cnJlbnQtY29udGV4dDogcmtlMi1ndWVzdC0wMS1kZWZhdWx0LWRlZmF1bHQKa2luZDogQ29uZmlnCnByZWZlcmVuY2VzOiB7fQp1c2VyczoKLSBuYW1lOiBya2UyLWd1ZXN0LTAxLWRlZmF1bHQtZGVmYXVsdAogIHVzZXI6CiAgICB0b2tlbjogZXlKaGJHY2lPaUpTVXpJMU5pSXNJbXRwWkNJNklreGhUazQxUTBsMWFsTnRORE5TVFZKS00waE9UbGszTkV0amNVeEtjM1JSV1RoYVpUbGZVazA0YW1zaWZRLmV5SnBjM01pT2lKcmRXSmxjbTVsZEdWekwzTmxjblpwWTJWaFkyTnZkVzUwSWl3aWEzVmlaWEp1WlhSbGN5NXBieTl6WlhKMmFXTmxZV05qYjNWdWRDOXVZVzFsYzNCaFkyVWlPaUprWldaaGRXeDBJaXdpYTNWaVpYSnVaWFJsY3k1cGJ5OXpaWEoyYVdObFlXTmpiM1Z1ZEM5elpXTnlaWFF1Ym1GdFpTSTZJbkpyWlRJdFozVmxjM1F0TURFdGRHOXJaVzRpTENKcmRXSmxjbTVsZEdWekxtbHZMM05sY25acFkyVmhZMk52ZFc1MEwzTmxjblpwWTJVdFlXTmpiM1Z1ZEM1dVlXMWxJam9pY210bE1pMW5kV1Z6ZEMwd01TSXNJbXQxWW1WeWJtVjBaWE11YVc4dmMyVnlkbWxqWldGalkyOTFiblF2YzJWeWRtbGpaUzFoWTJOdmRXNTBMblZwWkNJNkltTXlZak5sTldGaExUWTBNMlF0TkRkbU1pMDROemt3TFRjeU5qWXpNbVl4Wm1aaU5pSXNJbk4xWWlJNkluTjVjM1JsYlRwelpYSjJhV05sWVdOamIzVnVkRHBrWldaaGRXeDBPbkpyWlRJdFozVmxjM1F0TURFaWZRLmFRZmU1d19ERFRsSWJMYnUzWUVFY3hmR29INGY1VnhVdmpaajJDaWlhcXB6VWI0dUYwLUR0cnRsa3JUM19ZemdXbENRVVVUNzNja1BuQmdTZ2FWNDhhdmlfSjJvdUFVZC04djN5d3M0eXpjLVFsTVV0MV9ScGJkUURzXzd6SDVYeUVIREJ1dVNkaTVrRWMweHk0X0tDQ2IwRHQ0OGFoSVhnNlMwRDdJUzFfVkR3MmdEa24wcDVXUnFFd0xmSjdEbHJDOFEzRkNUdGhpUkVHZkUzcmJGYUdOMjdfamR2cUo4WXlJQVd4RHAtVHVNT1pKZUNObXRtUzVvQXpIN3hOZlhRTlZ2ZU05X29tX3FaVnhuTzFEanllbWdvNG9OSEpzekp1VWliRGxxTVZiMS1oQUxYSjZXR1Z2RURxSTlna1JlSWtkX3JqS2tyY3lYaGhaN3lTZ3o3QQo=
    24. owner: root:root
    25. path: /var/lib/rancher/rke2/etc/config-files/cloud-provider-config
    26. permissions: '0644'

    cloud-init user data 下的输出复制并粘贴到 Machine Pools >Show Advanced > User Data

  2. 设置 cloud-provider-config。

    应用上述 cloud-init 用户数据后,你需要创建 cloud-provider-config。

    你可以再次检查路径 /var/lib/rancher/rke2/etc/config-files/cloud-provider-config

    Harvester CSI Driver - 图7备注

    要更改 cloud-provider-config 路径,你需要更新 cloud-init 用户数据。

  3. 安装 Harvester CSI Driver。

    从 Rancher 应用市场安装 Harvester CSI Driver chart(请注意,默认情况下不需要更改 cloud-config 路径)。 Harvester CSI Driver - 图8

    Harvester CSI Driver - 图9

执行上述步骤后,你应该能够看些 CSI Driver pod 已启动并运行,要进行验证,你可以使用默认 storageClass harvester 来配置新的 PVC。

使用 Harvester K3s 主机驱动进行部署

你可以按照前提中 RKE2 部分描述的部署 Harvester CSI Driver 步骤进行操作。

唯一的区别是你需要如下更改脚本命令:

  1. # ./generate_addon_csi.sh <serviceaccount name> <namespace> k3s

直通自定义存储类

从 Harvester CSI Driver v0.1.15 开始,你可以基于不同的 StorageClass 创建 PersistentVolumeClaim (PVC)。

从以下 RKE2 版本开始,我们开箱即用地支持 Harvester CSI Driver v0.1.15。如果你是用的是 RKE1,则需要手动安装 CSI Driver Chart:

  • v1.23.16+rke2r1 and later
  • v1.24.10+rke2r1 and later
  • v1.25.6+rke2r1 and later
  • v1.26.1+rke2r1 and later
  • v1.27.1+rke2r1 and later

前提

请将以下内容添加到你的 Harvester 集群中。Harvester CSI Driver 需要适当的 RBAC 才能显示错误消息。这对于在使用不存在的 StorageClass 创建 PVC 时显示错误消息很重要,如下图所示。

Harvester CSI Driver - 图10

执行以下步骤来设置 RBAC 以启用错误消息查看。

  1. 使用以下清单创建一个名为 harvesterhci.io:csi-driver 的新 clusterrole

    1. apiVersion: rbac.authorization.k8s.io/v1
    2. kind: ClusterRole
    3. metadata:
    4. labels:
    5. app.kubernetes.io/component: apiserver
    6. app.kubernetes.io/name: harvester
    7. app.kubernetes.io/part-of: harvester
    8. name: harvesterhci.io:csi-driver
    9. rules:
    10. - apiGroups:
    11. - storage.k8s.io
    12. resources:
    13. - storageclasses
    14. verbs:
    15. - get
    16. - list
    17. - watch
  2. 然后,使用以下清单创建 clusterrolebinding 以关联新的 clusterrole

    1. apiVersion: rbac.authorization.k8s.io/v1
    2. kind: ClusterRoleBinding
    3. metadata:
    4. name: <namespace>-<serviceaccount name>
    5. roleRef:
    6. apiGroup: rbac.authorization.k8s.io
    7. kind: ClusterRole
    8. name: harvesterhci.io:csi-driver
    9. subjects:
    10. - kind: ServiceAccount
    11. name: <serviceaccount name>
    12. namespace: <namespace>

确保 serviceaccount namenamespace 与你的云提供商匹配。执行以下步骤来查看你云提供商的 serviceaccount namenamespace

  1. 找到你的云提供商的 rolebinding

    1. # kubectl get rolebinding -A |grep harvesterhci.io:cloudprovider
    2. default default-rke2-guest-01 ClusterRole/harvesterhci.io:cloudprovider 7d1h
  2. 获取此 rolebindingsubjects 信息。

    1. kubectl get rolebinding default-rke2-guest-01 -n default -o yaml |yq -e '.subjects'
  3. 找到如下 ServiceAccount 信息:

    1. - kind: ServiceAccount
    2. name: rke2-guest-01
    3. namespace: default

部署

  1. 创建一个要在 Guest K8s 集群中使用的新 StorageClass。你可以参考 StorageClasses 了解更多详情。

    如下图所示,新建一个名为 replica-2 的 StorageClass。

    Harvester CSI Driver - 图11

    例如,如下所示在下游集群上创建一个名为 replica-2 的新 StorageClass,与在 Harvester 集群上创建的 StorageClass 相关联。

    Harvester CSI Driver - 图12

    Harvester CSI Driver - 图13备注

    Provisioner 中选择 Harvester (CSI)Host StorageClass 是在 Harvester 集群上创建的 StorageClass。

  2. 你现在可以基于这个新的 StorageClass 创建 PVC,它使用 Host StorageClass 在裸机集群上配置卷。