在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网络排错思路

Overview 本文将引入一个思路:“在Kubernetes集群发生网络异常时如何排查”。文章将引入Kubernetes 集群中网络排查的思路,包含网络异常模型,常用工具,并且提出一些案例以供学习。 Pod常见网络异常分类 网络排查工具 Pod网络异常排查思路及流程模型 CNI网络异常排查步骤 案例学习 Pod网络异常 网络异常大概分为如下几类: 网络不可达,主要现象为ping不通,其可能原因为: 源端和目的端防火墙(iptables, selinux)限制 网络路由配置不正确 源端和目的端的系统负载过高,网络连接数满,网卡队列满 网络链路故障 端口不可达:主要现象为可以ping通,但telnet端口不通,其可能原因为: 源端和目的端防火墙限制 源端和目的端的系统负载过高,网络连接数满,网卡队列满,端口耗尽 目的端应用未正常监听导致(应用未启动,或监听为127.0.0.1等) DNS解析异常:主要现象为基础网络可以连通,访问域名报错无法解析,访问IP可以正常连通。其可能原因为 Pod的DNS配置不正确 DNS服务异常 pod与DNS服务通讯异常 大数据包丢包:主要现象为基础网络和端口均可以连通,小数据包收发无异常,大数据包丢包。可能原因为: 数据包的大小超过了 dockero,CNI 插件,或者宿主机网卡的 MTU 值。 可使用 ping -s 指定数据包大小进行测试 CNI异常:主要现象为Node可以通,但Pod无法访问集群地址,可能原因有: kube-proxy 服务异常,没有生成 iptables 策略或者 ipvs 规则导致无法访问 CIDR耗尽,无法为Node注入 PodCIDR 导致 CNI 插件异常 其他 CNI 插件问题 那么整个Pod网络异常分类可以如下图所示: 图:Pod network trouble hirarchy 总结一下,Pod最常见的网络故障有,网络不可达(ping不通);端口不可达(telnet不通);DNS解析异常(域名不通)与大数据包丢失(大包不通)。 常用网络排查工具 在了解到常见的网络异常后,在排查时就需要使用到一些网络工具才可以很有效的定位到网络故障原因,下面会介绍一些网络排查工具。 tcpdump [1] tcpdump网络嗅探器,将强大和简单结合到一个单一的命令行界面中,能够将网络中的报文抓取,输出到屏幕或者记录到文件中。 各系统下的安装 Ubuntu/Debian: tcpdump ;apt-get install -y tcpdump Centos/Fedora: tcpdump ;yum install -y tcpdump Apline:tcpdump ;apk add tcpdump --no-cache 查看指定接口上的所有通讯...

 ·  · 

详述Kubernetes网络模型

Overview 本文将深入探讨Kubernetes中的网络模型,以及对各种网络模型进行分析。 Underlay Network Model 什么是Underlay Network 底层网络 Underlay Network 顾名思义是指网络设备基础设施,如交换机,路由器, DWDM 使用网络介质将其链接成的物理网络拓扑,负责网络之间的数据包传输。 图:Underlay network topology Source:https://community.cisco.com/t5/data-center-switches/understanding-underlay-and-overlay-networks/td-p/4295870 underlay network 可以是二层,也可以是三层;二层 underlay network 的典型例子是以太网 Ethernet,三层是 underlay network 的典型例子是互联网 Internet。 而工作与二层的技术是 vlan,工作在三层的技术是由 OSPF, BGP 等协议组成 kubernetes中的underlay network 在kubernetes中,underlay network 是将宿主机作为路由器设备而,Pod 的网络则通过学习成路由条目从而实现跨节点通讯。 图:underlay network topology in kubernetes 这种模型下典型的有 flannel 的 host-gw 模式与 calico BGP 模式。 flannel host-gw [1] flannel host-gw 模式中每个Node需要在同一个二层网络中,并将Node作为一个路由器,跨节点通讯将通过路由表方式进行,这样方式下将网络模拟成一个underlay network。 图:layer2 ethernet topology Source:https://www.auvik.com/franklyit/blog/layer-3-switches-layer-2/ Notes:因为是通过路由方式,集群的cidr至少要配置16,因为这样可以保证,跨节点的Node作为一层网络,同节点的Pod作为一个网络。如果不是这种用情况,路由表处于相同的网络中,会存在网络不可达 Calico BGP [2] BGP(Border Gateway Protocol)是去中心化自治路由协议。它是通过维护IP路由表或’前缀’表来实现AS (Autonomous System)之间的可访问性,属于向量路由协议。...

 ·  ·