Cilium:eBPF 驱动的 CNI,现代云的 NOS 解决方案
作者继续为 Otomato 讲述支持 eBPF 的工具。 NOS 代表 **Networking、**Observability 和 **Security。 有些细节好重复 好吧,您可以知道 Kubernetes 使用iptables来表示kube-proxy,该组件通过DNATiptables 规则实现服务和负载均衡,并且大多数 CNI 插件都使用iptables作为网络策略。 当存在大量流量或
作者继续为 Otomato 讲述支持 eBPF 的工具。
NOS 代表 **Networking、**Observability 和 **Security。
有些细节好重复
好吧,您可以知道 Kubernetes 使用iptables
来表示kube-proxy
,该组件通过DNAT
iptables 规则实现服务和负载均衡,并且大多数 CNI 插件都使用iptables
作为网络策略。
当存在大量流量或对系统中的iptables
规则进行了许多更改时,性能会受到影响。随着服务数量的增加,测量结果显示出意外的延迟和性能下降。
为了克服这些问题,发明了 eBPF 技术。它最终在 Linux 内核 3.18 中实现。
充分利用 eBPF 至少需要 Linux 4.4 或更高版本!
e[xtended]BPF,正如我们今天所知,由 Alexei Starovoitov 和 Daniel Borkmann 创建,他们仍然是维护者,但有一百多名贡献者加入。展望未来,重要的是要注意 Daniel 现在为 Isovalent 工作。
eBPF代表扩展伯克利数据包过滤器,是一个 Linux 内核功能,允许自动收集网络遥测数据,例如全身请求、资源和网络指标、应用程序配置文件等。
当我们需要收集、查询和处理集群中的所有遥测数据时,eBPF 机制非常有用。由于 eBPF 使内核以安全和高性能的方式可编程,因此提供细粒度的可观察性成为可能。
eBPF 不依赖于操作系统公开的仪表和静态计数器,而是允许生成可见性事件以及基于广泛的潜在来源的自定义指标的收集和内核聚合。
随着 eBPF 的出现,您可以从用户空间向内核添加逻辑,而不是更改内核代码。除了被简化之外,这种技术对于 eBPF 来说更加安全。通过实施安全检查,eBPF 验证过程可确保您加载到内核中的 eBPF 代码可以安全地执行。
[](https://res.cloudinary.com/practicaldev/image/fetch/s--4i0japwh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/o7v9d95doqwimipisqgz.png)
例如,它确保并强制执行:
-
你的程序在有限的 CPU 时间内运行(没有无限循环);
-
您的程序不会崩溃或产生有害的致命错误;
-
您的 eBPF 代码正在由具有必要权限的进程加载;
-
你的代码有大小限制;
-
不允许出现无法访问的代码。
因此,可以将其视为 Linux 内核中的轻量级、完全沙盒化的虚拟机 (VM)。 eBPF 程序是基于事件的,并在特定的钩子上执行,例如网络事件、系统调用、函数入口和内核跟踪点。
eBPF 支持的热门项目
-
Pixie, Kubernetes 应用故障排除平台
-
Cilium by Isovalent, eBPF Networking, Security and Observability for Kubernetes
-
Falco , 云原生运行时安全
-
Tracee by Aqua,运行时安全和取证
Tigera](https://www.tigera.io/tigera-products/calico-enterprise/)的* [Calico 是 Cilium 作为 CNI 的直接竞争对手。
什么是纤毛?它有什么特点?
为了满足容器工作负载的网络、安全和可见性要求,Cilium 是一个建立在 eBPF 之上的开源项目。在 eBPF 之上,它提供了高级抽象。
Kubernetes 和容器运行时对于 Linux 内核的
namespaces
、cgroups
和seccomp
而言,Cilium 对于 eBPF:它之上的适当抽象层。
[](https://res.cloudinary.com/practicaldev/image/fetch/s--8JULylAG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/gxtqau7pxoysez6v4n9f.png)
网络策略的最低权限安全范式
当您的 K8s pod 相互通信时,实施最低权限安全性是一种推荐做法。基本的K8s 网络策略(在 L3/L4 起作用)是有效的,但 Cilium 网络策略允许您改进它们(在 L3-L7 运行更广泛)。
在 K8s 和微服务时代,这可能非常有用,因为使用元数据(例如 IP 和端口)监控和调节网络流量不会增加太多价值。随着服务的到达和离开,IP 和端口总是在变化。
该方法的灵活性在于您可以通过使用 Pod、HTTP、gRPC、Kafka、DNS、和其他元数据来管理 Cilium 的流量。
例如,您可以创建HTTP 规则指定route
、header
和request
方法,让特定 Pod 进行特定 API 调用。另一个例子是创建基于FQDN
的 DNS 规则,以限制对某些域的访问。正因为如此,我们能够建立对我们的实际用例更加有益和实用的安全策略。
[](https://res.cloudinary.com/practicaldev/image/fetch/s--ky1Ps-t3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev- to-uploads.s3.amazonaws.com/uploads/articles/p6kiwewgaa8up5bktyl0.png)
使用 Cilium v1.12,您甚至可以安装一条路由通知其他端点 Pod 现在无法访问(即,当 Pod 被删除时)!
多集群连接和负载均衡
Cilium 通过使用集群网格使 K8s pod 能够跨 K8s 集群进行通信和发现。高可用性和多云是一些使用场景(跨云提供商连接 K8s 集群)。
使用 Cilium,服务现在能够理解拓扑和亲和力。这意味着您可以选择仅在本地或远程集群中优先选择后端,而不是在负载平衡后端之间进行均匀平衡。
eBPF 的kube-proxy
可以更改为 Cilium;iptables
,正在被 eBPF 取代,被kube-proxy
使用。
[](https://res.cloudinary.com/practicaldev/image/fetch/s--Hyi8Butf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/fpstlf49mb3tm08yvq12.png)
因此,此调整显着提高了性能。
Cilium 的“水下”特征
-
pod 间透明加密。支持 IPsec 和 Wireguard 协议
-
网络性能提升
-
红外可扩展性
-
增强了流量的可见性,包括 L7 协议以及 IP 和端口。
-
Cilium 提供了与 Prometheus 一起使用的微服务之间的监控和更好的网络故障可见性。
Cilium CNI 支持第 7 层 (L7) 策略。 It在此类功能上与 Istio竞争。 Cilium 的第 7 层策略很容易与它自己的Envoy和基于 proxylib 的过滤器一起使用。
可观察性很重要!
Cilium 团队还提供了Hubble(是的,这个名字和著名的远空间爬行望远镜的名字一样,但是是针对云的),这是一个针对云原生工作负载的完全分布式的网络和安全可观察性平台。 Hubble 是开源软件,构建在 Cilium 和 eBPF 之上,能够以完全透明的方式深入了解服务的通信和行为以及网络基础设施。
[](https://res.cloudinary.com/practicaldev/image/fetch/s--YGjHHK-m--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev- to-uploads.s3.amazonaws.com/uploads/articles/bqyo0yrcet4ybt96aluu.png)
只有属于 Cilium 代理网络一部分的 pod 才能对其强制执行策略。非托管 Pod 通常是在安装或运行 Cilium 之前将工作负载交付到集群的结果,这可能导致平台丢失您环境中最近生成的任何 Pod。要确定哪些 pod 不受平台管理,您可以将节点的 pod 总数与其上 Cilium 管理的 pod 数量(端点状态)进行比较。
根据 Cilium 的端点生命周期,指标的state
标签提供了有关一组端点所处阶段的更多详细信息。这使您可以跟踪 Cilium 应用和修改网络时每个 pod 的运行情况限制。例如,如果多个端点处于重新生成状态,代理可能正在刷新其网络配置。在这种情况下密切关注 pod 以确保它们收到所需的策略更新至关重要。
[](https://res.cloudinary.com/practicaldev/image/fetch/s--9ZJM3fA_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/jdw598q5j9eect90lh34.png)
没有人比 Datadog 团队更了解基于 Cilium 的监控的细微差别。插图属于他们。
Hubble 的指标与Cilium 指标相比,允许您密切关注 Cilium 管理的 Kubernetes pod 运行所在网络的连接性和安全性。
“我如何从中受益?”
好吧,作者的信念:如果对群众没用,就不需要新技术!
GCP GKE
☁️ 谷歌已经在 2021 年年中推出了所谓的 GKE Dataplane V2,这是一个利用 eBPF 和 Cilium 的强大功能的固执己见的数据平面。他们还使用 Dataplane V2 将 Kubernetes 网络策略日志记录到 Google Kubernetes Engine (GKE)。
[](https://res.cloudinary.com/practicaldev/image/fetch/s--A9jpSt7v--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/89o4xhsrsyvqu9uhabs0.png)
要亲自尝试 Kubernetes 网络策略日志记录,请使用以下命令创建具有 Dataplane V2的新 GKE 集群:
gcloud container clusters create <cluster-name> \
--enable-dataplane-v2 \
--enable-ip-alias \
--release-channel rapid \
{--region region-name | --zone zone-name}
进入全屏模式 退出全屏模式
Cilium 代理和 Cilium 网络策略的配置决定了端点是否接受来自源的流量。网络策略实施内置于 GKE Dataplane V2。您无需在使用 GKE Dataplane V2 的集群中启用网络策略实施。
[](https://res.cloudinary.com/practicaldev/image/fetch/s--Rflo4ibj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to- uploads.s3.amazonaws.com/uploads/articles/3g0iq0dbxs7klz36szpz.png)
前
☁️ 如果您在 AWS 上,请了解EKS Anywhere 使用 Cilium用于 pod 网络和安全性这一事实。
默认情况下,Kubernetes 集群中允许进行任何形式的 Pod 到 Pod 通信。尽管它可能会鼓励实验,但这种灵活性并不被视为安全。您可以使用 Kubernetes 网络策略限制 pod 之间的网络流量(通常称为东/西流量)以及 pod 和外部服务之间的网络流量。 OSI 模型的第 3 级和第 4 级是 Kubernetes 网络策略运行的地方。除了 pod 选择器和标签之外,网络策略还可以使用 IP 地址、端口号、协议号或这些的组合来识别源和目标 pod。 Tigera 的 Calico 是一个与 EKS 兼容的开源策略引擎。
与 Istio 结合使用时,Calico 可以通过更广泛的功能集实现扩展的网络策略,包括支持 HTTP 等第 7 层规则,此外还提供整套 Kubernetes 网络策略功能。 Cilium 开发人员 Isovalent 还扩展了网络策略,以提供对第 7 层规则(例如 HTTP)的有限支持。为了限制 Kubernetes 服务/Pod 和在 VPC 内部或外部运行的资源之间的通信,Cilium 还支持 DNS 主机名。
Azure AKS
☁️ 如果您在 Azure 上,您可能知道 AKS 仅正式支持两个 CNI,即 Kubenet 和 Azure CNI。 2022 年 4 月,他们宣布能够创建没有 CNI 的 AKS 集群。这意味着您可以部署任何您想要的 CNI。在这篇博文中,来自 Pixel Robots 的英国 MVP 展示了如何创建一个没有 CNI 的 AKS 集群,然后......部署 Cilium!
☁️ OpenShift:Cilium 也可以安装在传统的虚拟机或裸机服务器上。 OpenShift 平台团队能够通过允许 VM 或裸机服务器加入 Cilium 集群,对应用程序 pod 和外部节点之间的通信实施基于标签的控制。另一方面,外部节点将有权访问集群服务并能够解析集群名称。
k3s & minikube
☁️ 最终,你可以在 k3s](https://docs.cilium.io/en/stable/gettingstarted/k3s/)上使用 Cilium,甚至可以在 minikube上使用 Cilium[,就在车库里。 🚜
此外,通过使用 Cilium 的这款别致的网络策略编辑器进行良好学习,您将能够扩展实验室舞台的功能。在那里设计的清单可以下载。
[](https://res.cloudinary.com/practicaldev/image/fetch/s--fGU-GCYV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev- to-uploads.s3.amazonaws.com/uploads/articles/x51rc23iyirg1u0whpi5.png)
Instruqt® 动手实验室
您可以尝试这些交互式实验室以了解有关 Cilium 技术的更多信息。您可以在每个实验室的专业现场环境中学习和实验。
祝你好运,还有谁要读
谨慎部署
作者要感谢 Yarel Maman、Johann Rehberger、Chris Mutchler、Lin Sun、Arthur Chiao、Glen Yu 和 Richard Hooper 对社区的贡献。
P.S.:铁杆开发人员可能会在这里](http://arthurchiao.art/blog/cracking-k8s-network-policy/)和这里找到一些技术细节[,在 Golang 中使用 proxylib 进行 L7 解析。
更多推荐
所有评论(0)