Externe IP adressen voor Kubernetes services

Geplaatst door

Als Kubernetes On premise draait mis je de integraties met bijvoorbeeld LoadBalancers in het cloud ecosysteem waarin het cluster draait. Met het commando “kubectl get services –all-namespaces” zie je dan ook dat alle externe IPadressen niet gebruikt worden. Dit is onhandig! Gelukkig is er wat aan te doen. Met bijvoorbeeld MetalLB of een recente versie van Calico is er gelukkig wat aan te doen. In dit artikel ga ik verder in op het gebruik van MetalLB waarmee het mogelijk wordt om IP pools via BGP te routeren en de adressen daaruit te gebruiken als extern IPadres voor Services.

Hieronder zie je de situatie uitgelegd die hierboven beschreven is. Hoewel het ook mogelijk is om met bijvoorbeeld Calico CLUSTER-IP’s te routeren via BGP, is het verstandiger om dit alleen te doen met EXTERNAL-IP’s. Je kan een service maken van het type “LoadBalancer” en vervolgens statisch of dynamisch uit een in MetalLB geconfigureerde IP-pool een extern adres kiezen. Bedenk dat het woord “extern” hier niet perce een publiek ip hoeft te betekenen. Het is een via BGP routeerbaar adres, bereikbaar voor bezoekers van buiten het Kubernetes cluster.

BGP in het kort

Het Border Gateway Protocol kennen we eigenlijk vooral uit hele andere situaties. BGP is vooral bekend als protocol waarbij bedrijven/instelingen onderling publieke ip ranges aan elkaar “announcen” om op die manier een effici├źnte onderlinge route van het onderling verkeer mogelijk te maken. Kort door de bocht zijn dit soort bedrijven in BGP terminologie een “autonoom Systeem” ofwel “AS”. In de BGP software kan je je BGP peers configureren. Op die manier kunnen deze peers onderling hun ip ranges uitwisselen.

MetalLB in het kort

Uiteindelijk is er dan MetalLB. Hoewel de naam doet vermoeden dat het hier om een LoadBalancer gaat is dat niet het geval. In de public clouds is het external-ip binnen de Kubernetes service het IP adres wat op de “LoadBalancers as a service” van het cloudplatform draait. Gezien deze integratie on premise vaak ontbreekt of via dure appliances ingericht kan worden, springt onder andere MetalLB in dit gat. De LoadBalancer functionaliteit bevindt zich dan niet buiten kubernetes maar zit er in, in de vorm van een Ingress controller. Door via BGP ip-ranges te routeren en een service van het type LoadBalancer aan te maken, kan je de ingress controller op deze manier bereikbaar maken buiten Kubernetes. Hiermee wordt het LoadBalancer vraagstuk op een alternatieve maar slimme manier opgelost.

Installatie en configuratie

De installatie en configuratie van MetalLB is eenvoudig. Uiteraard is een correct werkend Kubernetes cluster een voorwaarde en heb je een router nodig die BGP ondersteuning biedt. De implementatie van BGP op een router kan verschillen. Voor dat deel van de configuratie verwijs ik je dan ook door naar de documentatie van je router appliance.

Installeer MetalLB met de volgende instructie:

kubectl apply -f https://raw.githubusercontent.com/google/metallb/v0.8.3/manifests/metallb.yaml

Na de installatie doet MetalLB niets zonder verdere configuratie. In dit voorbeeld wil ik dat ip-range 10.0.69.0/24 gerouteerd wordt via BGP. 10.0.65.253 wordt als BGP peer geconfigureerd. Geef het de volgende configuratie:

kubectl create -f ConfigMap.yml

ConfigMap.yml heeft dan bijvoorbeeld de volgende inhoud:

apiVersion: v1
data:
  config: |
    peers:
    - peer-address: 10.0.65.253
      peer-asn: 64513
      my-asn: 64500
    address-pools:
    - name: default
      protocol: bgp
      addresses:
      - 10.0.69.0/24
kind: ConfigMap
metadata:
  annotations:
  name: config
  namespace: metallb-system

Let op dat je de BGP peer (de router ) het juiste AS-nummer geeft. Vervolgens kun je bijvoorbeeld voor je ingress controller een service toevoegen van het type “LoadBalancer”. Een “extern ip address” zoals je die in het begin van dit artikel in het screenshot zag, zal vervolgens gekoppeld worden aan je service.

apiVersion: v1
kind: Service
metadata:
  name: ingress-nginx-metallb
  annotations:
    metallb.universe.tf/address-pool: default
spec:
  ports:
  - port: 80
    targetPort: 80
  selector:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
  type: LoadBalancer
  

Standaard krijg je automatisch een adres toegekend. Dat kan vervelend zijn in combinatie met DNS en bereikbaarheid van je applicatie. Gelukkig kan je met een LoadBalancers IP in je service een specifiek ip instellen. Deze moet dan wel binnen een geconfigureerde address pool passen. Ook kan je met annotations je service koppelen aan een specifieke address pool. Handig!

Tip:

Met meerdere MetalLB address pools kan je handige dingen doen. Zo kan je publiek/intern verkeer scheiden of onderscheid maken tussen acceptatie en productie. Ook kan je meerdere ingress controllers draaien zodat ingress rules alleen daar geconfigureerd zijn waar je ze nodig hebt, en nergens anders.

Tot slot

Er zijn veel manieren om je applicaties in Kubernetes bereikbaar te maken voor buitenaf. De ene manier is wat primitief (NodePort). Een andere manier is erg duur en maakt gebruik van appliances zoals de F5. Daarnaast heb je ook nog systemen zoals Calico en MetalLB die gebruik maken van de open standaard BGP. BGP is beschikbaar op veel routers zonder dat je daar een extreem budget voor nodig hebt. Hiermee wordt de technologie erg aantrekkelijk om toe te passen. Een nadeel is wel dat je publieke ip niet in eigen appliance voor het cluster leeft maar dus dichter bij je applicatie leeft. In sommige use cases zal men daarom toch voor die dure appliance kiezen. Als dit geen issue voor je is, is het zeker de moeite waard om te kijken naar MetalLB.

Hou er wel rekening mee dat ook MetalLB niet altijd toegepast kan worden. Met sommige netwerkplugins botst het. Als je MetalLB gebruikt in combinatie met bijvoorbeeld Calico, moet je oppassen dat het niet twee kapiteins op het zelfde schip worden. Calico kan namelijk ook wat MetalLB kan (maar de configuratie is complexer, wat pleit voor het gebruik van MetalLB). Deze functionaliteit moet je dus niet gebruiken als je MetalLB inzet.

Als je je maar goed verdiept in de materie en het grotere plaatje niet vergeet kan MetalLB een perfecte oplossing bieden. Probeer het eens uit!

Geef een reactie