七层可视性

查看本文大纲

虽然监控数据路径状态提供对数据路径状态的自省,但默认情况下它只会提供对三层/四层数据包事件的可视性。如果配置了 七层示例,则可以查看七层协议,但这需要编写每个选定端点的完整策略。为了在不配置完整策略的情况下获得对应用程序的更多可视性,Cilium 提供了一种在与 Kubernetes 一起运行时通过注解来规定可视性的方法。

可视性信息由注解中以逗号分隔的元组列表表示:

<{Traffic Direction}/{L4 Port}/{L4 Protocol}/{L7 Protocol}>

例如:

<Egress/53/UDP/DNS>,<Egress/80/TCP/HTTP>

为此,你可以在 Kubernetes YAML 中或通过命令行提供注释,例如:

kubectl annotate pod foo -n bar io.cilium.proxy-visibility="<Egress/53/UDP/DNS>,<Egress/80/TCP/HTTP>"

Cilium 将拾取 pod 已收到这些注释,并将透明地将流量重定向到代理,以便显示 cilium monitor 流量的输出被重定向到代理,例如:

-> Request http from 1474 ([k8s:id=app2 k8s:io.kubernetes.pod.namespace=default k8s:appSecond=true k8s:io.cilium.k8s.policy.cluster=default k8s:io.cilium.k8s.policy.serviceaccount=app2-account k8s:zgroup=testapp]) to 244 ([k8s:io.cilium.k8s.policy.cluster=default k8s:io.cilium.k8s.policy.serviceaccount=app1-account k8s:io.kubernetes.pod.namespace=default k8s:zgroup=testapp k8s:id=app1]), identity 30162->42462, verdict Forwarded GET http://app1-service/ => 0
-> Response http to 1474 ([k8s:zgroup=testapp k8s:id=app2 k8s:io.kubernetes.pod.namespace=default k8s:appSecond=true k8s:io.cilium.k8s.policy.cluster=default k8s:io.cilium.k8s.policy.serviceaccount=app2-account]) from 244 ([k8s:io.cilium.k8s.policy.serviceaccount=app1-account k8s:io.kubernetes.pod.namespace=default k8s:zgroup=testapp k8s:id=app1 k8s:io.cilium.k8s.policy.cluster=default]), identity 30162->42462, verdict Forwarded GET http://app1-service/ => 200

您可以通过检查该 pod 的 Cilium 端点来检查可视性策略的状态,例如:

$ kubectl get cep -n kube-system
NAME                       ENDPOINT ID   IDENTITY ID   INGRESS ENFORCEMENT   EGRESS ENFORCEMENT   VISIBILITY POLICY   ENDPOINT STATE   IPV4           IPV6
coredns-7d7f5b7685-wvzwb   1959          104           false                 false                                    ready            10.16.75.193   f00d::a10:0:0:2c77
$
$ kubectl annotate pod -n kube-system coredns-7d7f5b7685-wvzwb io.cilium.proxy-visibility="<Egress/53/UDP/DNS>,<Egress/80/TCP/HTTP>" --overwrite
pod/coredns-7d7f5b7685-wvzwb annotated
$
$ kubectl get cep -n kube-system
NAME                       ENDPOINT ID   IDENTITY ID   INGRESS ENFORCEMENT   EGRESS ENFORCEMENT   VISIBILITY POLICY   ENDPOINT STATE   IPV4           IPV6
coredns-7d7f5b7685-wvzwb   1959          104           false                 false                OK                  ready            10.16.75.193   f00d::a10:0:0:2c7

故障排查

如果七层可视性未出现在 cilium monitor 或 Hubble 组件中,则值得仔细检查:

  • 没有在注解中指定的方向应用强制策略
  • CiliumEndpoint 中的“可视性策略”列显示 OK。如果为空,则未配置注解;如果显示错误,则可视性注解存在问题。

以下示例故意错误配置注解,以证明当可视性注解无法实现时,pod 的 CiliumEndpoint 会出现错误:

$ kubectl annotate pod -n kube-system coredns-7d7f5b7685-wvzwb io.cilium.proxy-visibility="<Ingress/53/UDP/DNS>,<Egress/80/TCP/HTTP>"
pod/coredns-7d7f5b7685-wvzwb annotated
$
$ kubectl get cep -n kube-system
NAME                       ENDPOINT ID   IDENTITY ID   INGRESS ENFORCEMENT   EGRESS ENFORCEMENT   VISIBILITY POLICY                        ENDPOINT STATE   IPV4           IPV6
coredns-7d7f5b7685-wvzwb   1959          104           false                 false                dns not allowed with direction Ingress   ready            10.16.75.193   f00d::a10:0:0:2c77

限制

  • 如果导入的规则选择了被注解的 pod,则可视性注解将不适用。
  • DNS 可视性仅在 egress 上可用。
  • 不支持 Proxylib 解析器,包括 Kafka。要获得对这些协议的可视性,你必须创建一个允许所有七层流量的网络策略,方法是遵循 七层示例(Kafka)或 Envoy proxylib 扩展指南。此限制见 GitHub Issue 14072