在Kubernetes环境中引入Cilium和Hubble,并为绘制出精美的服务拓扑图而惊叹不已吗?🤩 然而,当您仔细查看流量时,是否只看到了L3/L4、TCP、Unknown等信息,却发现我们真正想看到的详细L7(应用层)信息,如HTTP GET /api/users、Kafka Produce message等,并未显示,从而感到沮丧?
如果您曾想过:“L7可见性明明是Cilium的核心功能,为什么我却看不到呢?”那么,今天的这篇文章将完美解决您的疑问。事实上,这既不是bug,也不是配置错误。它与Cilium一个非常重要的“哲学”有关。

🤔 为什么L7流量默认不可见?性能,以及选择与集中!
首先需要了解的是,Cilium默认情况下不会对所有流量执行L7解析。
试想一下。逐一打开集群内所有进出的网络数据包,分析它们是HTTP、Kafka还是gRPC,这项工作会消耗大量的CPU和内存资源。🤯 如果将此操作应用于所有流量,可能会对网络性能产生巨大影响。
Cilium的优势在于通过eBPF在内核级别高效运行,而无差别的L7解析可能会抵消这一优势。
因此,Cilium采用了“Opt-in”方式:“为了性能,默认是L3/L4,L7分析只针对用户明确请求的流量执行!” 也就是说,只有当我们告诉Cilium:“进入此服务的流量是HTTP,请仔细查看!”Cilium才会部署L7代理(Envoy)开始详细分析流量。
这就是整体的背景。我们现在只需要学习如何告诉Cilium“应该分析哪些流量”。
✨ 魔法的一行:通过Annotation激活L7可见性
指示Cilium分析特定服务流量最简单明了的方法,就是在Kubernetes Service中添加特定的Annotation。
Annotation是为Kubernetes对象提供额外元数据的功能,各种工具或控制器可以读取这些值来执行特定操作。Cilium也正是利用了这种Annotation。
接下来,我们通过实际示例来看看如何应用。
这里有一个指向my-app Pod的普通Service。
# 💻 原始数据: 应用前的Service YAML
apiVersion: v1
kind: Service
metadata:
name: my-app-service
spec:
type: ClusterIP
selector:
app: my-app
ports:
- name: http
port: 80
targetPort: 8080
protocol: TCP
在当前状态下,进入my-app-service:80的流量在Hubble中只会显示为TCP流量。现在,让我们添加一行魔法Annotation。
# 💻 原始数据: 应用L7解析Annotation后的Service YAML
apiVersion: v1
kind: Service
metadata:
name: my-app-service
annotations:
# ✨ 这就是关键!它指示解析进入80端口的HTTP流量。
io.cilium/proxy-visibility: "<80/HTTP>"
spec:
type: ClusterIP
selector:
app: my-app
ports:
- name: http
port: 80
targetPort: 8080
protocol: TCP
我们在metadata.annotations字段中添加了io.cilium/proxy-visibility: “<80/HTTP>“。此Annotation的含义如下:
- io.cilium/proxy-visibility: 这是Key,表示我们要设置Cilium代理的可见性。
- <80/HTTP>: 这是Value,指示Cilium将进入此服务的80端口的流量解析为HTTP协议。
当您使用kubectl apply将此YAML应用到集群时,Cilium会立即检测到流向此服务的流量,并动态部署L7代理(Envoy),开始详细分析HTTP请求。
现在,再次查看Hubble UI。您将看到以下美丽的L7信息,而不是Unknown或TCP:
- GET /api/v1/users
- POST /api/v1/login
- Response: 200 OK
- Response: 404 Not Found
是不是很简单?像这样使用Annotation是一种强大而直接的方法,可以轻松地为特定工作负载启用可见性。
💡 提示:如果您想解析多个端口或使用其他协议(例如Kafka)怎么办?您可以像io.cilium/proxy-visibility: “<80/HTTP>,<9092/Kafka>“一样,用逗号分隔定义多个规则。
❌ 常见的误解和错误方法
在尝试解决此问题时,有一些常见的陷阱。了解为什么其他方法不是正确答案,将有助于您更深入地理解Cilium。
1. “难道只安装Hubble就够了吗?” (
背景:Hubble扮演着“观测站”🔭的角色,用于可视化Cilium收集的数据。数据收集完全是Cilium的职责。如果Cilium不收集(解析)L7数据,Hubble就没有数据可显示。因此,仅仅安装Hubble并不能激活L7可见性。
2. “给Pod打上Label不就行了吗?”
背景:在Kubernetes中,Label和Annotation的作用不同。Label主要用于通过选择器等方式“选择”和分组对象(例如:app=my-app)。而Annotation是非识别性元数据,用于指示工具或系统执行特定“操作”或提供额外信息。激活L7解析是指示Cilium代理执行特定操作,因此使用Annotation在语义和功能上都是正确的方法。⚙️
3. “必须应用Cilium网络策略(CNP)吗?”
背景:开启L7可见性主要有两种方法。第一种是今天介绍的Annotation方法,第二种是应用包含L7规则的CiliumNetworkPolicy。通过策略应用L7安全规则,例如允许GET /public路径并阻止其他路径,Cilium会为了执行该策略而自然地开始L7解析。也就是说,应用CNP也是开启L7可见性的“方法之一”,但不是“唯一方法”。如果只是想观察流量,Annotation方式要简单得多。
结语
Cilium和Hubble的L7可见性不仅仅是一个“功能”,更是eBPF网络强大之处的证明。在不损害性能的前提下,能够根据需要精确地深入查看特定工作负载的流量,这种灵活性在云原生环境中至关重要。
现在,请在您的Hubble服务拓扑图中,用清晰的L7数据取代那些令人困惑的Unknown,直接查看应用程序的内部细节吧!只需一行Annotation,您的Kubernetes集群管理将变得更加智能。✨
发表回复