Kubernetes: MetalLB

Kubernetes hat eine steile Lernkurve, keine Frage. Eine Sache, über die ich mir aber auch erst einmal klar werden musste ist, wie unterschiedlich sich Kubernetes Instanzen in Hyperscalern und OnPremise verhalten. Viele der Artikel die im Internet kuriseren, basieren nämlich auf der Annahme, dass man sich auf einem Hyperscaler bewegt (AKS whatever…). Wie man K8s aber OnPrem betreibt, danach muss man sehr gezielt suchen.

Ich habe es vorab schon einmal erwähnt: Durch die Installation von AWX habe ich viel rund um K8s gelernt. Wie so oft braucht es ein praktisches Ziel, um etwas ideal erlernen zu können. Wie bei vielen anderen Anwendungen, welche auf Kubernetes ausgerollt werden können, war es auch bei AWX so, dass die meisten Artikel von einem managed K8s bei einem Hyperscaler ausgegangen sind. Was das bedeutet, ging mir erst später auf. Spätestens aber wenn der Service Type „LoadBalancer“ ist und eine externe IP auftauchen soll, macht man dicke Backen wenn dort für immer und ewig „Pending“ steht. Bei einem managed K8s, bspw. bei AWS, passiert dies nämlich automatisch.

OnPrem sieht die Welt also wie so oft anders aus. Um also eine externe IP für einen LoadBalancer (und den LB selbst) zu bekommen (innerhalb des K8s Clusters), brauch man eine zusaätzliche Komponente. Und hier kommt MetalLB ins Spiel. MetalLB wurde konzipiert um softwarebasierte LoadBalancer-Lösungen für, wie der Name vermuten lässt, Bare-Metal Installationen beireitzustellen. Das betrifft aber genauso OnPrem-Installationen, egal ob diese auf Blech, oder in VMs laufen. Glücklicherweise ist die Bereitstellung von MetalLB aber auch kein großes Hindernis.

Download des Manifest-Files:

wget https://raw.githubusercontent.com/metallb/metallb/v0.15.3/config/manifests/metallb-native.yaml

Die Version entsprechend des letzten (oder gewünschten) Release anpassen.

Deploy/Apply:

kubectl apply -f metallb-native.yaml

Einen IP Pool aus einem eigenen IP Adressbereich erstellen:

nano metallb-ippool.yaml
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  namespace: metallb-system
  name: default-ip-pool
spec:
  addresses:
  - 1.2.3.4-1.2.3.10

Die Adressen bzw. der Bereich ist frei wählbar.

Pool bereiststellen:

kubectl apply -f metallb-ippool.yaml

Ein Layer 2 Advertisement mit dem IP Pool erstellen:

nano metallb-l2config.yaml
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: l2-config
  namespace: metallb-system
spec:
  ipAddressPools:
  - default-ip-pool

L2 Advertisement bereitstellen:

kubectl apply -f metallb-l2config.yaml

Und das war es bereits. Deployments mit einem Service Type „LoadBalancer“ sollten jetzt MetalLB nutzen können. Im späteren Verlauf werde ich dies im Zusammenspiel mit AWX zeigen.

Bei Bedarf können Deplyoments aber auch manuell „exposed“ werden:

kubectl expose deployment nginx --port=80 --type=LoadBalancer

Der entsprechende Service (svc) sollte nun bei „EXTERNAL-IP“ eine Adresse stehen haben (und nicht mehr „Pending“).

Neuste Toots

  1. Loading Mastodon feed…


Andere Beiträge