k8s RKE2 cilium L2 + envoy gateway 安装配置

k8s RKE2 cilium L2 + envoy gateway 安装配置

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。