k8s 中的网络模型

CNI 网络插件

docker 容器的网络都是连接在 docker0 网桥上的,容器中所有的流量都由 docker0 网桥转发出去。

例如 Flannel 中 UDP 模式通过 TUN 设备,VXLAN 模式通过 VTEP 设备,来接入容器中的网络,这些设备都是连接在 docker0 网桥上面和容器中的网络进行交互的。

网络插件的作用就是把这些宿主机中的网络设备连通,从而达到网络跨主机通信的目的。

Kubernetes 中处理网络的方式和容器中的类似,不是的是 Kubernetes 中使用 CNI 网桥,替代了 docker0 网桥。

例如 Flannel 的 VXLAN 模式,在 Kubernetes 中和 docker 容器中的工作方式基本相同,只是 docker0 网桥被替换成了 CNI 网桥。

CNI 的设计思想

CNI 的设计思想:Kubernetes 在启动 Infra 容器之后,就可以直接调用 CNI 网络插件,为这个 Infra 容器的 Network Namespace,配置符合预期的网络栈。

CNI 的基础可执行文件有下面三类:

1、Main 插件,用来创建具体网络设备的二进制文件,栗如 bridge(网桥设备)、ipvlan、loopback(lo 设备)等;

2、IPAM 插件,负责分配 IP 地址的二进制文件,栗如 dhcp,这个文件会向 DHCP 服务器发起请求;host-local,则会使用预先配置的 IP 地址段来进行分配;

3、是由 CNI 社区维护的内置 CNI 插件。

要实现一个 Kubernetes 中的网络有下面两个步骤

1、实现网络方案本身。栗如:对于 Flannel ,就是要实现 flanneld 进程里的主要逻辑。创建和配置 flannel.1 设备、配置宿主机路由、配置 ARP 和 FDB 表里的信息等等;

2、实现该网络方案对应的 CNI 插件。要做的就是配置 Infra 容器里面的网络栈,并把它连接在 CNI 网桥上。

k8s 中的三层网络

这里通过 Flannel 的 host-gw 模式和 Calico 项目来了解下 k8s 中的三层网络。

Flannel 的 host-gw

host-gw 即 Host Gateway,这个模式就是将每个 Flannel 子网的下一跳,设置成了该子网对应的宿主机的 IP 地址。这样宿主机就充当了容器通信路径的"网关"作用。

Flannel 子网和主机的信息,都被保存在 etcd 中,flanneld 只需要 WACTH 这些数据的变化,然后实时更新路由表即可。

注意:在 Kubernetes v1.7 之后,类似 Flannel、Calico 的 CNI 网络插件都是可以直接连接 Kubernetes 的 APIServer 来访问 Etcd 的,无需额外部署 Etcd 给它们使用。

host-gw 模式,容器的通行过程,没有了额外的解包和封包的带来的性能损耗,对比 VXLAN 模式有更高的性能。

host-gw 模式能够工作的核心就是在于 IP 包被封装成帧发出去的时候,会使用路由表中的"下一跳"来设置目的 MAC 地址,这样就能通过二层网络到达目的宿主机。

Calico

Calico 项目提供的网络解决方案与 Flannel 的 host-gw 模式,几乎是完全一样的。

不同点:

1、Flannel 通过 Etcd 和宿主机上的 flanneld 来维护路由信息的做法,Calico 项目使用了 BGP 来自动地在整个集群中分发路由信息;

BGP 的全称是 Border Gateway Protocol,即:边界网关协议。它是一个 Linux 内核原生就支持的、专门用在大规模数据中心里维护不同的“自治系统”之间路由信息的、无中心的路由协议。

自制系统,指的是一个组织管辖下的所有 IP 网络和路由器的全体。正常情况下,这些自制系统之间是不能进行通信的。

在互联网中,一个自治系统(AS)是一个有权自主地决定在本系统中应采用各种路由协议的小型单位。这个网络单位可以是一个简单的网络也可以是一个由一个或多个普通的网络管理员来控制的网络群体,它是一个单独的可管理的网络单元(例如一所大学,一个企业或者一个公司个体)。一个自治系统有时也被称为是一个路由选择域(routing domain)。一个自治系统将会分配一个全局的唯一的16位号码,有时我们把这个号码叫做自治系统号(ASN)。

如果两个自制系统的主机需要进行 IP 通信,就需要使用路由器,把这两个自制系统连接起来。

我们把连接自制系统的路由器称为边界网关,和普通路由器之间的区别就是,它的路由表里拥有其他自治系统里的主机路由信息。

如果有网络拓扑很复杂,手动连接各个自制系统肯定是不现实的,BGP 正是用来解决这个问题的。

2、Calico 项目与 Flannel 的 host-gw 模式的另一个不同之处,就是它不会在宿主机上创建任何网桥设备。

容器发出的 IP 包会直接经过 Veth Pair 设备出现在宿主机上,宿主机会根据规则的下一跳 IP ,将 IP 包转发给正确的网关。

最核心的下一跳的规则路由,由 Calico 的 Felix 进程负责维护。Calico 项目将集群中的所有节点都当成边界路由来处理了,共同组成了一个全连通的网络,互相之间通过 BGP 协议交换路由规则。这些节点,称之为为 BGP Peer

Calico 网络使用的默认配置是 Node-to-Node Mesh 模式,每台宿主机上的 BGP Client 都需要跟其他所有节点的 BGP Client 进行通信以便交换路由信息。但是,随着节点数量 N 的增加,这些连接的数量就会以 的规模快速增长,从而给集群本身的网络带来巨大的压力。该模式一般推荐用在少于 100 个节点的集群里。

如果有更大的集群就推荐使用 Route Reflector 的模式,这种模式下,Calico 会指定一个或几个专门的节点,来负责和所有的节点建立 BGP 连接从而学习到全局的路由规则。其他的节点只需要和这几个节点进行路由交换,就能获得整个集群的路由规则了。通过这些中间代理节点从而将 BGP 连接的规模控制在 N 的数量级上。

如果对应的两个 Node 不在同一个子网内,就没有办法通过二层网络把 IP 包发送到下一跳的地址。这种情况下,就需要为 Calico 打开 IPIP 模式 。

Calico IPIP 模式中使用了 tunl0 ,一个 IP 隧道(IP tunnel)设备。

IP 包进入 IP 隧道设备之后,就会被 Linux 内核的 IPIP 驱动接管。IPIP 驱动会将这个 IP 包直接封装在一个宿主机网络的 IP 包中。

这样,原先从容器到 Node 2 的 IP 包,就被伪装成了一个从 Node 1 到 Node 2 的 IP 包。

由于宿主机之间已经使用路由器配置了三层转发,也就是设置了宿主机之间的“下一跳”。所以这个 IP 包在离开 Node 1 之后,就可以经过路由器,最终“跳”到 Node 2 上。

这时,Node 2 的网络内核栈会使用 IPIP 驱动进行解包,从而拿到原始的 IP 包。然后,原始 IP 包就会经过路由规则和 Veth Pair 设备到达目的容器内部。

参考

【深入剖析 Kubernetes】https://time.geekbang.org/column/intro/100015201?code=UhApqgxa4VLIA591OKMTemuH1%2FWyLNNiHZ2CRYYdZzY%3D

【k8s中的网络】https://boilingfrog.github.io/2023/01/02/k8s中的网络/

k8s 中的网络的更多相关文章

  1. K8s中的网络

    Kubernetes的网络通信问题: 1. 容器间通信: 即同一个Pod内多个容器间通信,通常使用loopback来实现. 2. Pod间通信: K8s要求,Pod和Pod之间通信必须使用Pod-IP ...

  2. k8s中的网络(较详细汇总)

    目录 一.网络前提条件-网络模型 二.需要解决的网络问题 1.容器和容器之间的网络 2.pod与pod之间的网络 同一台node节点上pod和pod通信 不同node节点上pod和pod通信 3.po ...

  3. 新版的K8S中的flannel.yaml文件中要注意的细节

    部署flannel作为k8s中的网络插件,yaml文件都大小同异. 但在要注意以下细节. 以前,只需要前面master判断. 现在也需要有not-ready状态了. tolerations: - ke ...

  4. K8S中如何跨namespace 访问服务?为什么ping不通ClusterIP?

    1.K8S中如何跨namespace 访问服务? 2.在Pod中为什么ping不通ClusterIP? 简述: Rancher2.0中的一个用户,在K8S环境中,创建两个namespace,对应用进行 ...

  5. 在k8s中的基本概念

    在k8s中的基本概念 一.Pod1. podk8s下最重要也最基本的概念,由一个根容器Pause和许多用户业务容器组成,是容器的载体. 2. pod的yaml定义格式及字段 apiVersion: v ...

  6. Docker & k8s 系列三:在k8s中部署单个服务实例

    本章将会讲解: pod的概念,以及如何向k8s中部署一个单体应用实例. 在上面的篇幅中,我们了解了docker,并制作.运行了docker镜像,然后将镜像发布至中央仓库了.然后又搭建了本机的k8s环境 ...

  7. 如何在K8S中优雅的使用私有镜像库 (Docker版)

    前言 在企业落地 K8S 的过程中,私有镜像库 (专用镜像库) 必不可少,特别是在 Docker Hub 开始对免费用户限流之后, 越发的体现了搭建私有镜像库的重要性. 私有镜像库不但可以加速镜像的拉 ...

  8. 【转】K8S中部署Helm

    K8S中的包管理工具 1. 客户端Helm(即Helm)  通过脚本安装:curl https://raw.githubusercontent.com/helm/helm/master/scripts ...

  9. k8s中部署springcloud

    安装和配置数据存储仓库MySQL 1.MySQL简介 2.MySQL特点 3.安装和配置MySQL 4.在MySQL数据库导入数据 5.对MySQL数据库进行授权 1.MySQL简介 MySQL 是一 ...

  10. 不使用pvc的方式在K8S中部署apisix-gateway

    不使用pvc的方式在K8S中部署apisix-gateway 简介 我的apisix使用etcd作为数据存储服务器,官方的使用pvc方式或者docker-compose的方式,对于新手不太友好,本篇是 ...

随机推荐

  1. Exception: HOUR_OF_DAY: 0 -> 1

    解决方案 将mysql链接中配置的 serverTimezone=Asia/Shanghai 改为 serverTimezone=GMT%2B8 Asia/Shanghai与GMT-8的区别 开发和运 ...

  2. Intellij idea getter setter 模板设置

    通过getter setter 模板设置 在实体类中 自动添加 @XmlTransient  按 [Alt+Insert],弹出的提示中选择 Getter and Setter Xml Entity ...

  3. 鸿蒙HarmonyOS实战-工具安装和Helloworld案例

    前言 HarmonyOS是华为自主开发的操作系统,它在2020年9月正式发布.它最初被称为鸿蒙OS,后来更名为HarmonyOS.HarmonyOS旨在提供一种可在各种设备上无缝运行的统一操作系统,包 ...

  4. MPI Maelstrom POJ - 1502 ⭐⭐ 【Dijkstra裸题】

    MPI Maelstrom POJ - 1502 实验室有很多台计算机,由于每个人计算机的性能不同,导致计算机之间发送信息的速度不同,所以花费时间不同. 消息从第一台电脑发送到第二台电脑后,这两台电脑 ...

  5. AtCoder Regular Contest 120 AB题

    比赛链接:Here A - Max Add 观察一下发现每次输出与两点有关,前缀和和当前位置最大值 int main() { cin.tie(nullptr)->sync_with_stdio( ...

  6. Java | VS Code 如何导入外部 jar 包源

    Java Extension Pack里的Project Manager for Java扩展,安装后在文档查看的下方会有"JAVA PROJECTS",在Referenced L ...

  7. 7、SpringBoot-mybatis-plus引入

    系列导航 springBoot项目打jar包 1.springboot工程新建(单模块) 2.springboot创建多模块工程 3.springboot连接数据库 4.SpringBoot连接数据库 ...

  8. 二、redis主从环境搭建

    系列导航 一.redis单例安装(linux) 二.redis主从环境搭建 三.redis集群搭建 四.redis增加密码验证 五.java操作redis 环境:centos7需要的安装包: redi ...

  9. 线段树的区间更新 hdu 1698

    ***第一次写的果断超时,所以百度了一下,知道我写的每一次都要递归最底层,这样会花费很多时间,第二次写得线段树的区间更新,因为一个条件写错了,真是让我坑到死, 这样区间相同的不必更新,省了很多时间.. ...

  10. 如何将接口的返回值中所需信息提取出来作为其他接口的入参使用(postman与jmeter的使用)

    一.背景: 偶尔会用到一个场景,两个接口之前的调用有依赖关系,将其中一个的返回参数中的部分信息取出来作为入参在第二个接口中使用,代码内是比较好实现,只要定义一个变量,用于参数传递. 如果是测试过程中使 ...