Cilium + ebpf 系列文章- (六)Cilium-BGP与分发-EXTERNAL-IP
一、首先你安装的Cilium需要支持BGP
cilium install \
--version v1.16.1 \
--set ipam.mode=kubernetes \
--set routingMode=native \
--set ipv4NativeRoutingCIDR="10.0.0.0/8" \
--set bgpControlPlane.enabled=true \
--set k8s.requireIPv4PodCIDR=true
这个命令用于安装 Cilium,并配置一些特定的参数。以下是每个参数的解释:
cilium install \
:这是安装 Cilium 的基本命令。--version v1.16.1 \
:指定要安装的 Cilium 版本为 v1.16.1。--set ipam.mode=kubernetes \
:设置 IP 地址管理(IPAM)模式为 Kubernetes,这意味着 Cilium 将使用 Kubernetes 的 IPAM 机制来分配 IP 地址。--set routingMode=native \
:这意味着 Cilium 将使用主机的原生路由功能来处理网络流量,而不是使用隧道模式。--set ipv4NativeRoutingCIDR="10.0.0.0/8" \
:设置原生 IPv4 路由的 CIDR 范围为 10.0.0.0/8。--set bgpControlPlane.enabled=true \
:启用 BGP 控制平面。--set k8s.requireIPv4PodCIDR=true
:要求 Kubernetes 使用 IPv4 Pod CIDR。这个命令通过指定这些参数来定制 Cilium 的安装和配置,以满足特定的网络需求。
验证安装:
cilium status --wait cilium config view | grep enable-bgp
二、使用下面3个CRD资源对象
随着Cilium 1.16.0中引入的BGP v2控制平面,对等连接策略可以使用三个Kubernetes crd的组合来配置:
CiliumBGPClusterConfig设置对等连接端点,可以引用一个或多个CiliumBGPPeerConfig资源(使用资源名)
CiliumBGPPeerConfig配置对等连接的行为,可以引用一个或多个CiliumBGPAdvertisement资源(使用选择器)
ciiliumbgpadvertisement通过BGP发布的cidr。简单来说:
Ciiliumbgpadvertisement 来管理要发布哪些IP地址。可以是pod也可以是svc的外部地址。
CiliumBGPPeerConfig 这个主要是管理建立邻居的特殊参数。(下一篇有额外解释)
CiliumBGPClusterConfig 这个是配置对端的AS号以及对端建立邻居的IP地址。并且只会在匹配了相应标签的node节点上建立BGP虚拟控制面。
root@server:~# yq $HOME/bgp/*.yaml
---
apiVersion: "cilium.io/v2alpha1"
kind: CiliumBGPAdvertisement
metadata:
name: services
labels:
advertise: generic
spec:
advertisements:
- advertisementType: "PodCIDR"
# - advertisementType: "Service"
# service:
# addresses:
# - LoadBalancerIP
# selector:
# matchLabels:
# color: yellow
# matchExpressions:
# - {key: io.kubernetes.service.namespace, operator: In, values: ["tenant-c"]}
---
apiVersion: "cilium.io/v2alpha1"
kind: CiliumBGPClusterConfig
metadata:
name: tor
spec:
nodeSelector:
matchLabels:
kubernetes.io/hostname: clab-bgp-cplane-devel-control-plane
bgpInstances:
- name: "instance-65001"
localASN: 65001
peers:
- name: "peer-65000-tor"
peerASN: 65000
peerAddress: "172.0.0.1"
peerConfigRef:
name: "peer-config-generic"
---
apiVersion: "cilium.io/v2alpha1"
kind: CiliumBGPPeerConfig
metadata:
name: peer-config-generic
spec:
families:
- afi: ipv4
safi: unicast
advertisements:
matchLabels:
advertise: "generic"
三、分发-EXTERNAL-IP
1、可以使用CiliumLoadBalancerIPPool来分发LoadBalancer类型Service的IP地址。
root@server:~# yq pool.yaml
# No selector, match all
apiVersion: "cilium.io/v2alpha1"
kind: CiliumLoadBalancerIPPool
metadata:
name: "pool"
spec:
blocks:
- cidr: "20.0.10.0/24"
*无规则
root@server:~# yq pool-primary.yaml
# Expression selector
apiVersion: "cilium.io/v2alpha1"
kind: CiliumLoadBalancerIPPool
metadata:
name: "pool-primary"
spec:
blocks:
- cidr: "60.0.10.0/24"
serviceSelector:
matchExpressions:
- {key: color, operator: In, values: [yellow, red, blue]}
*基于Service的标签匹配来分配
root@server:~# yq pool-yellow.yaml
# Namespace selector
apiVersion: "cilium.io/v2alpha1"
kind: CiliumLoadBalancerIPPool
metadata:
name: "pool-yellow"
spec:
blocks:
- cidr: "50.0.10.0/24"
serviceSelector:
matchLabels:
"io.kubernetes.service.namespace": "tenant-c"
*基于命名空间来匹配