kubernetes运维---calico之ipip模式抓包分析

2023-11-18

一、calico介绍

Calico是Kubernetes生态系统中另一种流行的网络选择。虽然Flannel被公认为是最简单的选择,但Calico以其性能、灵活性而闻名。Calico的功能更为全面,不仅提供主机和pod之间的网络连接,还涉及网络安全和管理。Calico CNI插件在CNI框架内封装了Calico的功能。

Calico是一个基于BGP的纯三层的网络方案,与OpenStack、Kubernetes、AWS、GCE等云平台都能够良好地集成。Calico在每个计算节点都利用Linux Kernel实现了一个高效的虚拟路由器vRouter来负责数据转发。每个vRouter都通过BGP1协议把在本节点上运行的容器的路由信息向整个Calico网络广播,并自动设置到达其他节点的路由转发规则。Calico保证所有容器之间的数据流量都是通过IP路由的方式完成互联互通的。Calico节点组网时可以直接利用数据中心的网络结构(L2或者L3),不需要额外的NAT、隧道或者Overlay Network,没有额外的封包解包,能够节约CPU运算,提高网络效率。

此外,Calico基于iptables还提供了丰富的网络策略,实现了Kubernetes的Network Policy策略,提供容器间网络可达性限制的功能。

calico官网:https://www.projectcalico.org/

二、calico架构

calico核心组件:

  • Felix:运行在每个需要运行workload的节点上的agent进程。主要负责配置路由及 ACLs(访问控制列表) 等信息来确保 endpoint 的连通状态,保证跨主机容器的网络互通;
  • etcd:强一致性、高可用的键值存储,持久存储calico数据的存储管理系统。主要负责网络元数据一致性,确保Calico网络状态的准确性;
  • BGP Client(BIRD):读取Felix设置的内核路由状态,在数据中心分发状态。
  • BGP Route Reflector(BIRD):BGP路由反射器,在较大规模部署时使用。如果仅使用BGP Client形成mesh全网互联就会导致规模限制,因为所有BGP client节点之间两两互联,需要建立N^2个连接,拓扑也会变得复杂。因此使用reflector来负责client之间的连接,防止节点两两相连。

Calico把每个操作系统的协议栈认为是一个路由器,然后把所有的容器认为是连在这个路由器上的网络终端,在路由器之间跑标准的路由协议——BGP的协议,然后让它们自己去学习这个网络拓扑该如何转发。所以Calico方案其实是一个纯三层的方案,也就是说让每台机器的协议栈的三层去确保两个容器,跨主机容器之间的三层连通性。

三、calico的两种网络方式简述

1)IPIP

把 IP 层封装到 IP 层的一个 tunnel。它的作用其实基本上就相当于一个基于IP层的网桥!一般来说,普通的网桥是基于mac层的,根本不需 IP,而这个 ipip 则是通过两端的路由做一个 tunnel,把两个本来不通的网络通过点对点连接起来。ipip 的源代码在内核 net/ipv4/ipip.c 中可以找到。

2)BGP

边界网关协议(Border Gateway Protocol, BGP)是互联网上一个核心的去中心化自治路由协议。它通过维护IP路由表或‘前缀’表来实现自治系统(AS)之间的可达性,属于矢量路由协议。BGP不使用传统的内部网关协议(IGP)的指标,而使用基于路径、网络策略或规则集来决定路由。因此,它更适合被称为矢量性协议,而不是路由协议。

四、抓包

(1)环境准备

准备一个calico ipip模式的集群,部署两个测试用的应用pod

详细图如下,podA访问podB

podA的名称为nginx-sit-84ff75dbc9-x2rv4,ip为172.17.125.5,对应calico网卡为calif40523a0c80,所在主机节点名为k8s-node01,网卡为ens33,主机ip为192.168.0.91;

podB的名称为nginx-uat-64659d8985-tdg4l,ip为172.27.14.197,对应calico网卡为cali204e9f1206a,所在主机节点名为k8s-node02,网卡为ens33,主机ip为192.168.0.92;

 进入容器podA,发出curl包,同时在podA所在节点监听calif40523a0c80网卡

curl 172.27.14.197:80

tcpdump -i calif40523a0c80  tcp and port 80

可以看到src ip是podA ip,dst ip是podB ip

pod发出的包出现在calif40523a0c80网卡之后,匹配完kube-proxy下发的prerouting等规则后,根据dst ip即podB ip查找节点路由表确定包如何转发

如上,匹配到的规则表示 下一跳via是 192.168.0.92(podB所在节点IP),由tunl0设备处理发出,tunl0作为一种隧道设置,会在原始包的基础上加上一层ip头,其中ip头中的目的ip就是匹配的路由规则中的下一跳地址。

 节点k8s-node01的tunl0抓包

在podA内发起telnet请求,在k8s-node01节点监听tunl0

 上面显示源ip为tunl0的ip,即172.17.125.0

节点k8s-node01的ens33抓包

节点间通信用的网卡ens33上的包已经是经过tunl0封包处理之后的(加上一层ip header),所以使用tcpdump抓包时需要注意指定协议为ip而不能是tcp,因为tcpdump指定为tcp协议时根据格式ip[tcp]解析raw ip包,但是经过ipip模块封包处理之后,raw包格式变成ip[ip[tcp]],所以这个时候指定tcp协议抓包会不到,指定tcp协议相关的过滤参数也会导致抓不到包,比如指定port 80,一个参考的方式是指定协议为ip,通过配合grep来过滤包(tcpdump会把第二层ip头信息打印出来),如下:

可以看到第一层ip header中:src ip是k8s-node01 nodeIP,dst ip是k8s-node02 nodeIP

第二层ip header中:src ip是tunl0 ip,而不是podA ip,dst ip是podB ip

 当ip包被节点间已有的三层网络转发到目的节点k8s-node02时,内核会识别出该数据包是被IPIP驱动封包处理过的,驱动会进行解包,从而拿到原始ip包,再通过节点上的如下路由规则将包转发给cali204e9f1206a网卡,最终到达pod中

四、抓包分析

在nginx-sit-84ff75dbc9-x2rv4这个pod中ping nginx-uat-64659d8985-tdg4l这个pod,接着在nginx-uat-64659d8985-tdg4l这个pod所在的宿主机进行tcpdump

结束抓包后下载icmp_ping.cap到本地windows进行抓包分析

能看到该数据包一共5层,其中IP(Internet Protocol)所在的网络层有两个,分别是pod之间的网络和主机之间的网络封装。

s上面显示会把tunl0 ip作为原始ip包的src ip,原因是让目的节点回包时能够因为src ip(tunl0 ip)属于源节点的pod子网(calico也叫做ip block)而对回报也做ipip封包处理,否则如果src ip还是192.168.0.91的话,回包不经过目的节点的tunl0封包处理,最终在源节点看来就会出现混乱并被丢弃,也就是说:如果ip包在源节点经过ipip模块处理,那么需要保证回包时在目的节点也要经过ipip处理

回看最上面的calico中的natoutgoing配置,表示的是当在pod中访问其他非pod ip时,是否需要做snat,如果配置为true,calico会通过felix在节点中添加相关iptables规则来做snat

如果natoutgoing配置为false,会导致在pod中无法访问集群中的其他节点ip,原因刚好是上面的逆过程,即pod中访问其他的节点ip,如果不经过snat把src ip设置为自身节点的ip,那么在目的节点回包是因为src ip是podIP,那么就会根据路由表把包交由tunl0做封包出来,导致混乱,也就是说:如果ip包在源节点没有经过ipip模块处理,那么需要保证回包时在目的节点也不能经过ipip处理

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

kubernetes运维---calico之ipip模式抓包分析 的相关文章

随机推荐

  • #ifndef... #define与#pragma once总结

    前几天看到同一个项目中有的地方使用了 ifndef define endif 而有的地方却用了 pragma once 于是我就纠结了 这两者有神马区别呢 今天仔细查了一下 发现还是有一点点的区别 不过不大 简单记录一下 一 简介 ifnd
  • lineageos 编译出错:error: VNDK version 30 not found.

    同步源代码后开始编译 结果一开始就提示这个错误 los17 1和los19 1都正常 los18 1就不行 提取了vndk 30后又会提示新的错误 该怎么解决
  • WSL2 Ubuntu+gnome图形界面的安装血泪史(亲测有效)

    WSL2 Ubuntu gnome图形界面 写在最前面 血泪史 1 wsl2 安装 2 Ubuntu安装 3 VcXsrv安装与启动 4 gnome图形界面的配置 5 显卡驱动的升级 6 wsl2与VMware虚拟机共存 本地与WSL文件传
  • docker常用的Linux命令

    docker 帮助 docker h 查看镜像 docker images 查看容器 docker ps 进入容器 docker exec it web 容器id的前几位或容器名 bin bash 有些地方是bash 具体地方具体定 退出容
  • Cesium教程 (3) 矢量切片mvt-imagery-provider加载

    Cesium教程 3 矢量切片mvt imagery provider加载 目录 0 矢量切片 1 开源项目 2 环境 3 代码 4 进阶 5 TODO 0 矢量切片 WMTS 加载最快 图片格式 样式固定 WMS 加载数量大则慢 但可以点
  • VScode项目中文件后面的A/U/M...是什么意思?

    问题 VScode项目中文件后面的A U M 是什么意思 回答 git 添加过该文件 然后你对这个文件进行了修改 就会文件后标记M M modified 你在本地新建了这个文件 还未提交到 git 上 就会标记文件或没有被合并 你需要完成合
  • rocksd mysql_mysql rocksdb使用报告

    作者 某网盘DBA 转发已经过作者同意 如果有其他问题请及时联系 非经过允许请勿随意转发 尊重版权 感谢 背景 rocksdb是facebook基于google的leveldb二次开发的key value存储引擎 目前 facebook已将
  • cenos 6.4 安装memcached 服务端

    本文查考借鉴 yum 安装memcached 前提 阿里云 EDS 服务器 操作系统 CentOs 6 4 第一步 查询memcached 安装资源包信息 yun search memcached 该指令可以查询yum库中 所包含memca
  • Centos 安装Vsftpd

    1 安装VSFTP 1 root localhost yum y install vsftpd 2 配置vsftpd conf文件 root localhost vi etc vsftpd vsftpd conf 001 002 003 0
  • tkinter绘制组件(12)——表格

    tkinter绘制组件 12 表格 引言 构思 外观 绘制方法 布局 函数结构 绘制表头 绘制表格内容 获取高度和重绘 完整代码函数 效果 测试代码 最终效果 2021 12 12新样式 2022 1 2新样式 2022 7 3新功能 补充
  • 知识图谱实现步骤和用到的方法

    PDF 下载 https download csdn net download nrlovestudy 10938925 参考资料 1 知识图谱入门 一 知识图谱与语义技术概览 https blog csdn net pelhans art
  • 【CSS】background相关属性深入学习

    最近一次需求中对于background相关的一些属性使用较多 总结下 希望提高下次的开发效率 background属性 background color background image background position backgr
  • .NET面试题——第7篇 C#类和对象

    1 什么是类和对象以及关系 对象 一种具有状态 属性 和行为 方法 的编程实体 用于描述现实世界的某个具体事物 类 具用一系列对象共同特征和行为的通用类型 对象和类的关系 类是对象的抽象 而对象是类的具体实例 类是抽象的 不占用内存 而对象
  • go爬虫框架colly的精简讲解

    1 拉取软件包 go get github com gocolly colly 2 创建colly的收集器 colly NewCollector 可以在创建的时候进行配置 c colly NewCollector colly AllowUR
  • Java 断点调试 循环调试

    java断点调试 以eclipse为例 1 基础调试 这里都是一些基础 除了最后一个都十分常用 名称 快捷键 作用 Resume F8 运行至下一断点 Step Into F5 进入方法 Step Over F6 运行完当前语句 User
  • PCL 点云按高程渲染颜色

    目录 一 算法原理 二 代码实现 三 结果展示 四 CloudCompare 五 备注 一 算法原理 首先按照Z轴方向求取所在点云的高程极值 包括高程最大值与最小值 计算高程中值 然后选取渲染的红 绿 蓝三种颜色的值 最后 自上而下 为红绿
  • NBA的字母哥如何拿到2415万美金年薪

    前言 NBA是世界上最成功的体育联盟之一 为了制定合理的运作规范 联盟会与球员工会签署劳资协议 协议里规定了球队的工资帽 一支球队球员工资总额的上限 顶薪 球员薪水的上限 底薪 球员的最低薪水 和其他规范 2011年 经历了停摆事件 联盟和
  • 一张图理清ASP.NET Core启动流程

    1 引言 对于ASP NET Core应用程序来说 我们要记住非常重要的一点是 其本质上是一个独立的控制台应用 它并不是必需在IIS内部托管且并不需要IIS来启动运行 而这正是ASP NET Core跨平台的基石 ASP NET Core应
  • JS 数组定义及详解

    一 数组简介 1 什么是数组 数组是值的有序集合 每个值叫做元素 每个元素在数组中都有数字位置编号 也就是索引 JS中的数组是弱类型的 数组中可以含有不同类型的元素 数组元素甚至可以是对象或其他数组 例如 var arr 1 true nu
  • kubernetes运维---calico之ipip模式抓包分析

    一 calico介绍 Calico是Kubernetes生态系统中另一种流行的网络选择 虽然Flannel被公认为是最简单的选择 但Calico以其性能 灵活性而闻名 Calico的功能更为全面 不仅提供主机和pod之间的网络连接 还涉及网