作者简介
Arthur,Stephen,Jaff,Weir,几位均来自携程云平台基础设施和网络研发团队,目前专注于网络和云原生安全相关的开发。
Cilium 是近两年最火的云原生网络方案之一。Cilium 的核心基于 eBPF,有两大亮点:基于 eBPF 的灵活、高性能网络,以及基于 eBPF 的 L3-L7 安全策略实现。
携程 2019 年开始在生产环境使用 Cilium,本文将介绍 Cilium 在携程的落地情况,以及我们基于 Cilium 的、覆盖虚拟机、物理机和容器的云原生安全的一些探索。
一、网络演进简要回顾
从 2013 年到 2018 年,我们经历了物理机到虚拟机再到容器的基础设施演进,但网络技术栈基本都是沿用 Neutron+OVS —— 即使对我们(前期)的 Kubernetes 集群也是如此。但业务开始往 Kubernetes 迁移之后,这套 Neutron+OVS 的网络方案越来越捉襟见肘,尤其是在部署密度更高、规模更大的容器面前,这种大二层网络模型的软件和硬件瓶颈暴露无遗 [1]。
为了解决这些问题,更重要的,为了满足云原生业务的各种需求(例如,支持Kubernetes 的 Service 模型),我们调研了很多较新的网络方案,综合评估之后,选择了 Cilium+BGP 的组合 [3]。
Fig 1-1. Networking solutions over the past years [2]
Cilium+BGP 方案 2019 年底正式在生产环境落地,我们打通了 Cilium 网络和现有网络,因此能灰度将容器从 Neutron 迁移到 Cilium。
二、云原生网络实践
作为 Cilium 的早期用户之一,我们对 Cilium 的实现和部署做了一些修改或定制化,以使这套方案能平滑地落地到现有的基础设施之中,例如 [2],
1)用 docker-compsoe + salt 来部署,而不是采用默认的 daemonset+configmap 方式。
这样每台 node 上的 cilium-agent 都有独立配置,我们能完全控制发布灰度,将 变更风险降到最低。
2)用 BIRD 作为 BGP agent,而不是采用默认的 kube-router。
kube-router 开箱即用,但缺少对 ECMP、BFD 等高级功能的支持,不符合我们生产环境的要求。
3)为了保证某些业务的平滑迁移,我们开发了 StatefulSet/AdvancedStatefulSet 固定 IP 的支持(需要 sticky 调度配合)。
4)定制化了监控和告警。
5)其他一些自定义配置。
我们之前的一篇文章 [2] 对此有较详细的介绍,有兴趣可以移步。下面讨论几个之前介绍较少或者没有覆盖到的主题。
2.1 BGP 建连模型
Cilium+BIRD 方案中,以宿主机为界,网络可以大致分为两部分,如图 2-1 所示。
Fig 2-1. High level topology of the Cilium+BGP solution [2]
1)宿主机内部网络:由 Cilium(及内核协议栈)负责,职责包括:
为容器创建和删除虚拟网络。
为容器生成、编译和加载 eBPF。
处理同宿主机内容器之间的网络通信。
2)跨宿主机网络:由 BGP(及内核路由模块)负责,职责包括:
与数据中心网络交换路由(PodCIDRs)。
对出宿主机的流量进行路由。
对于跨宿主机部分,需要确定要采用哪种 BGP peering 模型,这个模型解决的问题包括 :
1)BGP agent 的职责,是作为一个全功能路由控制服务,还是仅用作 BGP speaker?
2)宿主机和数据中心的哪些设备建立 BGP 邻居?
3)使用哪种 BGP