cilium envoy 有两种选择:
- cilium agent 内置的 envoy: envoy 的最小实现,作为 L7 的代理(demo 场景推荐)
- 独立的 envoy 组件: 一个独立的 envoy 组件,在 cilium agent 之外
Cilium Ingress 实战配置示例
这个问题切中了云原生网络的核心组件交互,理解它们的关系能帮你理清流量管理逻辑。Cilium、Envoy 和 Ingress 本质是协作关系,共同完成从集群外部到内部服务的流量接入、转发与安全管控,层级上 Ingress 是流量入口定义,Envoy 是执行转发的“引擎”,Cilium 则负责整合并提供底层网络支持。
1. 三者的核心定位与分工
先明确每个组件的核心作用,这是理解关系的基础:
-
Ingress:仅是“流量规则定义”,本身不处理流量。它是 Kubernetes 的一种 API 资源,用来声明“外部请求的某个域名/路径,应该转发到集群内的哪个 Service”,比如将
api.example.com转发到api-service:8080。 -
Envoy:是“流量转发与处理引擎”。它是一款高性能代理,能根据规则实现路由、负载均衡、限流、TLS 终止等功能,是执行 Ingress 规则的“实际干活的组件”。
-
Cilium:是“网络与安全底座”。它基于 eBPF 实现容器网络(CNI),同时整合了 L7/HTTP 流量管理能力——其内部就集成了 Envoy 作为代理,让用户无需单独部署 Envoy,就能通过 Cilium 直接管理 Ingress 流量。
2. 三者的协作流程
外部流量进入集群时,三者的交互逻辑如下,本质是“规则定义→引擎执行→底座支撑”的链路:
-
用户定义 Ingress 规则:通过 YAML 声明 Ingress 资源,比如指定域名、路径、后端 Service 等。
-
Cilium 监听并解析规则:Cilium 作为 Kubernetes 网络插件,会监听 Ingress API 的变化,将用户定义的规则“翻译”成 Envoy 能理解的配置(如 Envoy 的
RouteConfiguration)。 -
Envoy 执行流量转发:Cilium 自动启动并管理 Envoy 代理实例(通常是每个节点一个,或按需求部署),将翻译后的规则下发给 Envoy;当外部流量到达时,Envoy 依据规则完成路由、负载均衡,最终将流量转发到集群内的目标 Pod。
-
Cilium 提供底层网络保障:在 Envoy 转发流量的同时,Cilium 通过 eBPF 实现 Pod 间的网络连通性、网络策略(如 L3/L4 防火墙),确保流量在集群内部的安全传输。
3. 与“独立部署 Ingress+Envoy”的区别
传统方案中,用户需单独部署 Ingress 控制器(如 Ambassador、Contour,这些控制器底层依赖 Envoy),再部署 Cilium 做 CNI;而 Cilium 整合后,流程更简化:
| 对比维度 | 传统方案(独立 Ingress+Envoy + Cilium) | Cilium 整合方案(Cilium+内置 Envoy) |
|---|---|---|
| 组件部署 | 需单独部署 Ingress 控制器(含 Envoy) | 仅部署 Cilium,Envoy 内置无需单独管理 |
| 规则同步 | Ingress 控制器→Envoy,再与 Cilium 协调 | Cilium 直接解析 Ingress→下发 Envoy,无额外协调 |
| 性能 | 多组件间转发,存在额外开销 | eBPF 加速 + Envoy 原生集成,延迟更低 |
| 功能集成 | 网络、Ingress 流量、安全需分开配置 | 网络、流量、安全策略统一在 Cilium 管理 |
以下为完整的 Cilium Ingress 实战配置示例,涵盖环境准备、测试服务部署、基础路由配置、TLS加密配置四大核心环节,可直接在已部署 Cilium 的 Kubernetes 集群中执行验证。
4. Cilium Ingress 实战配置步骤
4.1 前置条件:确认 Cilium Ingress 功能已启用
首先需确保 Cilium 已开启 Ingress 控制器功能,不同部署方式的启用方式略有差异:
- Helm 部署(推荐) :部署时通过参数开启,若已部署可执行升级命令:
helm upgrade cilium cilium/cilium --namespace kube-system --set ingressController.enabled=true - 手动部署:修改 Cilium 的 ConfigMap ,添加
ingressController.enabled=true配置后重启Cilium Pod。 - 验证启用结果:执行以下命令,若能看到
cilium-ingress-controller相关进程或日志,说明功能已启用:kubectl logs -n kube-system -l app.kubernetes.io/name=cilium | grep ingress
4.2 步骤1:部署测试服务
为验证 Ingress 转发效果,先部署两个简单的 Nginx 服务(分别模拟"前端服务"和"后端API服务"),并暴露为Kubernetes Service。
创建test-services.yaml文件,内容如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: frontend-service
spec:
replicas: 2
selector:
matchLabels:
app: frontend
template:
metadata:
labels:
app: frontend
spec:
containers:
- name: nginx
image: nginx:alpine
ports:
- containerPort: 80
# 自定义首页,便于区分服务
command: ["/bin/sh", "-c"]
args: ["echo 'This is Frontend Service' > /usr/share/nginx/html/index.html; nginx -g 'daemon off;'"]
---
apiVersion: v1
kind: Service
metadata:
name: frontend-service
spec:
selector:
app: frontend
ports:
- port: 80
targetPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: api-service
spec:
replicas: 2
selector:
matchLabels:
app: api
template:
metadata:
labels:
app: api
spec:
containers:
- name: nginx
image: nginx:alpine
ports:
- containerPort: 80
command: ["/bin/sh", "-c"]
args: ["echo 'This is API Service' > /usr/share/nginx/html/index.html; nginx -g 'daemon off;'"]
---
apiVersion: v1
kind: Service
metadata:
name: api-service
spec:
selector:
app: api
ports:
- port: 80
targetPort: 80
执行部署命令,并验证服务状态:
# 部署服务
kubectl apply -f test-services.yaml
# 验证 Deployment 和 Service 状态(确保 READY 状态为 2/2)
kubectl get deployments
kubectl get services
4.3 步骤2:基础 Ingress 路由配置(域名+路径转发)
此示例实现两个核心路由规则:
-
- 访问
example.com时,转发到前端服务(frontend-service);
- 访问
-
- 访问
example.com/api时,转发到后端 API 服务(api-service)。
- 访问
创建basic-ingress.yaml文件,内容如下:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: basic-cilium-ingress
# 关键:指定使用 Cilium 作为 Ingress 控制器
annotations:
kubernetes.io/ingress.class: cilium
spec:
rules:
# 规则1:匹配域名 example.com
- host: example.com
http:
paths:
# 子规则1:根路径转发到前端服务
- path: /
pathType: Prefix
backend:
service:
name: frontend-service
port:
number: 80
# 子规则2:/api 路径转发到API服务
- path: /api
pathType: Prefix
backend:
service:
name: api-service
port:
number: 80
执行部署并验证:
# 部署 Ingress 规则
kubectl apply -f basic-ingress.yaml
# 查看 Ingress 状态(重点关注 ADDRESS 列,为 Cilium Ingress 的入口IP)
kubectl get ingress basic-cilium-ingress
测试访问效果:通过 Ingress 入口 IP 访问,需手动绑定域名解析(本地修改 /etc/hosts 文件,添加Ingress 入口 IP example.com),然后执行:
# 访问根路径,应返回前端服务内容
curl example.com
# 访问/api路径,应返回API服务内容
curl example.com/api
4.4 步骤3:TLS 加密配置(HTTPS访问)
为 Ingress 配置 TLS 证书,实现 HTTPS 访问。需先创建 Kubernetes Secret 存储证书(此处使用自签证书演示,生产环境需使用 CA 签发证书)。
3.1 生成自签证书
# 生成私钥
openssl genrsa -out tls.key 2048
# 生成证书签名请求(CSR),CN 需与 Ingress 域名一致(example.com)
openssl req -new -key tls.key -out tls.csr -subj "/CN=example.com"
# 生成自签证书
openssl x509 -req -days 365 -in tls.csr -signkey tls.key -out tls.crt
# 创建 Kubernetes Secret(存储在与 Ingress 相同的命名空间,此处为 default)
kubectl create secret tls example-tls-secret --cert=tls.crt --key=tls.key
3.2 部署 TLS 版 Ingress
创建tls-ingress.yaml文件,在基础路由规则上增加tls字段:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: tls-cilium-ingress
annotations:
kubernetes.io/ingress.class: cilium
spec:
# 新增 TLS 配置,关联之前创建的 Secret
tls:
- hosts:
- example.com # 需与证书 CN 一致
secretName: example-tls-secret # 证书存储的 Secret 名称
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: frontend-service
port:
number: 80
- path: /api
pathType: Prefix
backend:
service:
name: api-service
port:
number: 80
执行部署并测试:
# 部署 TLS Ingress
kubectl apply -f tls-ingress.yaml
# 查看 Ingress 状态
kubectl get ingress tls-cilium-ingress
# 测试 HTTPS 访问(-k 参数忽略自签证书验证)
curl -k https://example.com
curl -k https://example.com/api
4.5 步骤4:关键验证与问题排查
- 验证 Cilium 与 Envoy 联动:查看 Cilium 管理的 Envoy 配置,确认 Ingress 规则已下发:
kubectl exec -n kube-system <cilium-pod-name> -- cilium envoy config get route --name ingress - 访问失败排查:
-
- 检查 Ingress 规则是否正常:
kubectl describe ingress <ingress-name>
- 检查 Ingress 规则是否正常:
-
- 查看 Cilium 日志:
kubectl logs -n kube-system <cilium-pod-name>
- 查看 Cilium 日志:
-
- 查看 Envoy 日志:
kubectl exec -n kube-system <cilium-pod-name> -- cilium envoy logs (不对)
- 查看 Envoy 日志:
5. 进阶配置参考(可选)
Cilium Ingress 基于 Envoy,支持更多高级特性,可通过 Annotations 配置:
- 负载均衡算法:指定后端服务的负载均衡方式,如轮询、最小连接数:
nginx.ingress.kubernetes.io/load-balance: "least_conn" - 限流:限制单 IP 的访问频率:
cilium.io/ingress.ratelimit: '{"rate": 10, "burst": 20, "scope": "ip"}' - HTTPS 重定向:强制将 HTTP 请求重定向到 HTTPS:
nginx.ingress.kubernetes.io/ssl-redirect: "true"
以上配置覆盖了 Cilium Ingress 的核心使用场景,可根据实际业务需求调整规则和高级特性。若需实现更复杂的流量管控(如灰度发布、流量镜像),可进一步结合 Cilium 的 L7 策略或 Envoy 的原生配置。