环境

系统:rocky9.4

k8s版本:v1.31.1 单节点

路由器:routerOS v7.15.3

安装metallb

我是使用truecharts helm安装的operator,然后在手动配置的

kubectl create ns metallb

创建metallb命名空间

helm install metallb oci://tccr.io/truecharts/metallb -n metallb

安装的时候可能会报错什么名字重复只需要在更新一下就可以了

helm upgrade metallb oci://tccr.io/truecharts/metallb -n metallb

配置metallb bgp

mkdir metallb ; cd metallb

创建一个目录放配置文件

创建一个文件叫bgp.yaml

apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: first-pool
  namespace: metallb
spec:
  addresses:
  - 10.0.1.1/24 # 可分配的 IP 地址
---
apiVersion: metallb.io/v1beta2
kind: BGPPeer
metadata:
  name: bgppeer
  namespace: metallb
spec:
  myASN: 64502 # MetalLB 使用的 AS 号
  peerASN: 64501 # 路由器的 AS 号
  peerAddress: 10.0.0.254 # 路由器地址
---
apiVersion: metallb.io/v1beta1
kind: BGPAdvertisement
metadata:
  name: local
  namespace: metallb
spec:
  ipAddressPools:
  - first-pool
  aggregationLength: 32
  localPref: 100
  communities:
  - 65535:65282

routerOS 配置

image.png

过滤器接受全部

Routing-Filters:accept;

image.png

image.png

测试

都创建好了,需要创建一个load balance的svc 才会建立session和路由

下面是创建一个nginx和svc nginx.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: docker.io/nginx:latest
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx2
  labels:
    app: nginx
spec:
  selector:
    app: nginx
  ports:
  - name: nginx-port
    protocol: TCP
    port: 80
    targetPort: 80
  type: LoadBalancer
kubectl create ns test
kubectl apply -f nginx -n test

创建test命名空间并创建nginx和loadbalance svc

image.png

kubectl get svc -n test

我们可以看到外部IP已经从我们设置的IP pool分配出来了,routerOS的路由表里也学习到了路由,网站也可以打开

image.png

image.png

最后修改:2025 年 04 月 04 日
感谢您的支持