跳至主要内容

Harvester Cloud Provider

可以使用內建的 Harvester Node Driver 在 Rancher 中佈建 RKE2 叢集。Harvester 為客體 Kubernetes 叢集提供負載平衡器和 Harvester 叢集儲存透通支援。

在本頁中,我們將學習:

向後相容性注意事項​

備註

如果您使用的是 Harvester cloud provider v0.2.2 或更高版本,請注意一個已知的向後相容性問題。如果您的 Harvester 版本低於 v1.2.0,且您打算使用較新的 RKE2 版本(即 >= v1.26.6+rke2r1、v1.25.11+rke2r1、v1.24.15+rke2r1),在升級客體 Kubernetes 叢集或 Harvester cloud provider 之前,必須先將 Harvester 叢集升級到 v1.2.0 或更高版本。

有關詳細的支援矩陣,請參閱官方網站的 Harvester CCM & CSI Driver with RKE2 Releases 部分。

部署​

先決條件​

  • Kubernetes 叢集建構在 Harvester 虛擬機器之上。
  • 作為客體 Kubernetes 節點執行的 Harvester 虛擬機器位於相同的命名空間中。
important

每個 Harvester VM 都必須具有 macvlan 核心模組,這是 DHCP IPAM 模式的 LoadBalancer 服務所必需的。

若要檢查核心模組是否可用,請存取 VM 並執行以下命令:

lsmod | grep macvlan
sudo modprobe macvlan

如果發生以下情況,則核心模組可能不存在:

  • $ lsmod | grep macvlan 沒有產生輸出。
  • $ sudo modprobe macvlan 顯示類似 modprobe: FATAL: Module macvlan not found in directory /lib/modules/5.14.21-150400.22-default 的錯誤訊息。

預設情況下,macvlan 核心模組不包含在 SUSE Linux Enterprise 15 Service Pack 4/5/6 最小雲端映像中(請參閱 Issue #6418)。這些映像包含 kernel-default-base 套件,其中僅包含基本模組。但是,當您安裝 kernel-default 套件時,macvlan 核心驅動程式就會變為可用。

為了消除客體叢集佈建後手動干預的需要,請使用 openSUSE Build Service(OBS)建構您自己的雲端映像。您必須在 Minimal.kiwi 檔案中移除 kernel-default-base 套件並新增 kernel-default 套件,以確保產生的雲端映像包含 macvlan 核心模組。更多資訊請參閱自訂 SUSE VM 映像。

使用 Harvester Node Driver 部署到 RKE2 叢集​

使用 Harvester node driver 啟動 RKE2 叢集時,選擇 Harvester cloud provider。node driver 將自動協助部署 CSI 驅動程式和 CCM。

從 Rancher v2.9.0 開始,您可以使用 Data directory configuration path 欄位為雲端設定資料設定特定資料夾。

手動部署到 RKE2 叢集​

  1. 使用腳本 generate_addon.sh 產生雲端設定資料,然後將資料放置在每個自訂節點上(目錄:/etc/kubernetes/cloud-config)。

    curl -sfL https://raw.githubusercontent.com/harvester/cloud-provider-harvester/master/deploy/generate_addon.sh | bash -s <serviceaccount name> <namespace>
    備註

    該腳本在操作 Harvester 叢集時依賴 kubectl 和 jq,並且僅在能夠存取 Harvester Cluster kubeconfig 檔案時才能運作。

    您可以在其中一個 Harvester 管理節點的 /etc/rancher/rke2/rke2.yaml 路徑中找到 kubeconfig 檔案。伺服器 IP 必須替換為 VIP 位址。

    內容範例:

    apiVersion: v1
    clusters:
    - cluster:
    certificate-authority-data: <redacted>
    server: https://127.0.0.1:6443
    name: default
    # ...

    您必須指定將建立客體叢集的命名空間。

    輸出範例:

    ########## cloud config ############
    apiVersion: v1
    clusters:
    - cluster:
    certificate-authority-data: <CACERT>
    server: https://HARVESTER-ENDPOINT/k8s/clusters/local
    name: local
    contexts:
    - context:
    cluster: local
    namespace: default
    user: harvester-cloud-provider-default-local
    name: harvester-cloud-provider-default-local
    current-context: harvester-cloud-provider-default-local
    kind: Config
    preferences: {}
    users:
    - name: harvester-cloud-provider-default-local
    user:
    token: <TOKEN>
    ########## cloud-init user data ############
    write_files:
    - encoding: b64
    content: <CONTENT>
    owner: root:root
    path: /etc/kubernetes/cloud-config
    permissions: '0644'
  2. 在 RKE2 叢集建立頁面上,前往 Cluster Configuration 畫面,並將 Cloud Provider 的值設定為 External。

  3. 將 cloud-init user data 內容複製並貼上到 Machine Pools > Show Advanced > User Data。

  4. 將 harvester-cloud-provider 的 HelmChart CRD 新增到 Cluster Configuration > Add-On Config > Additional Manifest。

    您必須將 <cluster-name> 替換為您的叢集名稱。

    apiVersion: helm.cattle.io/v1
    kind: HelmChart
    metadata:
    name: harvester-cloud-provider
    namespace: kube-system
    spec:
    targetNamespace: kube-system
    bootstrap: true
    repo: https://raw.githubusercontent.com/rancher/charts/dev-v2.9
    chart: harvester-cloud-provider
    version: 104.0.2+up0.2.6
    helmVersion: v3
    valuesContent: |-
    global:
    cattle:
    clusterName: <cluster-name>

  5. 若要建立負載平衡器,請新增 annotation cloudprovider.harvesterhci.io/ipam: <dhcp|pool>。

部署到 RKE2 自訂叢集(實驗性)​

  1. 使用腳本 generate_addon.sh 產生雲端設定資料,然後將資料放置在每個自訂節點上(目錄:/etc/kubernetes/cloud-config)。

    curl -sfL https://raw.githubusercontent.com/harvester/cloud-provider-harvester/master/deploy/generate_addon.sh | bash -s <serviceaccount name> <namespace>
    備註

    該腳本在操作 Harvester 叢集時依賴 kubectl 和 jq,並且僅在能夠存取 Harvester Cluster kubeconfig 檔案時才能運作。

    您可以在其中一個 Harvester 管理節點的 /etc/rancher/rke2/rke2.yaml 路徑中找到 kubeconfig 檔案。伺服器 IP 必須替換為 VIP 位址。

    內容範例:

    apiVersion: v1
    clusters:
    - cluster:
    certificate-authority-data: <redacted>
    server: https://127.0.0.1:6443
    name: default
    # ...

    您必須指定將建立客體叢集的命名空間。

    輸出範例:

    ########## cloud config ############
    apiVersion: v1
    clusters:
    - cluster:
    certificate-authority-data: <CACERT>
    server: https://HARVESTER-ENDPOINT/k8s/clusters/local
    name: local
    contexts:
    - context:
    cluster: local
    namespace: default
    user: harvester-cloud-provider-default-local
    name: harvester-cloud-provider-default-local
    current-context: harvester-cloud-provider-default-local
    kind: Config
    preferences: {}
    users:
    - name: harvester-cloud-provider-default-local
    user:
    token: <TOKEN>
    ########## cloud-init user data ############
    write_files:
    - encoding: b64
    content: <CONTENT>
    owner: root:root
    path: /etc/kubernetes/cloud-config
    permissions: '0644'
  2. 使用以下設定在 Harvester 叢集中建立 VM:

    • Basics 標籤頁:最低需求為 2 個 CPU 和 4 GiB RAM。所需的磁碟空間取決於 VM 映像。

    • Networks 標籤頁:指定格式為 nic-<number> 的網路名稱。

    • Advanced Options 標籤頁:複製並貼上 Cloud Config User Data 畫面的內容。

  3. 在 Cluster Configuration 畫面的 Basics 標籤頁上,選擇 Harvester 作為 Cloud Provider,然後選擇 Create 以啟動叢集。

  4. 在 Registration 標籤頁上,執行在 VM 上執行 RKE2 註冊命令所需的步驟。

使用 Harvester node driver 部署到 K3s 叢集(實驗性)​

使用 Harvester node driver 啟動 K3s 叢集時,您可以執行以下步驟來部署 harvester cloud provider:

  1. 使用 generate_addon.sh 產生雲端設定。

    curl -sfL https://raw.githubusercontent.com/harvester/cloud-provider-harvester/master/deploy/generate_addon.sh | bash -s <serviceaccount name> <namespace>

    輸出將如下所示:

    ########## cloud config ############
    apiVersion: v1
    clusters:
    - cluster:
    certificate-authority-data: <CACERT>
    server: https://HARVESTER-ENDPOINT/k8s/clusters/local
    name: local
    contexts:
    - context:
    cluster: local
    namespace: default
    user: harvester-cloud-provider-default-local
    name: harvester-cloud-provider-default-local
    current-context: harvester-cloud-provider-default-local
    kind: Config
    preferences: {}
    users:
    - name: harvester-cloud-provider-default-local
    user:
    token: <TOKEN>
    ########## cloud-init user data ############
    write_files:
    - encoding: b64
    content: <CONTENT>
    owner: root:root
    path: /etc/kubernetes/cloud-config
    permissions: '0644'
  2. 將 cloud-init user data 內容複製並貼上到 Machine Pools > Show Advanced > User Data。

  3. 將以下 harvester-cloud-provider 的 HelmChart yaml 新增到 Cluster Configuration > Add-On Config > Additional Manifest。

    apiVersion: helm.cattle.io/v1
    kind: HelmChart
    metadata:
    name: harvester-cloud-provider
    namespace: kube-system
    spec:
    targetNamespace: kube-system
    bootstrap: true
    repo: https://charts.harvesterhci.io/
    chart: harvester-cloud-provider
    version: 0.2.2
    helmVersion: v3

  4. 透過以下方式停用 in-tree cloud provider:

    • 點擊 Edit as YAML 按鈕。

    • 停用 servicelb 並設定 disable-cloud-controller: true 以停用預設的 K3s cloud controller。

      machineGlobalConfig:
      disable:
      - servicelb
      disable-cloud-controller: true
    • 新增 cloud-provider=external 以使用 Harvester cloud provider。

      machineSelectorConfig:
      - config:
      kubelet-arg:
      - cloud-provider=external
      protect-kernel-defaults: false

完成這些設定後,K3s 叢集應該可以在使用外部 cloud provider 的同時成功佈建。

升級 Cloud Provider​

升級 RKE2​

可以透過升級 RKE2 版本來升級 cloud provider。您可以透過 Rancher UI 升級 RKE2 叢集,步驟如下:

  1. 點擊 ☰ > Cluster Management。
  2. 找到您要升級的客體叢集,然後選擇 ⋮ > Edit Config。
  3. 選擇 Kubernetes Version。
  4. 點擊 Save。

升級 K3s​

透過 Rancher UI 升級 K3s cloud provider,步驟如下:

  1. 點擊 ☰ > K3s Cluster > Apps > Installed Apps。
  2. 找到 cloud provider chart,然後選擇 ⋮ > Edit/Upgrade。
  3. 選擇 Version。
  4. 點擊 Next > Update。
資訊

當新的 harvester-cloud-provider pod 卡在 Pending 狀態時,單節點客體叢集的升級過程可能會停滯。此問題是由 harvester-cloud-provider 部署中描述滾動更新策略的部分造成的。具體來說,預設值與單節點叢集中的 podAntiAffinity 設定衝突。

更多資訊請參閱此 GitHub issue 評論。若要解決此問題,請手動刪除舊的 harvester-cloud-provider pod。您可能需要多次執行此操作,直到新的 pod 可以成功排程。

負載平衡器支援​

部署 Harvester cloud provider 後,您可以利用 Kubernetes LoadBalancer 服務將客體叢集內的微服務公開到外部。建立 Kubernetes LoadBalancer 服務會為該服務分配一個專用的 Harvester 負載平衡器,您可以透過 Rancher UI 中的 Add-on Config 進行調整。

IPAM​

Harvester 的內建負載平衡器提供 DHCP 和 Pool 兩種模式,您可以透過在相應的服務上新增 annotation cloudprovider.harvesterhci.io/ipam: $mode 來進行設定。從 Harvester cloud provider >= v0.2.0 開始,還引入了獨特的 Share IP 模式。在此模式下,服務與其他服務共享其負載平衡器 IP。

  • DHCP: 需要 DHCP 伺服器。Harvester 負載平衡器將從 DHCP 伺服器請求 IP 位址。

  • Pool: 必須先設定 IP pool。Harvester 負載平衡器控制器將根據 IP pool 選擇策略為負載平衡器服務分配 IP。請注意直接從 Harvester UI 建立 IP Pool 和從 Rancher Manager UI 建立 IP Pool 之間的差異。請參閱最佳實踐。

  • Share IP: 建立新的負載平衡器服務時,您可以重複使用現有負載平衡器服務的 IP。新服務稱為次要服務,而目前選擇的服務是主要服務。若要在次要服務中指定主要服務,您可以新增 annotation cloudprovider.harvesterhci.io/primary-service: $primary-service-name。但是,有兩個已知限制:

    • 共享相同 IP 位址的服務不能使用相同的連接埠。
    • 次要服務不能與其他服務共享其 IP。
備註

不允許修改 IPAM 模式。如果您打算變更 IPAM 模式,必須建立新的服務。

健康檢查​

從 Harvester cloud provider v0.2.0 開始,不再需要對客體 Kubernetes 叢集內的 LoadBalancer 服務進行額外的健康檢查。相反,您可以為工作負載設定 liveness 和 readiness 探針。因此,任何不可用的 pod 都會自動從負載平衡器端點中移除,以達到相同的預期結果。