OpenvSwitch实现kubernetes依赖的底层网络

kubernetes网络模型设计的一个基础原则是:每个Pod都拥有一个独立的IP地址,而且假定所有Pod都在一个可以直接连通的、扁平的网络空间中(在GCE里面是现成的网络模型)。在kubernetes中,IP是以Pod为单位进行分配的。一个Pod内部的所有容器共享一个网络堆栈(实际上就是一个网络命名空间,包括它们的IP地址、网络设备、配置等都是共享的)。按照这个网络原则抽象出来的一个Pod一个IP的设计模型也被称作IP-per-Pod模型。在我们搭建k8s集群的过程中,需要自己实现这个网络假设,将不同节点上的Docker容器之间的互相访问先打通,然后运行k8s。目前有许多开源组件支持容器网络模型,比如说Flannel、OpenvSwitch和Calico等。在本文中,我们利用OVS作为实现底层网络(如下图所示),仅实现了不同节点之间的docker0网桥之间的互通,没有搭建基于OVS的完整kubernetes集群。

 

OpenvSwitch是一个开源的虚拟交换机软件,OVS的网桥可以直接建立多种通信通道(隧道)如VxLAN,GRE,在k8s、Docker场景下,我们主要是建立L3到L3的隧道。在这里,我们采取VxLAN隧道的方式实现。

实验拓扑如图所示,在VMware上运行3台ubuntu16.04虚拟机。

当容器内的应用访问另一个容器的地址时,数据包会通过容器内的默认路由发送给docker0网桥。OVS的网桥是作为docker0网桥的端口存在的,它会将数据发送给OVS网桥。OVS网络已经通过配置建立了和其他OVS网桥的GRE/VxLAN隧道,自然能将数据送达对端的Node,并送往docker0及Pod。接下来进行实际操作。

1.安装Docker

sudo apt-get install docker.io

2.安装OpenvSwitch

sudo apt-get install openvswitch-switch

3.为docker0网桥重新分配IP

为了避免Docker创建的docker0地址产生冲突(因为Docker Daemon启动且给docker0选择子网时只有几个备选列表,很容易产生冲突,我这里装完docker,docker0网桥的地址都是172.17.0.1/16),所以我们要给docker0网桥重新分配IP地址,网上有很多种解决方案,众说纷纭,我这里按照下面的步骤进行。首先,停止docker服务,然后将docker0网桥删除,手动建立一个Linux网桥,然后手动给这个网桥配置IP地址范围。

sudo service docker stop
sudo ip link set dev docker0 down
sudo brctl delbr docker0
sudo brctl addbr docker0
sudo ip addr add 172.17.30.1/24 dev docker0
sudo ip link set dev docker0 up

查看IP地址信息:

我这里配置是,master节点的docker0 IP地址为172.17.20.1,node1节点docker0 IP地址为172.17.10.1,node2节点docker0 IP地址为172.17.30.1。

4 .创建网桥和Vxlan隧道

建立OpenvSwitch的网桥br0,然后通过ovs-vsctl命令给ovs网桥增加VxLAN端口,添加端口时要将目标连接的NodeIP地址设置为对端的IP地址。(对于大型集群网络,需要做自动化脚本来完成)

(1) 创建ovs网桥br0

分别在master,node1,node2节点上执行如下命令:

sudo ovs-vsctl add-br br0

(2) 创建Vxlan隧道连接到对端

首先建立master节点到node2节点之间的隧道:

在master节点执行:

sudo ovs-vsctl add-port br0 vxlan1 -- set interface vxlan1 type=vxlan option:remote_ip=10.0.0.76

其中10.0.0.76是node2的ens33网卡地址。

在node2上执行:

sudo ovs-vsctl add-port br0 vxlan1 -- set interface vxlan1 type=vxlan option:remote_ip=10.0.0.70

其中10.0.0.70是master的ens33网卡地址。

执行ovs-vsctl show可看到如下结果:

同理,建立master到node1之间的隧道,

在master上执行:

sudo ovs-vsctl add-port br0 vxlan2 -- set interface vxlan2 type=vxlan option:remote_ip=10.0.0.71

其中10.0.0.71是node1的地址,这里注意使用另外一个端口vxlan2来作为隧道的端口。

在node1上执行:

sudo ovs-vsctl add-port br0 vxlan2 -- set interface vxlan2 type=vxlan option:remote_ip=10.0.0.70

其中,10.0.0.70是master的IP地址。

执行ovs-vsctl可以看到:

master节点上的br0有两个端口用来做隧道,vxlan1和vxlan2。对于node1和node2之间则不需要再建立额外的隧道了,后面可以看到二者之间的docker0网桥能够相互ping通。

5.添加br0到本地docker0

sudo brctl addif docker0 br0

这个操作就相当于把两个交换机给连上了,使得容器流量通过OVS流经tunnel。

6. 启动br0与docker0网桥

sudo ip link set dev br0 upsudo ip link set dev docker0 up

7. 添加路由规则

由于10.0.0.70与10.0.0.71以及10.0.0.76的docker0网段分别为172.17.20.1/24、172.17.10.1/24和172.17.30.1/24,这几个网段的路由都需经过本机的docker0网桥路由,其中一个24网段是通过OVS的VxLAN隧道到达对端的,因此需要在每个node上添加通过docker0网桥转发172.17.0.0/16段的路由规则:

sudo ip route add 172.17.0.0/16 dev docker0

8.清空Docker自带的iptables规则以及Linux规则

#iptables –t nat –F; iptables –F

9.各节点上docker0之间的互通测试

master节点ping node1

 

 

master ping node2

 

node1 ping master和node2

 

node2 ping master和node1 :

 

10.wireshark抓包

监听br0网桥,在br0网桥上并没有VxLAN报文

在ens33上抓包,发现了VxLAN封装的ping包报文通过,说明VxLAN是在承载网的物理网络上完成的封包过程。

至此,基于OVS的网络搭建成功。kubernetes还有许多优秀的开源网络组件,大家各有优势和缺点,有时间做一个汇总。

 

 

参考资料:

 《kubernetes权威指南》

 

转载于:https://www.cnblogs.com/neutronman/p/8124757.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/467023.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

该不该放弃嵌入式,单片机这条路?

知乎提问:本人,一个毕业工作两年在深圳工作的菜鸟单片机工程师。说说这两年来自己的一些看法。个人语言表述能力较差,加之经验不足,望见谅。1.程序编写1.1对架构能力要求较高。比如做一个自动售卖咖啡机,在开始写之前要…

6月份Asp.net源码推荐

整理了一下51aspx上6月份的Asp.net源码,特推荐一些给大家免费下载- 阿江酷站统计系统ASP.Net修正版Hits:262 2007-6-29阿江酷站单用户访问统计系统ASP.Net修正版 通过在要统计的页面潜入js脚本就可以对访问进行详细统计,可以按小时、日、月、年进行柱状图…

在家工作多年再回深圳找工作,会不会丢脸?

jiy发哥好。职场难题,江湖救急,请教你: 我刚毕业曾在深圳待过,那时候真是菜得什么都不会,折腾来折腾去一直没找到合适的坑,所以混了一两年又回老家小城市了。 小城市待遇普通,工作机会不多&…

数独

数独 时间限制:1000 ms | 内存限制:65535 KB难度:4描述数独是一种运用纸、笔进行演算的逻辑游戏。玩家需要根据99盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个3*3宫内的数字均含1-9&…

Linux内存寻址方式

为什么要内存管理:早期的程序都是直接运行在物理地址上,也就是说这个程序所需要的空间不超过该机器的物理内存就不会有问题,但实际场景中都是多任务,多进程的,这种物理地址reserved给各个进程是不靠谱的。举个栗子&…

DotNetNuke 框架总揽

我总觉的学一样东东,最好是先在总体上对他有一个认识,而后才能更好的学习,最近刚好有机会学习DotNetNuke这个东西,就把所学到的都写下来,与大家一起分享,有不对的地方,大家一起讨论,…

超全!嵌入式必懂的CAN总线一文讲通了

嵌入式的工程师一般都知道CAN总线广泛应用到汽车中,其实船舰电子设备通信也广泛使用CAN,随着国家对海防的越来越重视,对CAN的需求也会越来越大。这个暑假,通过参加苏州社会实践,去某船舶电气公司实习几周,也…

Gentle中的数据表实体类相关自定义属性的设置和获得

1.自定义 表名属性 TableNameAttribute2.自定义 主键属性 PrimaryKeyAttribute3.自定义 列名属性 TableColumnAttribute 4.数据表person对应的实体类person.cs5.获得person.cs类型实体 对应的表名及字段名 下面的属性代码文件 都直接建立在App_Code下 以方便使用 1.自定义 表名…

WebSocket介绍

WebSocket协议是基于TCP的一种新的协议。WebSocket最初在HTML5规范中被引用为TCP连接,作为基于TCP的套接字API的占位符。它实现了浏览器与服务器全双工(full-duplex)通信。其本质是保持TCP连接,在浏览器和服务端通过Socket进行通信。 本文将使用Python编…

干,认识Audio框架还因此发现一个雷

我们最近出了一个问题,我们点击播放音乐,然后再点击停止播放的时候,喇叭还会输出一段杂音后喇叭才会停止输出。经过排查发现,在代码里面就做了这个功能代码在AudioFlinger.h 里frameworks/av/services/audioflinger/AudioFlinger.…

画图板-- 中点算法画圆

为了能以任意点为圆心画圆,我们可以把圆心先设为视点(相当于于将其平移到坐标原点),然后通过中点法扫描转换后,再恢复原来的视点(相当于将圆心平移回原来的位置)。圆心位于原点的圆有四条对称轴…

Linux 内核如何描述一个进程?

哈喽,我是吴同学,继续记录我的学习心得。一、关于写文章许多知识,书上或者网络上都有,就算这两个地方都没有,代码里也会有答案。但有时恰恰是 资料太多,反而让人难以检索出有用的信息。面对同样的资料&…

供应商关系管理SRM为企业的节流增贡献

在供应链下游的需求链上,企业为了增加市场份额、提高销售收入,更为重视面向客户的管理和信息化管理方面的投入,纷纷引入客户关系管理CRM的管理理念和信息化系统,在“客户第一”的经营策略下借助IT技术的手段来提高对客户的服务水平…

UART/I2C/SPI/1-wire四大通信接口的神解释

1、 裘千丈轻功水上漂之UART射雕英雄传中的裘千丈说,UART就是我的轻功水上漂过河。想从河上过(通信),提前布暗桩,行走时步伐按桩距固定(波特率提前确定),步幅太大或太小都会落水。为…

last_kmsg和ram console

相关文章Android 7.1使用脚本保存LOGCAT和KMSG日志到文件首先,在kernel里面通过printk吐log的时候会是下面的一个过程:printk会将信息格式化到kernel log buffer里面去。然后将这些格式化信息送到console去,在我们的系统里面有两个console&am…

字符串类

1.String类 常用方法: 参考:http://wenku.baidu.com/link?urltz-3Dpwj-JSJQdG6vSo0J1L1G9oJS4eQJjYgogieIzgjdNNLmj-U9EpWhOnVthz4egAKv0SNmLkqzNz2WsiZ2EmPGMu2UXhB6yy-E4yvMQ3 NB: 这里的”s1s2“是地址相等,而是s1.equals(s2)是内容相等…

github网页

GitHub主页创建仓库想必大家都有自己的Github账号吧,没有的可以到GitHub官网注册账号,注册完后,我们来下一步,在我们的GitHub上面右上角的New repository来创建一个仓库。 仓库名必须遵守相应格式:your_username.githu…

有用的Copy-On-write,写时复制

写时复制和写时拷贝是一个意思写时复制是一种策略,并不是Linux独有的,如果你正在设计某个系统架构,也可以参考这种思想。写时复制的英文解释如下Copy-on-write (sometimes referred to as "COW") is an optimization strategy used…

雷军:如果程序人生的话,这条路太漫长

这篇文章是在雷总个人博客看到的,里面聊到了他作为程序员的一些经历、初衷以及思考。写的不错,便转来给大家看看。-- 如果程序人生的话,这条路太漫长我并非天生喜欢写程序,上高中时也没有想过程序员的生活。我学电脑非常偶然&…

51单片机——硬件基础

单片机——硬件基础知识 宗旨:技术的学习是有限的,分享的精神是无限的。 1、单片机内部资源 STC89C52:8KFLASH、512字节RAM、32个IO口、3个定时器、1个UART、8个中断源 (1)Flash(硬盘)——程…