Aller au contenu

Mettre en place MetalLB

MetalLB s'intègre à votre cluster Kubernetes et fournit une implémentation d'équilibrage de charge réseau. En bref, il vous permet de créer des services Kubernetes de type LoadBalancer dans des clusters qui ne s'exécutent pas sur un fournisseur de cloud et qui ne peuvent donc pas simplement s'appuyer sur des produits payants pour fournir des équilibreurs de charge.

Introduction

Lorsqu'on utilise Kubernetes en configuration "Bare metal", comme c'est le cas ici, et que l'on configure un "Ingress Controller" pour exposer les services, l'Ingress n'a pas de "External IP", c'est un peu la loose.

Pour pallier à ce problème, il est nécessaire d'installer une ressource de type "Load Balancer". Dans cet article, nous allons voir comment configurer MetalLB et Calico pour y parvenir.

metallb

Important

Si vous utilisez kube-proxy en mode IPVS, depuis Kubernetes v1.14.2 vous devez activer le mode ARP strict.

Notez que vous n'avez pas besoin de cela si vous utilisez kube-router comme service-proxy car il active le mode strict ARP par défaut.

Vous pouvez y parvenir en éditant la configuration de kube-proxy dans le cluster actuel :

kubectl edit configmap -n kube-system kube-proxy

Définir :

apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: "ipvs"
ipvs:
  strictARP: true
Pour vérifier si vous utiliser en mode IPVS :

kubectl get cm -n kube-system kube-proxy -o yaml
Si vous voyez :

mode: "ipvs"

Kube-proxy est en IPVS.

Installation des manifests

kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.14.7/config/manifests/metallb-native.yaml
Ceci déploiera MetalLB dans votre cluster, sous l'espace de noms metallb-system. Les composants du manifeste sont :

  • Le déploiement metallb-system/controller. Il s'agit du contrôleur de la grappe qui gère l'attribution des adresses IP.
  • Le daemonset metallb-system/speaker. Il s'agit du composant qui utilise le(s) protocole(s) de votre choix pour rendre les services accessibles.

Les comptes de service pour le contrôleur et le haut-parleur, ainsi que les autorisations RBAC dont les composants ont besoin pour fonctionner.

Configuration avec Calico et l'utilisation Layer 2 configuration

J'ai identifié un Issue très galère qui empeche la création de la ressource IPAddressPool pour la pool d'addresse utiliser par MetalLB & de la ressource L2Advertisement.

Après avoir appliquer le manifest, on va desactiver le "WebHook" qui bloque a chaque fois la création de ces ressources.

Merci Github, Reddit et autre forums obscure qui m'ont permis de trouver une solution viable !

  1. On va récupérer la configuration du webhook du pod controller.

kubectl -n metallb get validatingwebhookconfiguration -o yaml > patch-webhook-metallb.yaml
Edite le fichier patch-webhook-metallb.yaml.

Et au niveau de

        name: metallb-webhook-service
        namespace: metallb-system
        path: /validate-metallb-io-v1beta1-ipaddresspool
        port: 443
    failurePolicy: Fail
      service:
        name: metallb-webhook-service
        namespace: metallb-system
        path: /validate-metallb-io-v1beta1-l2advertisement
        port: 443
    failurePolicy: Fail
    matchPolicy: Equivalent

Le failurePolicy: Fail on le passe à failurePolicy: Ignore

Il faut appliquer le manifest patcher.

kubectl apply -f patch-webhook-metallb.yaml

Configuration MetalLB

Maintenant qu'on a fait l'installation on va créer nos ressources qui sera utiliser par les Ingress Controler.

Création IPAddressPool

Crée le fichier ippools.yaml :

apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  namespace: metallb-system
  name: ippool
spec:
  addresses:
  - 1X.X.X.90-1X.X.X.101
  - 10.103.1.0/24
La range IP 1X.X.X.90-1X.X.X.101, et la range qui sera attribué à nos ingress-controller.

Le subnet 10.103.1.0/24, correspond à l'utilisation interne.

On applique :

kubectl apply -f ippools.yaml

Création L2Advertisement

Le L2Advertisement s'occupe de répondre aux requêtes ARP. Ce n'est pas du load balancing, et ce n'est pas parfait, mais c'est simple à mettre en place. On pourrait aussi utiliser le BGP, mais un autre jours....

Crée le fichier l2adv.yaml :

kind: L2Advertisement
metadata:
  name: arpsetup
  namespace: metallb-system
spec:
  ipAddressPools:
  - ippool

On applique :

kubectl apply -f `l2adv.yaml`

Exploitation

Il faudra lire l'article : Installation Traefik