Kubernetes bare metal avec Metallb
Par pepin le dimanche, décembre 15 2019, 23:59 - Kubernetes - Lien permanent
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.