Harvester Cloud Provider

你可以使用内置的 Harvester 主机驱动在 Rancher 中配置 RKE1RKE2 集群。Harvester 会为这些 Kubernetes 集群提供负载均衡器和 Harvester 集群存储直通支持。

你将在本文中学习:

部署

前提

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

使用 Harvester 主机驱动部署到 RKE1 集群

使用 Harvester 主机驱动启动 RKE 集群时,你可以执行两个步骤来部署 Harvester 云提供商:

  1. 选择 Harvester(Out-of-tree) 选项。

    Harvester Cloud Provider - 图1

  2. 从 Rancher 应用市场中安装 Harvester Cloud Provider

    Harvester Cloud Provider - 图2

使用 Harvester 主机驱动部署到 RKE2 集群

使用 Harvester 主机驱动启动 RKE2 集群时,选择 Harvester 云提供商。然后,主机驱动将自动部署 CSI 驱动和 CCM。

Harvester Cloud Provider - 图3

使用 Harvester 主机驱动部署到 K3s 集群[实验性]

使用 Harvester 主机驱动启动 K3s 集群时,你可以执行以下步骤来部署 Harvester 云提供商:

  1. harvester-cloud-provider 生成并注入 Cloud Config。

云提供商需要一个 kubeconfig 文件才能工作,你可以使用 harvester/cloud-provider-harvester 仓库中的 generate_addon.sh 脚本来生成一个有限范围的文件。

Harvester Cloud Provider - 图4备注

该脚本依赖 kubectljq 来操作 Harvester 集群。

该脚本需要访问 Harvester 集群 kubeconfig 才能工作。

命名空间需要是将在其中创建 guest 集群的命名空间。

  1. ./deploy/generate_addon.sh <serviceaccount name> <namespace>

输出将如下所示:

  1. # ./deploy/generate_addon.sh harvester-cloud-provider default
  2. Creating target directory to hold files in ./tmp/kube...done
  3. Creating a service account in default namespace: harvester-cloud-provider
  4. W1104 16:10:21.234417 4319 helpers.go:663] --dry-run is deprecated and can be replaced with --dry-run=client.
  5. serviceaccount/harvester-cloud-provider configured
  6. Creating a role in default namespace: harvester-cloud-provider
  7. role.rbac.authorization.k8s.io/harvester-cloud-provider unchanged
  8. Creating a rolebinding in default namespace: harvester-cloud-provider
  9. W1104 16:10:21.986771 4369 helpers.go:663] --dry-run is deprecated and can be replaced with --dry-run=client.
  10. rolebinding.rbac.authorization.k8s.io/harvester-cloud-provider configured
  11. Getting uid of service account harvester-cloud-provider on default
  12. Service Account uid: ea951643-53d2-4ea8-a4aa-e1e72a9edc91
  13. Creating a user token secret in default namespace: harvester-cloud-provider-token
  14. Secret name: harvester-cloud-provider-token
  15. Extracting ca.crt from secret...done
  16. Getting user token from secret...done
  17. Setting current context to: local
  18. Cluster name: local
  19. Endpoint: https://HARVESTER_ENDPOINT/k8s/clusters/local
  20. Preparing k8s-harvester-cloud-provider-default-conf
  21. Setting a cluster entry in kubeconfig...Cluster "local" set.
  22. Setting token credentials entry in kubeconfig...User "harvester-cloud-provider-default-local" set.
  23. Setting a context entry in kubeconfig...Context "harvester-cloud-provider-default-local" created.
  24. Setting the current-context in the kubeconfig file...Switched to context "harvester-cloud-provider-default-local".
  25. ########## cloud config ############
  26. apiVersion: v1
  27. clusters:
  28. - cluster:
  29. certificate-authority-data: <CACERT>
  30. server: https://HARVESTER-ENDPOINT/k8s/clusters/local
  31. name: local
  32. contexts:
  33. - context:
  34. cluster: local
  35. namespace: default
  36. user: harvester-cloud-provider-default-local
  37. name: harvester-cloud-provider-default-local
  38. current-context: harvester-cloud-provider-default-local
  39. kind: Config
  40. preferences: {}
  41. users:
  42. - name: harvester-cloud-provider-default-local
  43. user:
  44. token: <TOKEN>
  45. ########## cloud-init user data ############
  46. write_files:
  47. - encoding: b64
  48. content: <CONTENT>
  49. owner: root:root
  50. path: /etc/kubernetes/cloud-config
  51. permissions: '0644'

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

Harvester Cloud Provider - 图5

  1. harvester-cloud-provider 的以下 HelmChart YAML 添加到 Cluster Configuration > Add-On Config > Additional Manifest
  1. apiVersion: helm.cattle.io/v1
  2. kind: HelmChart
  3. metadata:
  4. name: harvester-cloud-provider
  5. namespace: kube-system
  6. spec:
  7. targetNamespace: kube-system
  8. bootstrap: true
  9. repo: https://charts.harvesterhci.io/
  10. chart: harvester-cloud-provider
  11. version: 0.1.13
  12. helmVersion: v3

Harvester Cloud Provider - 图6

  1. 通过以下方式禁用树内云提供商
  • 单击 Edit as YAML 按钮

Harvester Cloud Provider - 图7

  • 禁用 servicelb 并设置 disable-cloud-controller: true 来禁用默认的 K3s 云控制器。
  1. machineGlobalConfig:
  2. disable:
  3. - servicelb
  4. disable-cloud-controller: true
  • 添加 cloud-provider=external 以使用 Harvester 云提供商。
  1. machineSelectorConfig:
  2. - config:
  3. kubelet-arg:
  4. - cloud-provider=external
  5. protect-kernel-defaults: false

Harvester Cloud Provider - 图8

有了这些设置,K3s 集群应该可以在你使用外部云提供商时成功配置。

升级 Cloud Provider

升级 RKE2

你可以通过升级 RKE2 版本来升级 Cloud Provider。要升级 RKE2 集群,你可以在 Rancher UI 中执行以下操作:

  1. 单击 ☰ > Cluster Management
  2. 找到要升级的 guest 集群,然后选择 ⋮ > Edit Config
  3. 选择 Kubernetes Version
  4. 单击 Save

升级 RKE/K3s

你可以通过 Rancher UI 升级 RKE/K3s cloud provider,如下所示:

  1. 单击 ☰ > RKE/K3s Cluster > Apps > Installed Apps
  2. 找到 cloud provider 表并选择 ⋮ > Edit/Upgrade
  3. 选择 Version
  4. 单击 Next > Update

负载均衡器支持

部署 Harvester Cloud Provider 后,你可以使用 Kubernetes LoadBalancer 服务将集群内的微服务公开给外部。在你创建 Kubernetes LoadBalancer 服务时,会为该服务分配一个 Harvester 负载均衡器,你可以通过 Rancher UI 中的 Add-on Config 对其进行编辑。

Harvester Cloud Provider - 图9

IPAM

Harvester 的内置负载均衡器同时支持 pooldhcp 模式。你可以在 Rancher UI 中选择模式,随后 Harvester 将注释 cloudprovider.harvesterhci.io/ipam 添加到后面的服务中。

  • pool:需要提前在 Harvester 的 Settings 中配置一个 IP 地址池。Harvester LoadBalancer Controller 将从 IP 地址池中为负载均衡器分配一个 IP 地址。

    Harvester Cloud Provider - 图10

  • dhcp:需要 DHCP 服务器。Harvester LoadBalancer Controller 将从 DHCP 服务器请求 IP 地址。

Harvester Cloud Provider - 图11备注

不允许修改 IPAM 模式。如果需要修改 IPAM 模式,你需要创建一个新服务。

健康检查

Harvester 负载均衡器支持 TCP 健康检查。如果启用了健康检查选项,你可以在 Rancher UI 中指定参数。

你也可以手动将注释添加到服务来指定参数。支持以下注释:

注释键值类型是否必须描述
cloudprovider.harvesterhci.io/healthcheck-portstringtrue指定端口。探针将访问由后端服务器 IP 和端口组成的地址。
cloudprovider.harvesterhci.io/healthcheck-success-thresholdstringfalse指定健康检查成功阈值。默认值为 1。如果探针连续检测到某个地址的成功次数达到成功阈值,后端服务器就可以开始转发流量。
cloudprovider.harvesterhci.io/healthcheck-failure-thresholdstringfalse指定健康检查失败阈值。默认值为 3。如果健康检查失败的数量达到失败阈值,后端服务器将停止转发流量。
cloudprovider.harvesterhci.io/healthcheck-periodsecondsstringfalse指定健康检查周期。默认值为 5 秒。
cloudprovider.harvesterhci.io/healthcheck-timeoutsecondsstringfalse指定每次健康检查的超时时间。默认值为 3 秒。