深入理解Kubernetes Pod网络原理 - CNI

本文是关于深入理解Kubernetes网络原理系列第3章 深入理解Kubernetes Pod网络原理 - 网络名称空间 深入理解Kubernetes Pod网络原理 - Linux虚拟网络技术 深入理解Kubernetes Pod网络原理 - CNI 深入理解Kubernetes Pod网络原理 - 跟随 flannel 学习CNI原理 深入理解Kubernetes Pod网络原理 - 跟随 flannel + multus 剖析 Chained Plugins 深入理解Kubernetes Pod网络原理 - 从零实现一个 CNI Plugin part 1 (Shell) 深入理解Kubernetes Pod网络原理 - 从零实现一个 CNI Plugin part 2 (libcni) 深入理解Kubernetes Pod网络原理 - Kubernetes网络模型 1 深入理解Kubernetes Pod网络原理 - Kubernetes网络模型 2 深入理解Kubernetes Pod网络原理 - Pod网络排错思路 概述 这是我在 kubernetes 网络之旅中的中的第4部分,主要学习 CNI 规范(5要素,旧版本是4要素)。要深深记住这些,在后面旅程中常常被用到。 Notes 本文讲解均按照 1....

 ·  · 

在Kubernetes集群上安装 Calico cni 的注意事项

开始前的实验环境 Resources controller worker-1 worker-2 OS CentOS 7.9 CentOS 7.9 CentOS 7.9 Storage 20GB 20GB 20GB vCPU 2 2 2 RAM 4GB 4GB 4GB NIC 10.0.0.4 10.0.0.4 10.0.0.4 Kubernetes Version 1.19.10 1.19.10 1.19.10 选择匹配 Kubernetes 版本的 Calico 版本 通常情况下,查看 Calico 所支持的 Kubernetes 版本,可以通过路径 Install Calico ==> Kubernetes ==> System requirements 可以找到自己的 Kubernetes 集群所支持的 Calico 版本。 例如在实验环境中,Kubernetes 1.19 版本所支持的版本有 Calico 3.20,这个时候直接 apply 这个版本提供的资源清单即可 如何开启纯 BGP 模式 默认情况下下,Calico 使用的是 full mesh 和 IPIP, 如果想通过在部署时就修改关闭 IPIP 模式,可以通过修改资源清单中的环境变量来关闭 CALICO_IPV4POOL_IPIP: Never。...

 ·  · 

Linux网络栈

Linux 架构概述 [1] 本章节简单阐述Linux系统的结构,并讨论子系统中的模块之间以及与其他子系统之间的关系。 Linux内核本身鼓励无用,是作为一个操作系统的一部分参与的,只有为一个整体时他才是一个有用的实体,下图展示了Linux操作系统的分层 图:Linux子系统分层图 Source:https://docs.huihoo.com/linux/kernel/a1/index.html 由图可以看出Linux操作系统由四部分组成: 用户应用 OS服务,操作系统的一部分(例如shell)内核编程接口等 内核 硬件控制器,CPU、内存硬件、硬盘和NIC等都数据这部分 Linux内核阐述 Linux内核将所有硬件抽象为一致的接口,为用户进程提供了一个虚拟接口,使用户无需知道计算机上安装了哪些物理硬件即可编写进程,并且Linux支持用户进程的多任务处理,每个进程都可以视作为操作系统的唯一进程独享硬件资源。内核负责维护多个用户进程,并协调其对硬件资源的访问,使得每个进程都可以公平的访问资源,并保证进程间安全。 Linux内核主要为五个子系统组成: 进程调度器(SCHED), 控制进程对 CPU 的访问。调度程序执行策略,确保进程可以公平地访问 CPU。 内存管理器 (MM), 允许多个进程安全地共享操作系统的内存 虚拟文件系统 (VFS),向所有设备提供通用文件接口来抽象出各种硬件设备 网络接口 (NET),提供对多种网络标准与各种网络硬件的访问 进程间通信 (IPC),在单个操作系统上的多种机制进程间通信机制 网络子系统架构 [2] 网络子系统功能主要是允许 Linux 系统通过网络连接到其他系统。支持多种硬件设备,以及可以使用的多种网络协议。网络子系统抽象了这两个实现细节,以便用户进程和其他内核子系统可以访问网络,而不必知道使用什么物理设备或协议。 子系统模块包含 网络设备驱动层 (Network device drivers),网络设备驱动程序与硬件设备通信。每个硬件设备都有对应的设备驱动程序模块。 独立设备接口层(device independent interface),设备独立接口提供了所有硬件设备的统一视图,因此在网络子系统之上的级别无需了解硬件信息 网络协议层 (network protocol),网络协议实现了网络传输的协议 协议独立/无关接口层 (protocol independent interface),提供了独立于硬件设备的网络接口,为内核内其他子系统访问网络时不依赖特定的协议和硬件接口。 系统调用层 (system call) 用于限制用户进程导出资源的访问 网络子系统的结构图如下图所示, 图:网络子系统中的上下文 Source:https://docs.huihoo.com/linux/kernel/a1/index.html 当网络子系统转换为网络栈时,如下图所示 图:ISO Stack与TCP/IP Stack Source:https://www.washington.edu/R870/Networking.html 当然Linux网络子系统是类似于TCP/IP栈的一种结构,当发生一个网络传输时,数据包会按照所经过的层进行封装。例如应用层应用提供了REST API,那么应用将要传输的数据封装为HTTP协议,然后传递给向下的传输层。传输层是TCP协议就会被添加对应的TCP包头。整个封装过程原始包保持不变,会根据所经过层的不同增加固定格式的包头。 图:数据包传输在每层被封装的过程 Source:http://www.embeddedlinux.org.cn/linux_net/0596002556/understandlni-CHP-13-SECT-1.html 对于Linux来说TCP/IP 的五层结构则是构成网络子系统的的核心组件,下图是Linux网络栈结构图 图:Linux网络栈的结构图 Source:https://medium.com/geekculture/linux-networking-deep-dive-731848d791c0 图中橙色部分是位于TCP/IP的五层结构中的应用层,应用层向下通讯通过 system call 与 socket接口进行交互 蓝色部分是位于内核空间,socket向下则是传输层与网络层 最底层是物理层包含网卡驱动与NIC 通过图可以看出,NIC是发送与接收数据包的基本单位,当系统启动时内核通过驱动程序向操作系统注册网卡,当数据包到达网卡时,被放入队列中。内核通过硬中断,运行中断处理程序,为网络帧分配内核数据结构(sk_buff),并将其拷贝到缓冲区中,此为内核与网卡交互的过程。...

 ·  · 

为什么网络是分层的

Overview [1] 协议数据单元 Protocol Data Unit (PDU) 是应用于OSI模型中的数据结构,在OSI模型中每一层都会被添加一个header,tailer进行封装,header, tailer加原始报文的组合就是PDU。 在每层中,PDU的名称都是不同的,这也是很多人的疑问,一会数据报文称为数据包,一会数据报文成为数据帧,该文介绍网络中的单元,以了解之间的区别 物理层 物理层数据的呈现方式是以 “位” (bit) 为单位的,即0 1,在该层中数据以二进制形式进行传输 数据链路层 [2] 到达数据链路层,实际上可以说进入了TCP/IP栈对底层,而该层的单位为 ”帧“ (frame),该层中,MAC地址会被封装到数据包中,比如以太网帧,PPP帧都是指该层的数据包 该层中数据帧包含: 源MAC 目的MAC 数据,由网络层给出的 数据的总长度 校验序列 网络层 [3] 在网络层中协议数据单元被称为数据 “包" (package) ,是网络间节点通讯的基本单位。该层中IP地址会被封装到数据包内。 该层中数据包包含: 标头:源IP,目的IP,协议,数据包编号,帮助数据包匹配网络的位 payload:数据包的主体 标尾:包含几个位,用于告知已到达数据包的末尾与错误检查(循环冗余检查 (CRC)) 图:数据包组成 Source:https://computer.howstuffworks.com/question525.htm 例如一个电子邮件,假设电子邮件大小尾3500bit,发送时使用1024的固定大小数据包进行发送,那么每个数据包标头为 96bits,标尾为 32bit,剩余 896bits 将用于实际的数据大小。这里为3500bits,会被分为4个数据包,前三个数据包为 896bits,最后一个数据包大小为 812bits。接收端会根据包编号进行解包重组 传输层 Segment 在传输层TCP协议的协议数据单元被称为 ”段“ (Segment) ,上面讲到,IP数据包会以固定大小的数据包进行发送,如果超出大小的会被划分为多个数据包,每个数据包的碎片就被称之为Segment。 数据包分割通常会发生在该层,当发生下列场景时会需要分段 数据包大于网络支持的最大传输单元 (MTU) 网络不可靠,将数据包分为更小的包 datagram [4] 在传输层UDP协议的协议数据单元被称为 ”数据报“ (datagram) ,datagram是一种逐层增加的设计,用于无连接通讯 下图是一个UDP数据报被封装位一个IP数据包:IPv4字段值位17 表示udp协议 图:udp的IP包 Source:https://notes.shichao.io/tcpv1/ch10 对于udp数据报的组成包含header与payload,udp的header大小为固定的8字节 源端口:可选 目的端口:识别接收信息的进程 Length:udp header + udp payload的长度,最小值为8 checksum:与lenght一样其实是多余的,因为第三层包含了这两个信息 图:udp数据报组成 Source:https://notes....

 ·  · 

Kubernetes Pod网络排错思路

本文是关于深入理解Kubernetes网络原理系列第4章 深入理解Kubernetes Pod网络原理 - 网络名称空间 深入理解Kubernetes Pod网络原理 - Linux虚拟网络技术 深入理解Kubernetes Pod网络原理 - CNI 深入理解Kubernetes Pod网络原理 - 跟随 flannel 学习CNI原理 深入理解Kubernetes Pod网络原理 - 跟随 flannel + multus 剖析 Chained Plugins 深入理解Kubernetes Pod网络原理 - 从零实现一个 CNI Plugin part 1 (Shell) 深入理解Kubernetes Pod网络原理 - 从零实现一个 CNI Plugin part 2 (libcni) 深入理解Kubernetes Pod网络原理 - Kubernetes网络模型 1 深入理解Kubernetes Pod网络原理 - Kubernetes网络模型 2 深入理解Kubernetes Pod网络原理 - Pod网络排错思路 Overview 本文将引入一个思路:“在Kubernetes集群发生网络异常时如何排查”。文章将引入Kubernetes 集群中网络排查的思路,包含网络异常模型,常用工具,并且提出一些案例以供学习。 Pod常见网络异常分类 网络排查工具 Pod网络异常排查思路及流程模型 CNI网络异常排查步骤 案例学习 Pod网络异常 网络异常大概分为如下几类:...

 ·  ·