Local LoadBalancer metallb

最近在调研一些 Helm Chart 的时候,总会出现他们默认提供的 values 里对于 SVC 的 Type 都是 LoadBalancer,但是我的本地 Kubernetes 根本不支持安装 LoadBalancer 类型的 SVC,每次都得手动修改 SVC 部分配置使用 NodePort 以便于我可以在集群外部访问到服务。

How

最近正好在使用一个新的 Local LoadBalancer provider: metallb.

这个库挺好用的,直接就能使用本地能够访问到的 ip 作为 LoadBalancer 的 External IP,不过文档写的是真不咋地,也没有一个 Getting Start,那我就勉勉强强给写一个吧 🫠

MetalLB Getting Start

  • Install Orbstack: brew install orbstack
  • Start Kubernetes via Orbstack: orb start k8s
  • Install MetalLB
helm repo add metallb https://metallb.github.io/metallb
# frr: 开启 BGP 这对于我本地测试来说,没有任何作用
helm upgrade --install metallb metallb/metallb --version 0.15.2 --set "speaker.frr.enabled=false" -n metallb --create-namespace
  • Detect Node IP: kubectl get node -o wide | awk 'NR!=1{print $6}' 为了知道本机可以连接到 Orbstack 启动的 Kubernetes IP 段得先获取一下 node ip,假如 node ip 是: 198.19.249.2,那么就可以给 Metallb 配置的 ip 段为: 198.19.249.100-198.19.249.200切记:不要使用 en0 对应的 ip 段,可能会对局域网产生影响。

  • Configure Metallb

kubectl apply -n metallb -f - <<EOF
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: default-pool
spec:
  addresses:
    - 198.19.249.100-198.19.249.200
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: l2adv
spec:
  ipAddressPools:
    - default-pool
EOF
  • Test
kubectl apply -f - <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:mainline-alpine3.22
        ports:
        - name: http
          containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx
  type: LoadBalancer
EOF

等待一会,查看 Service 是否获取到了 External IP:kubectl get svc nginx