cilium L2 load balancer 配置
配置rke2-config
创建配置
1/var/lib/rancher/rke2/server/manifests/rke2-cilium-config.yaml
修改 HelmChartConfig,你的配置需要改成这样(关键部分):
1apiVersion: helm.cattle.io/v1
2kind: HelmChartConfig
3metadata:
4 name: rke2-cilium
5 namespace: kube-system
6spec:
7 valuesContent: |-
8 kubeProxyReplacement: true
9
10 k8sServiceHost: 10.10.10.100 #vip地址
11 k8sServicePort: 6443
12
13 l2announcements:
14 enabled: true
15
16 externalIPs:
17 enabled: true
18
19 devices:
20 - ens192 #网卡名称
重启 RKE2
1systemctl restart rke2-server
确认 L2 生效
1kubectl -n kube-system get cm cilium-config -o yaml | grep l2
应该出现:
1enable-l2-announcements: "true"
创建 IP Pool
1apiVersion: cilium.io/v2
2kind: CiliumLoadBalancerIPPool
3metadata:
4 name: default-pool
5spec:
6 blocks:
7 - start: 10.10.10.180 # 地址池ip范围
8 stop: 10.10.10.200
应用
1kubectl apply -f cilium-lb-ipam-pool.yaml
创建 L2 announcement
1apiVersion: cilium.io/v2alpha1
2kind: CiliumL2AnnouncementPolicy
3metadata:
4 name: announce-lb
5spec:
6 loadBalancerIPs: true
应用
1kubectl apply -f cilium-l2-announcement-policy.yaml
创建 service 测试
1# 测试 Cilium LB IPAM:部署一个简单服务并用 LoadBalancer 暴露
2# 应用后查看 EXTERNAL-IP 应从 10.10.10.180~10.10.10.200 中分配:kubectl get svc -n default test-lb
3---
4apiVersion: apps/v1
5kind: Deployment
6metadata:
7 name: test-lb
8 namespace: default
9 labels:
10 app: test-lb
11spec:
12 replicas: 1
13 selector:
14 matchLabels:
15 app: test-lb
16 template:
17 metadata:
18 labels:
19 app: test-lb
20 spec:
21 containers:
22 - name: nginx
23 image: nginx:alpine
24 ports:
25 - containerPort: 80
26---
27apiVersion: v1
28kind: Service
29metadata:
30 name: test-lb
31 namespace: default
32spec:
33 type: LoadBalancer
34 selector:
35 app: test-lb
36 ports:
37 - port: 80
38 targetPort: 80
39 protocol: TCP
40 name: http
应用
1kubectl apply -f test.yaml
1kubectl get svc
可以看到
1test-lb LoadBalancer 10.43.xxx.xxx 10.10.10.180
部署 Envoy Gateway
在 RKE2 环境中部署 Envoy Gateway (EG) 是一个非常明智的选择,特别是考虑到 RKE2 默认集成的 Nginx Ingress 已逐渐进入维护状态。
Envoy Gateway 基于 Kubernetes Gateway API 标准,能够提供更强大的流量管理能力(如负载均衡、限流、鉴权等)。
禁用默认 Ingress
在 /etc/rancher/rke2/config.yaml 中添加
1disable:
2 - rke2-ingress-nginx
重启RKE2 服务
1systemctl restart rke2-server
声明式部署 Envoy Gateway 控制平面
下载你需要的 crds.yaml
1wget https://github.com/envoyproxy/gateway/releases/download/v1.7.0-rc.2/envoy-gateway-crds.yaml
部署
1kubectl create namespace envoy-gateway-system
2kubectl create -f envoy-gateway-crds.yaml
部署控制平面核心
创建文件 /var/lib/rancher/rke2/server/manifests/01-envoy-gateway.yaml:
1apiVersion: helm.cattle.io/v1
2kind: HelmChart
3metadata:
4 name: envoy-gateway
5 namespace: kube-system
6spec:
7 chart: gateway-helm
8 repo: oci://registry-1.docker.io/envoyproxy
9 version: v1.7.0
10 targetNamespace: envoy-gateway-system
11 valuesContent: |-
12 deployment:
13 replicas: 1
14 envoyGateway:
15 gateway:
16 controllerName: gateway.envoyproxy.io/gatewayclass-controller
等待片刻,RKE2 会自动触发 Helm Job。可以通过 kubectl get pods -n envoy-gateway-system 确认 envoy-gateway 容器状态变为 Running。
初始化 Gateway 实例 (数据平面)
控制平面就绪后,需要创建 Gateway 资源来拉起真正处理流量的 Envoy Proxy 数据面。
创建一个名为 02-gateway-instance.yaml 的文件并执行 kubectl apply -f 02-gateway-instance.yaml:
1---
2# 1. 定义网关类
3apiVersion: gateway.networking.k8s.io/v1
4kind: GatewayClass
5metadata:
6 name: eg-gateway-class
7spec:
8 controllerName: gateway.envoyproxy.io/gatewayclass-controller
9---
10# 2. 实例化网关
11apiVersion: gateway.networking.k8s.io/v1
12kind: Gateway
13metadata:
14 name: main-gateway
15 namespace: envoy-gateway-system
16spec:
17 gatewayClassName: eg-gateway-class
18 listeners:
19 # 开启 HTTP 监听
20 - name: http
21 protocol: HTTP
22 port: 80
23 allowedRoutes:
24 namespaces:
25 from: All
26 # 开启 HTTPS 监听 (需提前创建 TLS Secret)
27 # - name: https
28 # protocol: HTTPS
29 # port: 443
30 # tls:
31 # mode: Terminate
32 # certificateRefs:
33 # - name: your-tls-secret
34 # kind: Secret
35 # allowedRoutes:
36 # namespaces:
37 # from: All
38
39### HTTPRout 配置也可以单独部署
40---
41apiVersion: gateway.networking.k8s.io/v1
42kind: HTTPRoute
43metadata:
44 name: http-route
45 namespace: default
46spec:
47 parentRefs:
48 - name: main-gateway
49 namespace: envoy-gateway-system
50 sectionName: http
51 rules:
52 - matches:
53 - path:
54 type: PathPrefix
55 value: /
56 backendRefs:
57 - name: test-lb
58 port: 80
验证阶段:
此时,Envoy Gateway 会动态生成一个 Envoy Proxy 的 Deployment 和 LoadBalancer Service。
执行 kubectl get svc -n envoy-gateway-system,你应该能看到 envoy-main-gateway-... 获取到了 Cilium 分配的 EXTERNAL-IP。
业务路由配置 (HTTPRoute 实战)
现在可以将核心业务接入网关。Gateway API 通过 HTTPRoute 将域名/路径映射到后端服务。
假设我们有一个前端服务 test-frontend 和一个后端服务 test-backend 运行在命名空间中。
创建路由配置 03-business-routes.yaml 并 apply:
1apiVersion: gateway.networking.k8s.io/v1
2kind: HTTPRoute
3metadata:
4 name: test-route
5 namespace: dev
6spec:
7 parentRefs:
8 # 绑定到第三阶段创建的 main-gateway
9 - name: main-gateway
10 namespace: envoy-gateway-system
11 hostnames:
12 - "test.local" # 你的测试或生产域名
13 rules:
14 # 规则 1:API 接口路由到后端服务
15 - matches:
16 - path:
17 type: PathPrefix
18 value: /api
19 backendRefs:
20 - name: test-backend
21 port: 8080
22 weight: 100
23 # 可选:利用 Envoy 重写路径 (剥离 /api 前缀)
24 filters:
25 - type: URLRewrite
26 urlRewrite:
27 path:
28 type: ReplacePrefixMatch
29 replacePrefixMatch: /
30
31 # 规则 2:默认所有其他请求路由到前端静态资源
32 - matches:
33 - path:
34 type: PathPrefix
35 value: /
36 backendRefs:
37 - name: test-frontend
38 port: 80
生产环境进阶建议
镜像仓库代理加速:对于 Harbor 镜像仓库,如果存在大文件推拉,Envoy 的性能通常优于 Nginx,可以在
Gateway的 listener 中调整超时时间和最大请求体限制。AI API 暴露与限流:如果你在集群内部署了 Ollama 等本地大模型,可以通过 Envoy Gateway 的
ClientTrafficPolicy(一种针对 Gateway API 的扩展策略)对暴露给外部的 LLM 接口进行精准的 QPS 限流,防止硬件资源被瞬间打满。CI/CD 自动化集成:在使用 TeamCity 进行持续部署时,只需在 Pipeline 最后的 Deploy 阶段,将新的镜像 tag 更新到 Deployment,
HTTPRoute无需任何修改即可平滑地将流量导向新 Pod。















