前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >介绍kube-iptables-tailer:在Kubernetes集群中提高网络可见性

介绍kube-iptables-tailer:在Kubernetes集群中提高网络可见性

作者头像
CNCF
发布2019-12-04 11:04:44
9150
发布2019-12-04 11:04:44
举报
文章被收录于专栏:CNCF

作者:Box软件工程师Saifuding Diliyaer

Box使用Kubernetes让我们的工程师能够拥有他们微服务的整个生命周期。在网络方面,我们的工程师使用Tigera的Calico项目,以声明方式管理在我们的Kubernetes集群中运行的应用程序的网络政策。应用程序所有者定义Calico政策以使其Pods能够发送/接收网络流量,该流量被实例化为iptables规则。

但是,有时候应用程序所有者会丢失或不正确声明此类网络政策。在这种情况下,iptables规则将导致受影响的Pod之间的网络数据包丢失,这将记录在应用程序所有者无法访问的文件中。我们需要一种机制来根据网络政策,无缝地发送有关iptables数据包丢弃的警报,以帮助应用程序所有者快速诊断相应的问题。为了解决这个问题,我们开发了一个名为kube-iptables-tailer的服务,检测来自iptables日志的数据包丢弃,并将其报告为Kubernetes事件。无论你是使用Calico还是其他网络政策工具,我们很自豪地开源了kube-iptables-tailer,让你在自己的群集中使用。

改善应用程序所有者的体验

应用程序所有者不必应用任何其他更改来使用kube-iptables-tailer。他们可以简单地运行kubectl describe pods,检查他们的Pod的流量是否因iptables规则而被丢弃。从kube-iptables-tailer发送的所有结果都将显示在Events部分下,与阅读原始iptables日志相比,这对开发人员来说是一个更好的体验。

代码语言:javascript
复制
$ kubectl describe pods --namespace=YOUR_NAMESPACE

...
Events:
 Type     Reason      Age    From                    Message
 ----     ------      ----   ----                    -------    
 Warning  PacketDrop  5s     kube-iptables-tailer    Packet dropped when receiving traffic from example-service-2 (IP: 22.222.22.222).

 Warning  PacketDrop  10m    kube-iptables-tailer    Packet dropped when sending traffic to example-service-1 (IP: 11.111.11.111).

*从kube-iptables-tailer发送到具有网络问题的Kubernetes Pods的事件输出

kube-iptables-tailer背后的流程

在我们使用kube-iptables-tailer之前,Box的工程师获取与其网络政策相关的数据包丢失信息的唯一方法,是解析原始iptables日志,并匹配其服务IP。这是次优的体验,因为iptables日志只包含基本的IP地址信息。将这些IP映射到特定的Pod可能会很痛苦,尤其是在Kubernetes世界,其中Pod和容器是短暂的并且IP经常变化。这个过程涉及到我们工程师的一系列手动命令。此外,由于大量丢弃,iptables日志可能会产生噪音,如果IP地址被重用,应用程序所有者甚至可能会有一些陈旧的数据。在kube-iptables-tailer的帮助下,我们的开发者现在的生活变得更加容易。如下图所示,该服务的原理可分为三个步骤:

* kube-iptables-tailer的序列图

1. 观察iptables日志文件的更改

我们现在使用kube-iptables-tailer来帮助识别该文件中的更改,而不是要求工程师人工手动解密原始iptables日志。我们在集群中的每个主机节点上,将服务作为DaemonSet运行,并定期观察iptables日志文件。服务本身是用Go编写的,它有多个goroutine,用于同时运行的不同服务组件。我们使用信道(channel)在各种组件之间共享信息。例如,在此步骤中,服务会将在iptables日志文件中检测到的任何更改,发送到Go信道作稍后解析。

2. 根据日志前缀解析iptables日志

一旦解析器通过特定Go信道接收到新的日志消息,它将首先通过解析日志前缀,检查日志消息是否包括任何与网络政策相关的丢包信息。基于我们的Calico政策的数据包丢弃将被记录,其中包含“calico-drop:”作为iptables日志文件中的日志前缀。在这种情况下,解析器将创建一个对象,并将来自日志消息的数据,存储为对象的字段。这些方便的对象稍后将用于定位在Kubernetes中运行的相关Pod,并直接向它们发布通知。解析器还能够识别重复日志,并对其进行过滤,以避免引起混淆并消耗额外资源。在解析过程之后,它将进入kube-iptables-tailer发送结果的最后一步。

3. 找到pod并发送事件

使用Kubernetes API,kube-iptables-tailer将尝试通过匹配存储在从上一步骤解析的对象中的IP,定位集群中的发件人和接收者。因此,如果成功找到事件,则会将事件发布到这些受影响的Pod。Kubernetes事件是对象,旨在提供有关Kubernetes组件内发生事情的信息。Box使用Kubernetes事件的一个用例是直接向相应的应用程序报告错误(有关更多详细信息,请参阅此博客文章)。kube-iptables-tailer生成的事件包括有用的信息,例如来自另一方的流量方向、IP和Pod的命名空间。我们还添加了DNS查找,因为我们的Pod还可以从裸机和VM上运行的服务发送和接收流量。此外,也实现了指数退避以避免压倒Kubernetes API服务器。

https://kubernetes.cn/blog/2018/01/reporting-errors-using-kubernetes-events/

总结

Box使用kube-iptables-tailer节省了时间,让各个团队的许多开发者的生活更加快乐。该服务可以帮助检测iptables日志文件中的更改,并将相应的信息直接发送到Kubernetes集群内的Pod,而不是根据网络政策对丢包进行盲目处理。如果你不使用Calico,你仍然可以应用任何其他日志前缀(在服务中配置为环境变量),匹配你的iptables规则中定义的任何内容,并获得有关网络政策相关数据包丢弃的通知。通过Kubernetes API将主机系统的信息提供给Pod,你还可以找到其他有用的情况。作为一个开源项目,我们非常欢迎每一项贡献,以帮助共同改进项目。你可以在Github上找到项目:https://github.com/box/kube-iptables-tailer。

特别感谢Kunal Parmar、Greg Lyons和Shrenik Dedhia为这个项目做出的贡献。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-04-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 CNCF 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档