En kısa, açıklanabilir şekilde MetalLB on-premise sistemlerde load balancer olarak kullanılmaktadır. Sanal bir havuzdan istekleri 2 türde (layer2, bgp) yönlendirmekte, failover yeteneği bulunmakta..
Daha detaylı bilgi için; https://metallb.universe.tf/ https://blog.opstree.com/2020/10/13/kubernetes-diary-software-loadbalancer/ ve aşağıdaki görselleri inceleyebiliriz;
Ön gereksinimler;
A Kubernetes cluster, running Kubernetes 1.13.0 or later, that does not already have network load-balancing functionality. A cluster network configuration that can coexist with MetalLB. Some IPv4 addresses for MetalLB to hand out. When using the BGP operating mode, you will need one or more routers capable of speaking BGP. When using the L2 operating mode, traffic on port 7946 (TCP & UDP, other port can be configured) must be allowed between nodes, as required by memberlist.
Kuruluma başlamadan önce isteklerin gerçekleşebilmesi için;
kubectl edit configmap -n kube-system kube-proxy
apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration mode: "ipvs" ipvs: strictARP: true
Helm ile deploy edebiliriz,
helm repo add metallb https://metallb.github.io/metallb helm install metallb metallb/metallb --create-namespace -n metallb-system
Bu adımdan sonra podlar ContainerCreating, CreateContainerConfigError gözüküyorsa firewall kontrolü yapınız, geçici olarak kapatarak yada podlar için belirlenen network aralığına tamamen izin verip deneyebilirsiniz.
Çünkü belirtilen porta (7946) izin vermek yeterli olmuyor, webhook yaratırken başka bir hata veriyor, bu kısmı firewall’u kapatmadan yada geniş bir aralık vermeden çözemedim, eğer çözen olursa yorumlarda belirtiniz.
Events; Warning FailedCreatePodSandBox 118s (x18 over 73m) kubelet Failed to create pod sandbox: rpc error: code = DeadlineExceeded desc = context deadline exceeded
Kurulum tamamlandıktan sonra ip pool belirtmemiz gerekiyor,
vim resource.yaml apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: name: first-pool namespace: metallb-system spec: addresses: - 192.168.1.240-192.168.1.250 #ip adreslerini değiştiriniz --- apiVersion: metallb.io/v1beta1 kind: L2Advertisement metadata: name: l2advertisementX namespace: metallb-system spec: ipAddressPools: - first-pool
kubectl apply -f resource.yaml -n metallb-system ipaddresspool.metallb.io/default created l2advertisement.metallb.io/l2advertisement1 created
Önceki versiyonda belirttiğimiz bu ip adres havuzlarını bir configmap içerisinde barındırıyorduk, eğer versiyon geçişi yaptıysanız aşağıdaki gibi dönüşüm sağlayabilirsiniz.
Örnek configmap
kind: ConfigMap apiVersion: v1 data: config: | address-pools: - addresses: - 10.10.10.131-10.10.10.132 name: default protocol: layer2 metadata: annotations: meta.helm.sh/release-name: metallb meta.helm.sh/release-namespace: metallb-system labels: app.kubernetes.io/instance: metallb app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: metallb helm.sh/chart: metallb-2.5.1 name: metallb-config namespace: metallb-system
#aynı dizinde; docker run -d -v $(pwd):/var/input quay.io/metallb/configmaptocrs
022/10/03 14:01:29 MetalLB generator starting. commit: dev branch: dev goversion: gc / go1.18.3 / amd64 2022/10/03 14:01:29 Reading configmap 2022/10/03 14:01:29 Decoding configmap 2022/10/03 14:01:29 Creating custom resources 2022/10/03 14:01:29 Validating the custom resources 2022/10/03 14:01:29 Creating the output YAML 2022/10/03 14:01:29 Generator finished successfully!
Oluşturulan resource.yaml dosyasını incelediğimizde;
# This was autogenerated by MetalLB's custom resource generator. apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: creationTimestamp: null name: default namespace: metallb-system spec: addresses: - 10.10.10.131-10.10.10.132 status: {} --- apiVersion: metallb.io/v1beta1 kind: L2Advertisement metadata: creationTimestamp: null name: l2advertisement1 namespace: metallb-system spec: ipAddressPools: - default status: {} ---
kubectl apply -f resource.yaml -n metallb-system