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. Profile Config 多环境不同配置

    应用场景如:我们可以在开发.测试环境中,启用 Swagger,在生产环境中不启用 package com.vipsoft.web.boot.config; import springfox.docum ...

  2. Vue2--入门学习

    看了慕课网的教学视频,觉得挺不错的,在此做个随堂记录,有兴趣的可以去看视频 vue版本:2.5 文档链接:https://v2.cn.vuejs.org/v2/guide/installation.h ...

  3. Beyond Compare常用快捷键

    [会话]菜单的功能与快捷键 [文件]菜单的功能与快捷键 [编辑]菜单的功能与快捷键 [搜索]菜单的功能与快捷键

  4. 分享几个常用的运维 shell 脚本

    今天咸鱼给大家分享几个不错的 Linux 运维脚本,这些脚本中大量使用了 Linux 的文本三剑客: 1. awk 2. grep 3. sed 建议大家这三个工具都要了解并最好能够较为熟练的使用 根 ...

  5. 广州|阿里云 Serverless 技术实战营邀你来玩!

    活动简介 "Serverless 技术实战与创新沙龙 " 是一场以 Serverless 为主题的开发者活动,活动受众以关注Serverless 技术的开发者.企业决策人.云原生领 ...

  6. 【真送礼物】1 分钟 Serverless 极速部署盲盒平台,自己部署自己抽!

    当前,Serverless 在移动应用.游戏等场景已经实现规模化应用,Serverless 技术可以更好的帮助开发者只关注应用创新,减少对开发与运维的过度关注. 为了让更多开发者在真实场景中体验 Se ...

  7. uni-app 从入门到放弃(持续更新)

    https://blog.csdn.net/weixin_33940102/article/details/91460204

  8. NOIP2020游记——AFO之战

    阅读时请播放此音乐,这是我精心挑选的,很适合本文. Day-0奇遇 考试前一天,不顺,很不顺,简直可以写小说了.(不想看我车店可以往下翻,Day-1在后边) 我是下午两点从齐齐哈尔出发前往省会哈尔滨的 ...

  9. IDE暗黑主题推荐-Dracula

    作为程序员,我们一天中会花费大量时间在编码和阅读代码上.优秀的代码编辑器主题可以减轻眼睛的疲劳,提高工作效率.本文向大家推荐一款非常流行的 JetBrains IDE 主题插件 - Dracula.它 ...

  10. C++ std::initializer_list 实现原理勘误

    今天正在看侯捷<C++ 新标准 C++11-14>的视频,里面讲到 std::initializer_list 的实现原理,并且把源码贴出来. /// initializer_list t ...