Skip to main content

Calico: домашние loadbalancer'ы со вкусом BGP и OpenWRT

Честно - мне это все нейронка подсказала как это сделать.

Условия: роутер с установленным openwrt, k8s кластер (у меня rke2) с calico.

Подготовка на роутере:

apk add frr frr-pythontools frr-bgpd
sed -i 's@bgpd=no@bgpd=yes@' /etc/frr/daemons
# cat /etc/frr/frr.conf
frr version 10.4.1
frr defaults traditional
hostname Cudy # ur hostname
log syslog
!
password zebra
!
router bgp 65000
 bgp router-id 10.13.37.1 # ur router ip
 no bgp ebgp-requires-policy
 neighbor K8S_NODES peer-group
 neighbor K8S_NODES remote-as 65001
 bgp listen limit 10
 bgp listen range 10.13.37.0/24 peer-group K8S_NODES # ur home subnet
exit
!
access-list vty seq 5 permit 127.0.0.0/8
access-list vty seq 10 deny any
!
line vty
 access-class vty
exit
!
# вышли
/etc/init.d/frr start

В кубере:

У нас уже стоит calico. 

Проверяем что calicoNetwork.bgp=Enabled, если нет - включаем: kubectl get installations default -o yaml

Настраиваем:

[root@kubik-ctrl ~]# cat bgp.yaml 
---
# 1. Глобальная конфигурация BGP Calico
apiVersion: crd.projectcalico.org/v1
kind: BGPConfiguration
metadata:
  name: default
spec:
  logSeverityScreen: Info
  nodeToNodeMeshEnabled: true
  asNumber: 65001  # ASN нашего кластера K8s
  
  # ВАЖНО: Указываем, какие сервисы анонсировать во внешнюю сеть!
  # Вариант А: Анонсировать все ClusterIP сервисы
  #serviceClusterIPs:
  #- cidr: 10.96.0.0/12 
  
  # Вариант Б (Альтернатива): Анонсировать только внешние IP (аналог MetalLB)
  serviceExternalIPs:
  - cidr: 10.100.0.0/24

---
# 2. Настройка BGP-пира с роутером OpenWrt
apiVersion: crd.projectcalico.org/v1
kind: BGPPeer
metadata:
  name: openwrt-router
spec:
  peerIP: 10.13.37.1   # IP роутера
  asNumber: 65000       # ASN роутера
---
apiVersion: crd.projectcalico.org/v1
kind: IPPool
metadata:
  name: home-lb-pool
spec:
  cidr: 10.100.0.0/24
  # Указываем, что этот пул нужно анонсировать по BGP
  allowedUses:
  - LoadBalancer
---
# 1. Создаем фильтр: разрешаем только сервисные подсети, остальное режем
apiVersion: crd.projectcalico.org/v1
kind: BGPFilter
metadata:
  name: export-services-only
spec:
  exportV4:
  - action: Accept
    matchOperator: In
    cidr: 10.100.0.0/24  # Разрешаем анонс LoadBalancer (если используете)
  - action: Reject       # Всё остальное (включая подсети подов) отбрасываем

Проверяем:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
  - port: 80
    targetPort: 80
  type: LoadBalancer