开启 Calico eBPF 数据平面实践
简介
Calico 从 v3.13 开始,集成了 eBPF 数据平面。
关于什么是 eBPF, 以及 Calico 为什么引入了 eBPF , 并不是本篇文章的重点,感兴趣的朋友可以自行阅读相关文档。
相比于 Calico 的默认基于 iptables 数据平面,eBPF 具有更高的吞吐量以外, 还具有 source IP preservation 这个功能。
在 K8s 中通常都是直接或者间接以 NodePort 方式对外暴露接口的。而对于 K8s 这个分布式集群来讲,通常情况下,客户端连接 Node Port 端口的节点和负责响应请求的后端业务 Pod 所在的节点不是同一个节点,为了打通整个数据链路,就不可避免的引入了 SNAT。但是这样显然也会带来一个副作用,即业务 Pod 在收到 Packet 以后,其 SRC IP 已经不再是客户端的实际 IP(被伪装成节点的内网 IP )。另一方面,对于一些业务应用来讲,获取客户端 IP 是一个实实在在的刚需。比如:业务应用需要通过客户端 IP 来获取客户登陆的 geo 信息。
目前 K8s 主要是通过设置 externaltrafficpolicy 来规避这个问题的,但是这个方案本身并不能完全令人满意。Calico 从 v3.13 开始通过集成 eBPF 优雅地解决了这个问题。
在本篇文章中,我们将首先演示通过 KubeKey 创建一个标准的 K8s 集群,并切换数据平面到 eBPF,最后基于该数据平面做一个简单的演示。
前提条件
较新的内核, 一般 v4.18+ 即可。
笔者的测试集群:

部署 K8s 集群
Kubekey 默认的 CNI 插件为 Calico(ipip模式)。这里为了部署方便,直接使用 KubeKey 部署了一个全新的 K8s 集群,版本为 v1.18.6 。KubeKey 的详细用法参见文档。
切换 Calico 数据平面
Calico 支持多种数据平面,通过修改配置可以方便地进行切换,详细信息可以参见官方文档。
主要分为以下几步:
- 确认 BPF 文件系统已经挂载:
mount | grep "/sys/fs/bpf"
如果能看到以下信息,则代表 BPF 文件系统已经挂载:

- 创建 Calico 配置文件:
- 首先获取 ks-apiserver endpoints 信息:
kubectl get endpoints kubernetes -o wide
- 由于 KubeKey 是通过 manifest 方式安装的 Calico,这里我们只需要创建一个 cm 即可:
kind: ConfigMap
apiVersion: v1
metadata:
name: kubernetes-services-endpoint
namespace: kube-system
data:
KUBERNETES_SERVICE_HOST: "<API server host>"
KUBERNETES_SERVICE_PORT: "<API server port>"
- 重启 Calico pods,并等待 Calico Pod 重新变为 Running 状态
kubectl delete pod -n kube-system -l k8s-app=calico-node
kubectl delete pod -n kube-system -l k8s-app=calico-kube-controllers
- 关闭 kube-proxy
kubectl patch ds -n kube-system kube-proxy -p '{"spec":{"template":{"spec":{"nodeSelector":{"non-calico": "true"}}}}}'
- 开启 eBPF 模式
calicoctl patch felixconfiguration default --patch='{"spec": {"bpfEnabled": true}}'
- 由于我们需要保留客户端 IP,所以需要开启
DSR模式。
calicoctl patch felixconfiguration default --patch='{"spec": {"bpfExternalServiceMode": "DSR"}}'
至此,Calico 的整个网络环境已经配置完毕。

体验
为了验证 Calico 切换到 eBPF 数据平面以后,后端确实可以拿到客户端的真实 IP ,下面我们会在集群中部署一个 Nginx 服务,并通过 nodeport 方式暴露接口。
创建 Nginx 实例并暴露外部接口:
master:~$ kubectl apply -f - <<EOF
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
selector:
matchLabels:
app: nginx
replicas: 1
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
type: NodePort
selector:
app: nginx
ports:
- protocol: TCP
port: 80
nodePort: 30604
EOF
等待 Pod 变为 Running 状态:

外部调用 Nginx 服务:
curl http://<external-ip>:30604
查询 Nginx 日志,查看 client IP:

注意:如果集群本身部署在云平台环境中,如果节点位于 VPC 网络当中,需要设置相应的端口转发规则,并开启相应的防火墙端口。
本文由博客一文多发平台 OpenWrite 发布!
开启 Calico eBPF 数据平面实践的更多相关文章
- 实验8:数据平面可编程实践——P4
一.实验目的 掌握V1Model框架下P4_16的程序结构和基本语法 能够运用 P4 进行简单数据平面编程 二.实验报告 在修改basic_tunnel.p4的内容之后输入make run 验证创建结 ...
- 洪强宁:宜信PaaS平台基于Calico的容器网络实践
洪强宁:宜信PaaS平台基于Calico的容器网络实践 本文内容来自由七牛云主办的ECUG Con,独家授权InfoQ整理完成 容器云面临的网络挑战 在传统的IDC的架构里面网络是很重要的事情,在 ...
- 解析与动作联动得SDN数据平面
一种解析与执行联动的SDN可编程数据平面 现有问题和目标 在传统协议处理方式中,各层的协议类型和组合方式固定,使得添加或修改协议很困难(因为需要修改网络设备的解析模式) 基于解析和执行联动结构的可编程 ...
- Service Mesh 数据平面 SOFAMosn
https://mp.weixin.qq.com/s/DJ_IeDswGGFQiWqJ75pmig 开源 | Service Mesh 数据平面 SOFAMosn 深层揭秘 朵晓东 蚂蚁金服科技 20 ...
- 数据平面可编程与SDN关系理解,以及数据平面可编程的理解
数据平面可编程与SDN关系 狭义 广义 数据平面可编程的理解 狭义 广义
- 利用Kettle进行SQLServer与Oracle之间的数据迁移实践
Kettle简介 Kettle(网地址为http://kettle.pentaho.org/)是一款国外开源的ETL工具,纯java编写,可以在Windows.Linux.Unix上运行,数据抽取高效 ...
- 用P4对数据平面进行编程
引言 SDN架构强调了对控制平面的可编程,数据平面只负责转发,导致数据平面很大程度上受制于功能固定的包处理硬件. P4语言的特性: 目标无关性:P4语言不受制于具体设备,所有可编程芯片都可以使用P4编 ...
- 阅读 用P4对数据平面进行编程
引言 关于题目,对数据平面进行编程,在之前读过the road to SDN,软件定义网络的思想在于数控分离,其对网络行为的编程暂时只局限于网络控制平面.其转发平面在很大程度上受制于功能固定的包处理硬 ...
- P4简介:数据平面的编程语言
15-05-29 http://p4.org/join-us/ 由两位SDN大师----来自普林斯顿的Jennifer Rexford和斯坦福的Nick McKeown---- 共同 ...
- 可编程数据平面将OpenFlow扩展至电信级应用(一)
可编程数据平面将OpenFlow扩展至电信级应用(一) 案例:基于WinPath网络处理器的电信极OpenFlow (CG-OF)client实现 作者:Liviu Pinchas, Tao Lang ...
随机推荐
- 使用AI技术(单张图片或文字)生产3D模型 —— Ai生成3D模型的时代来了
地址: https://www.bilibili.com/video/BV1A2421P7pH/ 视频用到的工具voxcraft体验地址:https://voxcraft.ai/
- 什么是3D扫描技术?
相关: https://www.bilibili.com/video/BV1fN4y1z7uD/?vd_source=f1d0f27367a99104c397918f0cf362b7 接触式:就是使用 ...
- 用户案例 | Apache DolphinScheduler 离线调度在自如多业务场景下的应用与实践
用户案例 | 自如 随着自如业务的快速发展,不断增长的调度任务和历史逾万的存量任务对平台稳定性提出了更高的要求.同时,众多非专业开发人员也需要一种更为"亲民"的调度平台使用体验. ...
- 记一次 .NET某环境监测系统 崩溃分析
一:背景 1. 讲故事 前些天有位朋友找到我,说他们的程序崩溃了,也自己分析了下初步结果,让我帮忙再确认下,既然让我确认,那就开始dump分析之旅吧. 二:WinDbg 分析 1. 为什么会崩溃 wi ...
- C#二叉搜索树算法
二叉搜索树算法实现原理 二叉搜索树(Binary Search Tree,简称BST)是一种节点有序排列的二叉树数据结构.它具有以下性质: 每个节点最多有两个子节点. 对于每个节点,其左子树的所有节点 ...
- UVA11367 Full Tank?
优先队列bfs 1 #include<cmath> 2 #include<queue> 3 #include<cstdio> 4 #include<strin ...
- 【工程应用十一】基于PatchMatch算法的图像修复研究(inpaint)。
这个东西是个非常古老的算法了,大概是2008年的东西,参考资料也有很多,不过基本上都是重复的.最近受一个朋友的需求,前后大概用了二十多天时间去研究,也有所成果,在这里简单的予以记录. 图像修 ...
- Docker Windows 下的绑定挂载
在 Windows 环境下进行绑定挂载时,需要注意路径的写法,需要使用 Windows 风格 (C:\xxx\xxx) 的路径,而不是 Cygwin (/c/xxx/xxx) 风格的路径.这一点在使用 ...
- AI驱动的PlantUML:快速生成专业级UML类图和用例图
承接前文关于如何运用 AI 工具生成时序图的内容[1],今天我们继续探讨 AI 驱动的 PlantUML:高效创建专业的 UML 类图与用例图. [1]: https://juejin.cn/post ...
- 游戏AI LOD交易员(附项目)
游戏AI的LOD控制 这次我们来一同看看AI LOD的一个另类控制技术,如果你对AI LOD一无所知也没关系,本文会为你们做个科普.但请注意,本文着重讨论其思想, 没有讲代码细节(因为很多涉及数学,有 ...