Auf dieser Seite wird beschrieben, wie Sie gebündeltes Load-Balancing mit MetalLB für Google Distributed Cloud konfigurieren. MetalLB-Load-Balancer werden entweder auf einem dedizierten Pool von Worker-Knoten oder auf denselben Knoten wie die Steuerungsebene ausgeführt.
Beispiele für Load-Balancing-Topologien, die in Google Distributed Cloud verfügbar sind, finden Sie unter Übersicht über Load-Balancer.
Voraussetzungen
- Alle Load-Balancer-Knoten müssen sich im selben Layer-2-Subnetz befinden.
- Alle VIPs müssen sich im Subnetz des Load-Balancer-Knotens befinden und über das Gateway des Subnetzes routingfähig sein.
- Das Gateway des Load-Balancer-Subnetzes muss ressourcensparende ARP-Nachrichten überwachen und ARP-Pakete an die Load-Balancer-Knoten weiterleiten.
Felder für die Konfiguration
Bearbeiten Sie den Abschnitt cluster.spec.loadBalancer
der Cluster-Konfigurationsdatei, um das gebündelte Load-Balancing zu konfigurieren. Informationen zu Clusterkonfigurationsdateien und Beispiele für gültige Konfigurationen finden Sie in den folgenden Hilfeartikeln:
- Administratorcluster erstellen
- Nutzercluster erstellen
- Hybridcluster erstellen
- Eigenständige Cluster erstellen
loadBalancer.mode
Dieser Wert muss bundled
sein, um das gebündelte Load-Balancing zu aktivieren.
loadBalancer.ports.controlPlaneLBPort
Dieser Wert gibt den Zielport an, der für Traffic verwendet werden soll, der an die Kubernetes-Steuerungsebene gesendet wird (die Kubernetes API-Server).
loadBalancer.vips.controlPlaneVIP
Dieser Wert gibt die Ziel-IP-Adresse an, die für den Traffic an die Kubernetes-Steuerungsebene (die Kubernetes API-Server) verwendet werden soll. Diese IP-Adresse muss sich im selben Layer-2-Subnetz wie die Knoten im Cluster befinden. Listen Sie diese Adresse nicht im Abschnitt address pools
der Konfigurationsdatei auf.
loadBalancer.vips.ingressVIP
Dieser Wert gibt die IP-Adresse an, die für Dienste hinter dem Load-Balancer für eingehenden Traffic verwendet werden soll. Dieses Feld ist in Konfigurationsdateien für Administratorcluster nicht zulässig. Diese Adresse muss im Abschnitt Adresspools der Konfiguration aufgeführt sein.
loadBalancer.addressPools
Dieser Abschnitt der Konfiguration enthält einen oder mehrere Adresspools. Jeder Adressbereich gibt eine Liste von IP-Adressbereichen an. Wenn Sie einen Dienst vom Typ LoadBalancer
erstellen, werden die externen IP-Adressen für den Dienst aus diesen Bereichen ausgewählt.
Adresspools werden im folgenden Format angegeben:
- name: POOL_NAME
avoidBuggyIPs: BOOLEAN
manualAssign: BOOLEAN
addresses:
- IP_RANGE
- IP_RANGE2
name
: Der Name des Adresspools pool-name für Ihre eigenen Organisationszwecke. Dieses Feld ist unveränderlich.avoidBuggyIPs
: (Optional)true
oderfalse
. Beitrue
gibt der Pool IP-Adressen aus, die auf.0
und.255
enden. Einige Netzwerkhardware führt Traffic zu diesen speziellen Adressen auf. Sie können dieses Feld weglassen. Der Standardwert istfalse
. Dieses Feld kann geändert werden.manualAssign
: (Optional)true
oderfalse
. Beitrue
werden Adressen in diesem Pool nicht automatisch Kubernetes-Diensten zugewiesen. Beitrue
wird eine IP-Adresse in diesem Pool nur verwendet, wenn sie von einem Dienst explizit angegeben wird. Sie können dieses Feld auslassen. Der Standardwert istfalse
. Dieses Feld kann geändert werden.addresses
Eine Liste mit einem oder mehreren sich nicht überschneidenden IP-Adressbereichen. ip-range kann entweder in CIDR-Notation (z. B.198.51.100.0/24
) oder in Bereichsschreibweise (z. B.198.51.100.0-198.51.100.10
, ohne Leerzeichen um den Bindestrich) angegeben werden. Dieses Feld ist unveränderlich.
Die IP-Adressbereiche in der addresses
-Liste dürfen sich nicht überschneiden und müssen sich im selben Subnetz wie die Knoten befinden, auf denen Load-Balancer ausgeführt werden.
loadBalancer.nodePoolSpec
In diesem Abschnitt der Konfiguration wird eine Liste von Knoten angegeben, auf denen Load-Balancer ausgeführt werden sollen. Load-Balancer-Knoten können standardmäßig reguläre Arbeitslasten ausführen. Es gibt keine spezielle Markierung auf diesen Knoten. Obwohl Knoten im Load-Balancer-Knotenpool Arbeitslasten ausführen können, sind sie von den Knoten in den Worker-Knotenpools getrennt. Sie können einen bestimmten Clusterknoten nicht in mehr als einen Knotenpool aufnehmen. Sich überschneidende Knoten-IP-Adressen zwischen Knotenpools blockieren die Clustererstellung und andere Clustervorgänge.
Wenn Sie verhindern möchten, dass Arbeitslasten auf einem Knoten im Knotenpool des Load-Balancers ausgeführt werden, fügen Sie dem Knoten die folgende Markierung hinzu:
node-role.kubernetes.io/load-balancer:NoSchedule
Google Distributed Cloud fügt den Pods, die für das Load-Balancing erforderlich sind, Toleranzen für diese Markierung hinzu.
nodePoolSpec:
nodes:
- address: 10.0.0.32
- address: 10.0.0.33
Alle Knoten im Load-Balancer-Knotenpool müssen sich im selben Layer-2-Subnetz wie die Load-Balancer-VIPs befinden, die im Abschnitt loadBalancer.addressPools
der Konfigurationsdatei konfiguriert sind.
Wenn nodePoolSpec
nicht festgelegt ist, werden die gebündelten Load-Balancer auf den Knoten der Steuerungsebene ausgeführt. Wir empfehlen Ihnen, Load-Balancer nach Möglichkeit auf separaten Knotenpools auszuführen.
Load-Balancing auf Steuerungsebene
Der Load-Balancer stellt die virtuelle IP-Adresse (VIP) der Steuerungsebene bereit. Google Distributed Cloud führt Keepa Lively und HAProxy als statische Kubernetes-Pods auf den Load-Balancer-Knoten aus, um die virtuelle IP-Adresse der Steuerungsebene anzukündigen. Keepalived verwendet das Virtual Router Redundancy Protocol (VRRP) auf den Load-Balancer-Knoten zur Hochverfügbarkeit.
Load-Balancing der Datenebene
Der Datenebenen-Load-Balancer gilt für alle Kubernetes-Dienste vom Typ LoadBalancer
.
Google Distributed Cloud verwendet MetalLB, die im Layer-2-Modus für das Load-Balancing der Datenebene ausgeführt wird. Das Load-Balancing der Datenebene kann nur über Google Distributed Cloud konfiguriert werden. Ändern Sie die MetalLB-ConfigMap nicht direkt. Sie können alle Metal-Features verwenden, einschließlich der IP-Adressfreigabe für mehrere Dienste.
Weitere Informationen zu dieser Funktion finden Sie in der Dokumentation zum Thema "HLK".
MetalLB führt auf einem Knoten über ein DaemonSet eine Lautsprechergruppe mit memberlist für eine hohe Verfügbarkeit aus. Für jeden Kubernetes-Dienst gibt es einen eigenen MetalLB Load-Balancer-Knoten, nicht einen für den gesamten Cluster. So wird der Traffic auf die Load-Balancer-Knoten verteilt, wenn mehrere Dienste vorhanden sind.
Die Load-Balancer der Datenebene können entweder auf Knoten der Steuerungsebene oder auf einer Teilmenge von Worker-Knoten ausgeführt werden. Durch das Zwischenspeichern der Datenebenen-Load-Balancer auf den Steuerungseben-Knoten wird die Nutzung der Steuerungsebene-Knoten erhöht. Durch das Bündeln der Knoten auf der Steuerungsebene wird jedoch auch das Risiko einer Überlastung der Steuerungsebene erhöht und das Risiko vertraulicher Informationen auf der Steuerungsebene, z. B. SSH-Schlüssel, erhöht.
Quell-IP-Adresse des Clients beibehalten
Der Dienst LoadBalancer
, der mit der gebündelten Ebene-2-Load-Balancing-Lösung erstellt wurde, verwendet die Standardeinstellung Cluster
für die externe Trafficrichtlinie.
Diese Einstellung (spec.externalTrafficPolicy: Cluster
) leitet externen Traffic an clusterweite Endpunkte weiter, verschleiert jedoch auch die IP-Adresse des Clientquellcodes.
In den folgenden Abschnitten wird beschrieben, wie Sie Ihren Cluster so konfigurieren, dass die Quell-IP-Adresse des Clients erhalten wird.
NodePort
Dienste
Kubernetes führt eine Quellnetzwerkadressübersetzung (NAT) für NodePort
-Dienste aus. Wenn Sie die Quell-IP-Adressen der Clients beibehalten möchten, setzen Sie service.spec.externalTrafficPolicy
auf Local
. Kubernetes führt keine Quell-NAT mehr aus. Sie müssen jedoch darauf achten, dass Pods genau auf der ausgewählten Knoten-IP ausgeführt werden.
LoadBalancer
Dienste
Wenn Sie externalTrafficPolicy: Local
in Ihren LoadBalancer
-Diensten verwenden, legen Sie fest, dass Ihre Anwendungs-Pods genau auf den Load-Balancer-Knoten ausgeführt werden. Fügen Sie den Anwendungs-Pods das folgende nodeSelector
hinzu, um diese Änderung vorzunehmen:
apiVersion: v1
kind: Pod
...
spec:
nodeSelector:
baremetal.cluster.gke.io/lbnode: "true"
...
Eingehender Traffic
Wenn Ihre Anwendungen HTTP-Dienste sind, können Sie die Sichtbarkeit der Client-IP-Adresse erreichen, indem Sie Ingress-Komponenten konfigurieren:
Öffnen Sie den
istio-ingress
-Dienst zum Bearbeiten:kubectl edit service -n gke-system istio-ingress
Fügen Sie
externalTrafficPolicy: Local
zumspec
hinzu, speichern Sie den Editor und beenden Sie ihn.apiVersion: v1 kind: Service ... spec: ... externalTrafficPolicy: Local
Öffnen Sie das Deployment
istio-ingress
zum Bearbeiten:kubectl edit deployment -n gke-system istio-ingress
Fügen Sie dem Deployment den folgenden
nodeSelector
hinzu, speichern Sie den Editor und beenden Sie ihn.apiVersion: apps/v1 kind: Deployment ... spec: ... template: ... spec: ... nodeSelector: baremetal.cluster.gke.io/lbnode: "true" ...
Jetzt sehen alle Ihre Dienste hinter Ingress einen X-Forwarded-For
-Header mit der Client-IP, wie im folgenden Beispiel:
X-Forwarded-For: 21.0.104.4