简介
k8s 不提供裸机的 loadbalancer service,如果你在裸机中安装k8s并且创建了loadbalancer 类型的service,那么它会一直保持在pending的状态,所以如果你是裸机安装k8s的话一般会使用nodeport去暴露集群中的服务,如果你要使用loadbalancer service,那么就要用到metallb了
继续简介
metallb支持两种工作模式,一种是layer 2 mode,也就是工作在2层来负责相应arp请求,对于局域网中的人来说仿佛就是给服务分配了一个ip,但是2层模式不是真正的负载均衡,因为所有的流量会经过集群中的一个节点,当这个节点挂了的话,metallb会迁移ip到另外一个节点上,另外一种是bgp模式,在bgp模式下,集群中每一个节点都会和路由器建立bgp会话,所以bgp模式是高可用的,但是需要你的路由器支持bgp。这边我的路由器是不支持bgp的,所以就采用二层模式
安装
其实安装很简单
首先你要确认你的k8s kube-proxy 是不是使用ipvs模式的,如果是那么你要开启strictARP选项,编辑kube-proxy的configmap
kubectl edit configmap -n kube-system kube-proxy
打开
strictARP: true
之后创建一个namespace
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.9.5/manifests/namespace.yaml
创建deployment等
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.9.5/manifests/metallb.yaml
创建memberlist secret,这个secret是用来加密speaker之间的通信
kubectl create secret generic -n metallb-system memberlist --from-literal=secretkey="$(openssl rand -base64 128)"
配置二层
新增下面的配置
apiVersion: v1
kind: ConfigMap
metadata:
namespace: metallb-system
name: config
data:
config: |
address-pools:
- name: default
protocol: layer2
addresses:
- 192.168.1.240-192.168.1.250
注意这里的addresses需要和k8s的节点处于同一个网段
之后apply
kubectl apply -f layer2.yaml
测试
之后直接安装一个traefik测试一下,我这里使用的是helm安装,所以修改下面字段
service:
enabled: true
type: LoadBalancer
之后看下有没有分配好ip就好了
kubectl get svc -A
欢迎关注我的博客www.bboy.app
Have Fun