Pour un kube bare-metal (installé par soit même), une solution de load-balancer est metallb. Metallb fera lui même l'affectation d'ip dynamique pour le service sous-jacent.

Pour installer metallb, il suffit d'exécuter :

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

Il faut ensuite créer un pool d'adresse que metallb pourra distribuer :

vi configmap-metallb.yml

apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: default
      protocol: layer2
      addresses:
      - 192.168.99.100-192.168.99.200

kubectl apply -f configmap-metallb.yml

Il faut bien sur que les adresses que metallb distribue arrivent au serveur sachant ensuite faire le load-balancing. Le cas le plus simple reste que le contrôleur kubernetes héberge lui meme le metallb et soit lui même la target des ip distribuées. Il reste que dans ce cas, il devient nœud d'engorgement et single point of failure architectural.

Une prochaine réflexion, sera de voir comment distribuer plus efficacement et sécuritairement.

Une fois notre yaml appliqué, metallb est prêt. Il nous suffit alors de créer un service pour nos pods qui sera un load-balancer.

Ici l'exemple pour une application nginx :

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2 
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80

Et voici le yaml pour le service :

apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  ports:
  - name: http
    port: 8998
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx
  type: LoadBalancer

On applique notre deployment et notre service et nous voila avec deux nginx en load-balancing !!

Pour voire l'ip, il suffit de faire :

kubectl get svc nginx

NAME    TYPE           CLUSTER-IP     EXTERNAL-IP      PORT(S)          AGE
nginx   LoadBalancer   10.96.84.103   192.168.99.100   8998:31748/TCP   64m

Suite à quoi, http://192.168.99.100:8998 affiche notre page via l'un ou l'autre des pods nginx.