k8s集群中网络实现通信原理

1)安装Docker时,创建一个名为 docke0 的虚拟网桥,虚拟网桥使用”10.0.0.0 -10.255.255.255 “、”172.16.0.0-172.31.255.255″和”192.168.0.0——192.168.255.255″这三个私有网络的地址范围。

通过 ifconfig 命令可以查看 docker0 网桥的信息:

7个步骤,教你搞懂 K8S 网络之 Flannel 工作原理

通过 docker network inspect bridge 可以查看网桥的子网网络范围和网关:

7个步骤,教你搞懂 K8S 网络之 Flannel 工作原理

2)运行容器时,在宿主机上创建虚拟网卡 veth pair 设备,veth pair 设备是成对出现的,从而组成一个数据通道,数据从一个设备进入,就会从另一个设备出来。

将veth pair设备的一端放在新创建的容器中,命名为eth0;另一端放在宿主机的docker0中,以veth为前缀的名字命名。通过 brctl show 命令查看放在docker0中的veth pair设备。

7个步骤,教你搞懂 K8S 网络之 Flannel 工作原理

1.2 外部访问

bridge 的 docker0 是虚拟出来的网桥,因此无法被外部的网络访问。因此需要在运行容器时通过 -p 和 -P 参数对将容器的端口映射到宿主机的端口。实际上 Docker 是采用 NAT的方式,将容器内部的服务监听端口与宿主机的某一个端口 port 进行绑定,使得宿主机外部可以将网络报文发送至容器。

1)通过-P参数,将容器的端口映射到宿主机的随机端口:

$ docker run -P {images}
2)通过-p参数,将容器的端口映射到宿主机的制定端口:

$ docker run -p {hostPort}:{containerPort} {images}
二、Kubernetes 网络模式
Kubernetes与Docker网络有些不同。Kubernetes网络需要解决下面的4个问题:

集群内:

容器与容器之间的通信
Pod和Pod之间的通信
Pod和服务之间的通信
集群外:

外部应用与服务之间的通信
因此,Kubernetes假设Pod之间能够进行通讯,这些Pod可能部署在不同的宿主机上。每一个Pod都拥有自己的IP地址,因此能够将Pod看作为物理主机或者虚拟机,从而能实现端口设置、命名、服务发现、负载均衡、应用配置和迁移。为了满足上述需求,则需要通过集群网络来实现。

在本文主要分析容器与容器之间,以及Pod和Pod之间的通信;Pod和服务之间,以及外部应用与服务之间的通信请参考《Kubernetes-核心资源之Service》和《Kubernetes-核心资源之Ingress》。

2.1 同一个 Pod 中容器之间的通信

这种场景对于Kubernetes来说没有任何问题,根据Kubernetes的架构设计。Kubernetes 创建 Pod 时,首先会创建一个 pause 容器,为 Pod 指派一个唯一的IP地址。然后,以pause的网络命名空间为基础,创建同一个Pod内的其它容器(–net=container:xxx)。

因此,同一个Pod内的所有容器就会共享同一个网络命名空间,在同一个Pod之间的容器可以直接使用localhost进行通信。

2.2 不同 Pod 中容器之间的通信

对于此场景,情况现对比较复杂一些,这就需要解决 Pod 间的通信问题。在Kubernetes 通过 flannel、calic 等网络插件解决 Pod 间的通信问题。本文以 flannel 为例说明在 Kubernetes 中网络模型,flannel 是 kubernetes 默认提供网络插件。Flannel 是由 CoreOS 团队开发社交的网络工具,CoreOS 团队采用 L3 Overlay 模式设计 flannel, 规定宿主机下各个Pod属于同一个子网,不同宿主机下的Pod属于不同的子网。

flannel会在每一个宿主机上运行名为flanneld代理,其负责为宿主机预先分配一个子网,并为Pod分配IP地址。Flannel使用Kubernetes或etcd来存储网络配置、分配的子网和主机公共IP等信息。数据包则通过VXLAN、UDP或host-gw这些类型的后端机制进行转发。

7个步骤,教你搞懂 K8S 网络之 Flannel 工作原理

2.3 Flannel 在 K8S 中运行的整体过程

1)设置集群网络

flannel默认使用etcd作为配置和协调中心,首先使用etcd设置集群的整体网络。通过如下的命令能够查询网络配置信息:

$ etcdctl ls /coreos.com/network/config
2)设置 Node 节点上的子网

基于在 etcd 中设置的网络,flannel 为每一个 Node 分配 IP 子网。

获取子网列表

$ etcdctl ls /coreos.com/network/subnets
获取子网信息

$ etcdctl ls /coreos.com/network/subnets/{IP网段}
3)在每个 Node 上启动 flanneld

flannel 在每个 Node 上启动了一个 flanneld 的服务,在flanneld启动后,将从etcd中读取配置信息,并请求获取子网的租约。

所有 Node 上的 flanneld 都依赖 etcd cluster 来做集中配置服务,etcd 保证了所有node 上 flanned 所看到的配置是一致的。同时每个 node 上的 flanned 监听etcd上的数据变化,实时感知集群中node的变化。flanneld一旦获取子网租约、配置后端后,会将一些信息写入/run/flannel/subnet.env文件。

$ cat /var/run/flannel/subnet.env
7个步骤,教你搞懂 K8S 网络之 Flannel 工作原理

4)创建虚拟网卡

在Node节点上,会创建一个名为flannel.1的虚拟网卡。

$ ip addr show flannel.1
7个步骤,教你搞懂 K8S 网络之 Flannel 工作原理

5)创建Docker网桥

并为容器配置名为docker0的网桥,实际是通过修改Docker的启动参数–bip来实现的。通过这种方式,为每个节点的Docker0网桥设置在整个集群范围内唯一的网段,从保证创建出来的Pod的IP地址是唯一。

$ ip addr show docker0
7个步骤,教你搞懂 K8S 网络之 Flannel 工作原理

6)修改路由表

flannel会对路由表进行修改,从而能够实现容器跨主机的通信。

$ route -n
7个步骤,教你搞懂 K8S 网络之 Flannel 工作原理

2.4 数据传递过程

在源容器宿主机中的数据传递过程:

1)源容器向目标容器发送数据,数据首先发送给 docker0 网桥

在源容器内容查看路由信息:

$ kubectl exec -it -p {Podid} -c {ContainerId} — ip route
2)docker0 网桥接受到数据后,将其转交给 flannel.1 虚拟网卡处理

docker0 收到数据包后,docker0的内核栈处理程序会读取这个数据包的目标地址,根据目标地址将数据包发送给下一个路由节点:

查看源容器所在Node的路由信息:

$ ip route
3)flannel.1 接受到数据后,对数据进行封装,并发给宿主机的 eth0

flannel.1收到数据后,flannelid会将数据包封装成二层以太包。

Ethernet Header的信息:

From:{源容器flannel.1虚拟网卡的MAC地址}
To:{目录容器flannel.1虚拟网卡的MAC地址}
4)对在flannel路由节点封装后的数据,进行再封装后,转发给目标容器 Node 的 eth0

由于目前的数据包只是vxlan tunnel上的数据包,因此还不能在物理网络上进行传输。因此,需要将上述数据包再次进行封装,才能源容器节点传输到目标容器节点,这项工作在由linux内核来完成。

Ethernet Header 的信息:

From: {源容器 Node 节点网卡的 MAC 地址}
To: {目录容器 Node 节点网卡的 MAC 地址}
IP Header的信息:

From:{源容器Node节点网卡的IP地址}
To:{目录容器Node节点网卡的IP地址}
通过此次封装,就可以通过物理网络发送数据包。

在目标容器宿主机中的数据传递过程:

5)目标容器宿主机的eth0接收到数据后,对数据包进行拆封,并转发给flannel.1虚拟网卡;

6)flannel.1 虚拟网卡接受到数据,将数据发送给docker0网桥;

7)最后,数据到达目标容器,完成容器之间的数据通信。

Original: https://www.cnblogs.com/zbzSH/p/15650898.html
Author: zbzSH
Title: k8s集群中网络实现通信原理

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/611652/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 操作系统实现-简单热身

    博客网址:www.shicoder.top微信:18223081347欢迎加群聊天 :452380935 这次对上次的boot.asm进行代码讲解,也可以对汇编的相关理论进行补充 …

    Linux 2023年6月13日
    079
  • 渗透测试常用方法总结

    转载自 https://blog.csdn.net/qq_42636435/article/details/92839738 Original: https://www.cnblo…

    Linux 2023年6月7日
    070
  • Python:给定一个不超过5位的正整数,判断有几位

    方法一:作比较 方法二:使用整除实现,除完后如果是个0或不是个0,这种方法引入了计算,效率会降低,所以能加就不要减,能乘就不要除,能不计算就不计算 方法三: 方法四:字符串处理实现…

    Linux 2023年6月7日
    090
  • Android APP升级时解析程序包时出现问题

    一个新的测试机在自动下载升级安装更新版本APP时,报出”解析程序包时出现问题”错误。原因众说纷纭, 一番搜索,下面的回答比较全面: 简单总结: 安卓7以下一…

    Linux 2023年6月13日
    087
  • Linux的文件结构和基本分类

    (注:此笔记默认操作系统为centOS7) Windows下的文件都是以盘符开头的,Linux中没有盘符,所有文件都在根目录下。 cd /进入根目录 ls /显示根目录下的文件查看…

    Linux 2023年6月7日
    088
  • Centos7(非LVM)扩容根目录

    Centos7(非LVM)扩容根目录 系统安装在了VM上,so首先对虚拟机进行扩容: 1、进入VM,选择”虚拟机——>设置” 2、选择硬盘,看到扩展为…

    Linux 2023年6月8日
    0143
  • JAVA设计模式-单例模式

    JAVA设计模式-单例模式 单例模式 类只能有一个实例,在内存中会创建并且只创建一次对象。所有其他类或者其他需要调用的地方都是用这一个对象,可以防止频繁创建对象,内存占用高。特点:…

    Linux 2023年6月6日
    096
  • WPF 界面打不开提示 System.ArithmeticException Overflow or underflow in the arithmetic operation 异常

    本文告诉大家如何解决界面打不开,抛出 System.ArithmeticException: Overflow or underflow in the arithmetic ope…

    Linux 2023年6月6日
    082
  • 04-MySQL锁

    数据库锁 1、SQL语言包括那几个部分 SQL语言包括 数据定义(DDL)、数据操纵(DML)、数据控制(DCL)和数据查询(DQL)四个部分 2、每部分都有哪些操作关键词 数据定…

    Linux 2023年6月7日
    0139
  • 读书笔记:CSAPP 11章 网络编程

    深入理解计算机系统 第11章 本章代码:Index of /afs/cs/academic/class/15213-f15/www/code/22-netprog2其中包含本章课本…

    Linux 2023年6月13日
    098
  • Linux同时输出到管道和标准输出

    想使用Shell脚本对某文本文件中无序的一列数字排序并输出求和结果,文本如下所示: 421350 开头的命令只能输出求和结果,不能同时输出排序结果: [En] The comman…

    Linux 2023年5月27日
    077
  • MybatisPlus核心功能——实现CRUD增删改查操作 (包含条件构造器)

    CRUD 官方文档:https://baomidou.com/(建议多看看官方文档,每种功能里面都有讲解)【本文章使用的mybatisplus版本为3.5.2】 条件构造器 一般都…

    Linux 2023年6月7日
    0115
  • /dev/random 和 /dev/urandom 的原理

    /dev/random 和 /dev/urandom 是 Linux 上的字符设备文件,它们是随机数生成器,为系统提供随机数 随机数的重要性 随机数在计算中很重要。 TCP/IP …

    Linux 2023年6月13日
    081
  • Docker镜像构建之docker commit

    我们可以通过公共仓库拉取形象,但有时公共仓库拉取的形象不符合我们的需求。虽然我们已经从繁琐的部署工作中解脱出来,但在实际开发中,我们可能希望镜像包含整个项目的完整环境,将打包的完整…

    Linux 2023年5月27日
    088
  • 子网掩码、前缀长度、IP地址数的换算

    子网掩码、前缀长度、IP地址数的换算 子网掩码 子网掩码只有一个功能,就是将IP地址划分为网络地址和主机地址两部分。 如同现实生活中的通讯地址,可以看作省市部分和具体门牌号部分。相…

    Linux 2023年6月6日
    0243
  • 常用命-sar

    作者:Outsrkem原文链接:https://www.cnblogs.com/outsrkem/p/14725402.html本文版权归作者所有,欢迎转载,但未经作者同意必须保留…

    Linux 2023年6月6日
    077
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球