Linode系统工程师Jon "jfred" Frederickson分享了他在Linode上运行Kubernetes时建立IP白名单功能的经验。
随着Linode的工程团队建立了我们的Kubernetes功能,我们遇到了很多障碍,正如预期的那样。然而,出现了一个我们没有预料到的挑战:如何将在Kubernetes中运行的应用程序列入我们已有的基础设施的白名单。
在Linode,我们运行几个内部应用程序。使用防火墙规则,这些应用程序只能被那些需要它的网络和系统所访问。
如果你有一个拥有自己的数据库的应用程序,该数据库可能只需要被该应用程序的实例访问。如果两者都在Kubernetes集群中运行,那就很简单了;NetworkPolicies让你把它锁定。另一方面,如果一个服务在集群之外运行,事情就会变得更加复杂。
我们已经有了一些围绕IP白名单的自动化,但Kubernetes集群有可能比我们基础设施中的任何其他东西都更加动态。这就是为什么我们需要确保在节点被添加到集群中或从集群中移除时,我们可以保持白名单是最新的。我们认为,对于任何将Kubernetes引入现有基础设施的人来说,这一定是一个相当普遍的问题,但我们没有发现任何其他公开的解决方案来解决这个问题。
问题所在
我的挑战是,如果我想在集群外部的服务器上对特定集群中的所有节点进行白名单,我的理想配置是什么样子的?
如果没有Kubernetes感知的工具,我将被迫逐一手动对集群节点的各个IP地址进行白名单。这不仅耗费时间,而且引入了更多的人为错误的可能性,这是开发过程中的一个主要障碍。
解决办法
在接下来的几周里,我建立了一个解决方案,(大部分)使Kubernetes集群的白名单和手动白名单单个IP一样简单。
我们使用Salt 来管理我们的基础设施,而且我们已经有了一个Salt 的公式来管理防火墙规则。在注册了Salt 的基础设施中,我们已经有机制在建立白名单时找到特定类别的系统,所以我们正在为我们的Kubernetes集群寻找类似的东西。
Salt 是非常灵活的,使编写自定义模块变得容易。例如,我们的iptables公式使用一个从Salt'的每个节点配置("支柱 "数据)生成iptables规则。我们通过从存储在支柱中的规则列表中一次建立一个规则来实现这一点。这是大量的字符串连接,诚然,这看起来有点难看。幸运的是,iptables的规则格式足够稳定,所以它最终工作得很好。下面是一个看起来像什么的片段。
![](https://www.linode.com/wp-content/uploads/2020/06/whitelisting1-post.png)
得益于 Kubernetes 灵活的 API,这种集成在概念上并不困难。从本质上讲,我们为 K8s 集群添加了一种新的规则类型:当公式遇到该类型的规则时,它会联系该集群以获取其节点的 IP,并将其缓存到本地,然后为每个 IP 插入 iptables 规则。缓存是为了确保间歇性网络故障不会造成问题。下面是使用时的效果:
![](https://www.linode.com/wp-content/uploads/2019/10/whitelisting2-post.png)
下一步是什么?
最终,我希望将整个公式开源,在Linode社区的帮助下进一步发展该工具的能力。
不过,下一步是使这些规则在新节点加入和离开集群时自动更新。我们的目标是让一个集群的持续白名单变得像白名单一个IP一样简单,但我们还没有完全达到这个目标。
按照现在的公式,只有在应用防火墙配置时,它才会接收新的节点,而不是自动接收。这并不是一个太大的问题,因为我们可以通过定期重新应用防火墙配置来解决这个问题。
然而,我想找出一种方法,使它更有反应性。我设想的机制将监听该事件(在Kubernetes中创建一个新的Node对象)并触发更新(可能通过Salt 事件总线)。理想情况下,除了配置Kubernetes防火墙规则外,这不需要任何手动步骤。也许一旦我们开源了这个公式,你可以帮助我们解决这个问题。
目前,我对我们创建的东西非常满意,并相信它将成为Linode用户试验Kubernetes的资产。
感谢你了解Linode的系统工程流程。如果您对我们的工作有任何疑问,请在评论区告诉我。
对Linode上的Kubernetes感兴趣吗?
我们的团队很自豪地介绍Linode Kubernetes Engine(LKE)的测试版--这是一个完全管理的容器协调引擎,用于部署和管理容器化应用程序和工作负载。
但我们需要你的反馈。请在这里注册LKE测试版,试一试并获得免费的Linode礼品。
评论 (3)
Where’d the RSS feed for the blog go?
JW: The RSS feed can now be found here:
https://www.linode.com/blog/feed/
Thank you 😀