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