Dieses Dokument wurde mithilfe automatisierter maschineller Übersetzungstechnologie übersetzt. Wir bemühen uns um korrekte Übersetzungen, übernehmen jedoch keine Gewähr für die Vollständigkeit, Richtigkeit oder Zuverlässigkeit der übersetzten Inhalte. Im Falle von Abweichungen ist die englische Originalversion maßgebend und stellt den verbindlichen Text dar.

Harvester Cloud-Anbieter

Sie können RKE2 Cluster in Rancher mit dem integrierten Harvester Node Driver bereitstellen. Harvester bietet Lastenausgleich und Harvester Cluster Speicher-Passthrough Unterstützung für den Gast-Kubernetes-Cluster.

Hinweis zur Abwärtskompatibilität

Bitte beachten Sie ein bekanntes Problem mit der Abwärtskompatibilität, wenn Sie die Harvester-Cloud-Anbieter-Version v0.2.2 oder höher verwenden. Wenn Ihre Harvester-Version unter v1.2.0 liegt und Sie beabsichtigen, neuere RKE2-Versionen (d.h. >= v1.26.6+rke2r1, v1.25.11+rke2r1, v1.24.15+rke2r1) zu verwenden, ist es wichtig, Ihren Harvester-Cluster vor dem Upgrade des Gast-Kubernetes-Clusters oder des Harvester-Cloud-Anbieters auf v1.2.0 oder eine höhere Version upzugraden.

Für eine detaillierte Unterstützungs-Matrix beziehen Sie sich bitte auf den Abschnitt Harvester CCM & CSI Driver mit RKE2-Versionen der offiziellen Website.

Bereitstellung

Voraussetzungen

  • Der Kubernetes-Cluster basiert auf Harvester-VMs.

  • Die Harvester-VMs, die als Gast-Kubernetes-Knoten fungieren, befinden sich im selben Namespace.

  • Die Hostnamen der Harvester-VM-Gäste stimmen mit den entsprechenden Namen der Harvester-VMs überein. Gast-Cluster-Harvester-VMs dürfen beim Einsatz des Harvester-CSI-Treibers keine anderen Hostnamen als ihre Harvester-VM-Namen haben. Wir hoffen, diese Einschränkung in einer zukünftigen Version von Harvester zu entfernen.

Jede Harvester-VM muss das macvlan Kernel-Modul haben, das für die LoadBalancer Dienste des DHCP IPAM-Modus erforderlich ist.

Um zu überprüfen, ob das Kernel-Modul verfügbar ist, greifen Sie auf die VM zu und führen Sie die folgenden Befehle aus:

lsmod | grep macvlan
sudo modprobe macvlan

Das Kernel-Modul fehlt wahrscheinlich, wenn Folgendes auftritt:

  • $ lsmod | grep macvlan erzeugt keine Ausgabe.

  • $ sudo modprobe macvlan zeigt eine Fehlermeldung ähnlich modprobe: FATAL: Module macvlan not found in directory /lib/modules/5.14.21-150400.22-default an.

Standardmäßig ist das macvlan Kernel-Modul nicht in den minimalen Cloud-Images von SUSE Linux Enterprise 15 Service Pack 4/5/6 enthalten (siehe Issue #6418). Diese Images enthalten das kernel-default-base Paket, das nur die Basis-Module umfasst. Der macvlan Kernel-Treiber wird verfügbar, wenn Sie das kernel-default Paket installieren.

Um die Notwendigkeit manueller Eingriffe nach der Bereitstellung des Gastclusters zu beseitigen, erstellen Sie Ihre eigenen Cloud-Images mit dem openSUSE Build Service (OBS). Sie müssen das kernel-default-base Paket entfernen und das kernel-default Paket in die Minimal.kiwi Datei hinzufügen, um sicherzustellen, dass das resultierende Cloud-Image das macvlan Kernel-Modul enthält. Für weitere Informationen siehe Benutzerdefinierte SUSE VM-Images.

Bereitstellung im RKE2-Cluster mit dem Harvester-Knotentreiber

Beim Erstellen eines RKE2-Clusters mit dem Harvester-Knotentreiber wählen Sie den Harvester Cloud-Anbieter aus. Der Knotentreiber hilft dann automatisch bei der Bereitstellung sowohl des CSI-Treibers als auch des CCM.

rke2 cloud provider

Ab Rancher v2.9.0 können Sie über das Feld Datenverzeichnis-Konfigurationspfad ein bestimmtes Verzeichnis für Cloud-Konfigurationsdaten festlegen.

rke2 cloud provider custom data dir

Manuelle Bereitstellung im RKE2-Cluster

  1. Generieren Sie Cloud-Konfigurationsdaten mit dem Skript generate_addon.sh und platzieren Sie die Daten dann auf jedem benutzerdefinierten Knoten (Verzeichnis: /etc/kubernetes/cloud-config).

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

    Das Skript hängt von kubectl und jq ab, wenn der Harvester-Cluster betrieben wird, und funktioniert nur, wenn es Zugriff auf die Harvester Cluster kubeconfig-Datei hat.

    Sie finden die kubeconfig Datei in einem der Harvester-Management-Knoten im /etc/rancher/rke2/rke2.yaml Pfad. Die Server-IP muss durch die VIP-Adresse ersetzt werden.

    Beispiel für Inhalt:

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

    Sie müssen den Namespace angeben, in dem der Gastcluster erstellt wird.

    Beispiel für Ausgabe:

    ########## 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. Auf der Seite zur Erstellung des RKE2-Clusters gehen Sie zum Bildschirm Cluster-Konfiguration und setzen Sie den Wert von Cloud-Anbieter auf Extern.

    external harvester cloud provider
  3. Kopieren Sie den Inhalt von cloud-init user data und fügen Sie ihn in Maschinenpools > Erweiterte Optionen anzeigen > Benutzerdaten ein.

    cloud config userdata
  4. Fügen Sie die HelmChart CRD für harvester-cloud-provider zu Cluster-Konfiguration > Add-On-Konfiguration > Zusätzliche Manifestdatei hinzu.

    Sie müssen <cluster-name> durch den Namen Ihres Clusters ersetzen.

     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>
    external cloud provider addon
  5. Um den Lastenausgleich zu erstellen, fügen Sie die Annotation cloudprovider.harvesterhci.io/ipam: <dhcp|pool> hinzu.

    harvester cloud provider loadbalancer annotation

Bereitstellung im RKE2 benutzerdefinierten Cluster (experimentell)

custom
  1. Generieren Sie Cloud-Konfigurationsdaten mit dem Skript generate_addon.sh und platzieren Sie die Daten dann auf jedem benutzerdefinierten Knoten (Verzeichnis: /etc/kubernetes/cloud-config).

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

    Das Skript hängt von kubectl und jq ab, wenn der Harvester-Cluster betrieben wird, und funktioniert nur, wenn es Zugriff auf die Harvester Cluster kubeconfig-Datei hat.

    Sie finden die kubeconfig Datei in einem der Harvester-Management-Knoten im /etc/rancher/rke2/rke2.yaml Pfad. Die Server-IP muss durch die VIP-Adresse ersetzt werden.

    Beispiel für Inhalt:

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

    Sie müssen den Namespace angeben, in dem der Gastcluster erstellt wird.

    Beispiel für Ausgabe:

    ########## 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. Erstellen Sie eine VM im Harvester-Cluster mit den folgenden Einstellungen:

    • Grundlagen Registerkarte: Die Mindestanforderungen sind 2 CPUs und 4 GiB RAM. Der erforderliche Speicherplatz hängt vom VM-Image ab.

      custom cluster vm cpu and ram
    • Netzwerke Registerkarte: Geben Sie einen Netzwerknamen im Format nic-<number> an.

      custom cluster vm network
    • Erweiterte Optionen Registerkarte: Kopieren Sie den Inhalt des Bildschirms Cloud Config User Data und fügen Sie ihn ein.

      custom cluster vm user data
  3. Wählen Sie auf der Registerkarte Grundlagen des Bildschirms Cluster-Konfiguration Harvester als Cloud-Anbieter aus und wählen Sie dann Erstellen, um den Cluster zu starten.

    create custom rke2
  4. Führen Sie auf der Registerkarte Registrierung die erforderlichen Schritte aus, um den RKE2-Registrierungsbefehl auf der VM auszuführen.

    custom cluster registration

Bereitstellung im K3s-Cluster mit Harvester-Knotentreiber (experimentell)

Beim Starten eines K3s-Clusters mit dem Harvester-Knotentreiber können Sie die folgenden Schritte ausführen, um den Harvester-Cloud-Anbieter bereitzustellen:

  1. Verwenden Sie generate_addon.sh, um die Cloud-Konfiguration zu generieren.

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

    Die Ausgabe sieht wie folgt aus:

     ########## 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. Kopieren Sie den Inhalt von cloud-init user data und fügen Sie ihn in Maschinenpools > Erweiterte Optionen anzeigen > Benutzerdaten ein. cloud config userdata

  3. Fügen Sie das folgende HelmChart yaml von harvester-cloud-provider zu Cluster-Konfiguration > Add-On-Konfiguration > Zusätzliches Manifest hinzu.

     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
    external cloud provider addon
  4. Deaktivieren Sie den in-tree Cloud-Anbieter auf folgende Weise:

    • Klicken Sie auf die Schaltfläche Edit as YAML.

      edit k3s cluster yaml
    • Deaktivieren Sie servicelb und setzen Sie disable-cloud-controller: true, um den Standard-K3s-Cloud-Controller zu deaktivieren.

        machineGlobalConfig:
          disable:
            - servicelb
          disable-cloud-controller: true
    • Fügen Sie cloud-provider=external hinzu, um den Harvester-Cloud-Anbieter zu verwenden.

        machineSelectorConfig:
          - config:
              kubelet-arg:
              - cloud-provider=external
              protect-kernel-defaults: false
    k3s cluster yaml content for harvester cloud provider

Mit diesen Einstellungen sollte ein K3s-Cluster erfolgreich bereitgestellt werden, während der externe Cloud-Anbieter verwendet wird.

Upgrade des Cloud-Anbieters

Upgrade RKE2

Der Cloud-Anbieter kann durch ein Upgrade der RKE2-Version vorgenommen werden. Sie können den RKE2-Cluster über die Rancher-Benutzeroberfläche wie folgt upgraden:

  1. Klicken Sie auf ☰ > Clusterverwaltung.

  2. Suchen Sie den Gast-Cluster, den Sie aktualisieren möchten, und wählen Sie ⋮ > Konfiguration bearbeiten aus.

  3. Wählen Sie Kubernetes-Version aus.

  4. Klicken Sie auf Speichern.

Upgrade von K3s

K3s-Cloud-Anbieter über die Rancher-Benutzeroberfläche upgraden, wie folgt:

  1. Klicken Sie auf ☰ > K3s-Cluster > Apps > Installierte Apps.

  2. Suchen Sie das Cloud-Anbieter-Diagramm und wählen Sie ⋮ > Bearbeiten/Upgrade aus.

  3. Wählen Sie Version aus.

  4. Klicken Sie auf Nächster Schritt > Aktualisieren.

Der Aktualisierungsprozess für einen einzelnen Gast-Cluster kann ins Stocken geraten, wenn das neue harvester-cloud-provider Pod im Ausstehend Zustand feststeckt. Dieses Problem wird durch einen Abschnitt in der harvester-cloud-provider Bereitstellung verursacht, der die Rolling-Update-Strategie beschreibt. Insbesondere steht der Standardwert im Konflikt mit der podAntiAffinity Konfiguration in Einzelknoten-Clustern.

Für weitere Informationen siehe diesen GitHub-Issue-Kommentar. Um das Problem zu beheben, löschen Sie manuell den alten harvester-cloud-provider-Pod. Sie müssen dies möglicherweise mehrere Male tun, bis der neue Pod erfolgreich geplant werden kann.

Lastenausgleichsunterstützung

Sobald Sie den Harvester-Cloud-Anbieter bereitgestellt haben, können Sie den Kubernetes LoadBalancer Dienst nutzen, um einen Microservice innerhalb des Gastclusters der Außenwelt zugänglich zu machen. Die Erstellung eines Kubernetes LoadBalancer Dienstes weist dem Dienst einen dedizierten Harvester-Load Balancer zu, und Sie können Anpassungen über das Add-on Config in der Rancher-Benutzeroberfläche vornehmen.

lb svc

IPAM

Der integrierte Lastenausgleich von Harvester bietet sowohl DHCP als auch Pool Modi, und Sie können ihn konfigurieren, indem Sie die Annotation cloudprovider.harvesterhci.io/ipam: $mode zu seinem entsprechenden Dienst hinzufügen. Beginnend mit dem Harvester-Cloud-Anbieter >= v0.2.0 führt er auch einen einzigartigen Share-IP-Modus ein. Ein Dienst teilt in diesem Modus seine Lastenausgleichs-IP mit anderen Diensten.

  • DHCP: Ein DHCP-Server ist erforderlich. Der Harvester-Load-Balancer wird eine IP-Adresse vom DHCP-Server anfordern.

  • Pool: Sie müssen zuerst einen IP-Pool erstellen, entweder über die SUSE Virtualization Benutzeroberfläche oder die Rancher Benutzeroberfläche (siehe Best Practices für Informationen über die Unterschiede zwischen den beiden Methoden). Der SUSE Virtualization Lastenausgleichscontroller wird eine IP für den Lastenausgleichsdienst gemäß der IP-Pool-Auswahlrichtlinie zuweisen.

  • Share IP: Bei der Erstellung eines neuen Lastenausgleichsdienstes können Sie eine vorhandene Lastenausgleichsdienst-IP wiederverwenden. Der neue Dienst wird als sekundärer Dienst bezeichnet, während der derzeit gewählte Dienst der primäre ist. Um den primären Dienst im sekundären Dienst anzugeben, können Sie die Annotation cloudprovider.harvesterhci.io/primary-service: $primary-service-name hinzufügen. Es gibt jedoch zwei bekannte Einschränkungen:

    • Dienste, die dieselbe IP-Adresse teilen, können nicht denselben Port verwenden.

    • Sekundäre Dienste können ihre IP nicht mit zusätzlichen Diensten teilen.

Das Ändern des IPAM Modus ist nicht erlaubt. Sie müssen einen neuen Dienst erstellen, wenn Sie den IPAM Modus ändern möchten.

Zustandsprüfungen

Beginnend mit der Harvester-Cloud-Anbieter-Version v0.2.0 sind zusätzliche Zustandsprüfungen des LoadBalancer Dienstes innerhalb des Gast-Kubernetes-Clusters nicht mehr erforderlich. Stattdessen können Sie Liveness und readiness Prüfungen für Ihre Arbeitslasten konfigurieren. Folglich werden alle nicht verfügbaren Pods automatisch von den Endpunkten des Lastenausgleichs entfernt, um dasselbe gewünschte Ergebnis zu erzielen.