docker overlay网络拓扑及服务注册问题

跨主机docker网络有多种方案,如overlay、flannel、calico、weave等,其中overlay是docker原生的跨主机网络方案。最近使用overlay方案部署容器集群,在进行服务注册时遇到问题,需要手动创建veth设备解决。

1. overlay网络拓扑

overlay网络中,docker会为每一个overlay网络创建一个独立的network namespace,即上图中的net1和net2。每个namespace中都有一个linux bridge br0,docker容器与br0之间通过veth pair连接,一端为容器中的eth0,另一端通过namespace中的veth接口连接到br0。br0还连接了vxlan1,通过vxlan隧道实现跨主机容器通信。

br0没有与宿主机namespace中的接口相连,因此容器无法通过eth0与主机通信。在overlay网络中,为了实现容器与主机之间的通信,在宿主机namespace中创建了linux bridge docker_gwbridge。所有容器都通过veth pair连接到该网桥中。上图中,容器可以通过eth1与宿主机通信。eth1接口仅用于容器与宿主机通信,即使位于同一个overlay网络中的容器间,也无法通过eth1接口通信。

2. 服务注册问题

最近,使用overlay网络部署容器集群后,需要将容器的IP地址和端口注册到api网关中,api网关将容器提供的服务进行映射,对外暴露统一的IP地址。有两种使用场景:

a) 集群外部通过api网关查询服务,通过映射后的地址和端口号访问

b) 集群内部通过api网关查询服务,可通过映射后的地址和端口号访问,也可直接选择容器的地址和端口号访问

在以上的应用场景中,通过映射后的地址和端口号服务,访问服务时需要经过api网关,再到达容器。在我的集群中,api网关使用host方式部署,与提供服务的容器之间通过eth1接口进行通信,容器向api网关注册时,服务的IP地址必须为eth1的IP地址,才能保证通过api网关顺利转发。但这时,集群内访问时,查询到的容器IP是eth1的IP地址,无法直接访问。如果注册时服务的IP采用eth0的IP,则无法通过api网关转发。
为了解决以上问题,我通过vethpair设备将overlay网络直接与宿主机相连通。这样,将eth0的IP注册到api网关,同样能通过api网关进行转发。具体步骤如下:

创建vethpair设备:
      ip link add vethhost type veth peer name gw_api:
  将vethpair的vethhost一端连接到overlay网络的namespace中,namespace可在/var/run/netns中找到,横线后为overlay网络的ID(cae3e00181)
      ip link set vethhost netns 1-cae3e00181
  将vethhost端接入br0网桥:
      ip netns exec 1-cae3e00181 brctl addif br0 vethhost
  设置vethhost端mtu并up:
      ip netns exec 1-cae3e00181 ifconfig vethhost mtu 1450 up
  设置gw_api端mtu和IP地址(overlay网络同网段IP)
      ifconfig gw_api mtu 1450 193.168.120.1/16

经过上述设置,容器与api网关的网络拓扑如下(省略了net2):

由于apigateway使用宿主机网络,可以通过gw_api接口与overlay网络net1通信。

在这一解决方法中,我修改了overlay网络的拓扑。暂时没有考虑其他几种跨主机容器网络方案能不能避免该问题,等有时间研究一下k8s的网络方案,或许会有更多收获。

原文地址:https://www.cnblogs.com/doujianli/p/9939611.html

时间: 2024-08-03 22:30:11

docker overlay网络拓扑及服务注册问题的相关文章

基于docker部署的微服务架构(四): 配置中心

原文:http://www.jianshu.com/p/b17d65934b58%20 前言 在微服务架构中,由于服务数量众多,如果使用传统的配置文件管理方式,配置文件分散在各个项目中,不易于集中管理和维护.在 spring cloud 中使用 config-server 集中管理配置文件,可以使用 git.svn.本地资源目录 来管理配置文件,在集成了 spring cloud bus 之后还可以通过一条 post 请求,让所有连接到消息总线的服务,重新从config-server 拉取配置文

基于docker的高可用服务解决方案

Docker从2013年发布第一个版本以来,已经火遍全球,技术迭代也比较频繁,其周边产品和技术也越来越丰富.Docker的轻量级容器不仅实现了资源隔离,而且几乎可以运行在任何地方,使得部署和扩展变得非常容易,随着Docker的日趋完善,目前Docker已经被越来越多的公司应用到生产环境中. 一.环境 1.1.宿主机操作系统环境 Centos7.1-64 1.2.docker版本 Server Version: 1.9.1 1.3.集群网络环境 master:10.2.0.80 slave1:10

基于etcd+confd对监控prometheus的服务注册发现

Prometheus是对容器监控的一个开源解决方案,可以对宿主机和容器内的信息进行详细监控,通过grafna展示出来,Prometheus是根据node节点上的cadvisor来获取每个容器的监控状态,相对zabbix而言,prometheus相当于server,cadvisor相当于agent,默认情况走的是类似zabbix的被动模式,cadvisor在收到prometheus要数据的请求后,将采集后的数据发送给prometheus. Prometheus是通过读取配置文件去采集指定cadvi

分布式服务注册和发现consul 简要介绍

Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置.与其他分布式服务注册与发现的方案,Consul的方案更"一站式",内置了服务注册与发现框 架.分布一致性协议实现.健康检查.Key/Value存储.多数据中心方案,不再需要依赖其他工具(比如ZooKeeper等).使用起来也较 为简单.Consul用Golang实现,因此具有天然可移植性(支持Linux.windows和Mac OS X):安装包仅包含一个可执行文件,方便部署,与Docker等轻量级

Spring Cloud Consul 实现服务注册和发现

Spring Cloud 是一个基于 Spring Boot 实现的云应用开发工具,它为基于 JVM 的云应用开发中涉及的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全局锁.决策竞选.分布式会话和集群状态管理等操作提供了一种简单的开发方式.通过 Spring Boot 风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂.易部署和易维护的分布式系统开发工具包. Spring Cloud 包含了多个子项目(针对分布式系统中涉及的多个不同开源产品),比如:Sprin

基于 Consul 实现 MagicOnion(GRpc) 服务注册与发现

0.简介 0.1 什么是 Consul Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置. 这里所谓的服务,不仅仅包括常用的 Api 这些服务,也包括软件开发过程当中所需要的诸如 Rpc.Redis.Mysql 等需要调用的资源. 简而言之 Consul 就是根据 Key/Value 存储了一套所有服务的 IP/Port 集合,当你 Grpc 客户端需要请求某种服务的时候,具体的 IP 与端口不需要你自己来进行指定,而是通过与 Consul Agent 通信

Docker + Consul + registrator实现服务发现及nginx反向代理

一. 架构设计 在现实中,我们一直渴望着追求提供高质量.高可用的服务架构体系,同时减少不必要的部署和维护代价,减少容错率.面对如此高的要求,可以有两种架构方案:Docker+Etcd+Confd+NginxDocker+Consul+Nginx本文中我们主要来介绍 Docker+Etcd+Confd+Nginx方案,此方案更加高效.快捷,并且维护代价和容错率更低,分布式支持力度更强,如下图所示: 上面示意图的大概流程如下:1.docker01主机上以二进制包的方式部署consul服务并后台运行,

SpringCloud(七)服务注册之Consul的简介和原理

Consul 何为Consul? Consul 是由 HashiCorp 公司推出的开源软件,用于实现分布式系统的服务发现与配置.与其他分布式服务注册与发现的方案,Consul 的方案更“一站式”,内置了服务注册与发现框 架.分布一致性协议实现.健康检查.Key/Value 存储.多数据中心方案,不再需要依赖其他工具(比如 ZooKeeper 等),使用起来也较为简单. Consul 用 Golang 实现,因此具有天然可移植性(支持 Linux.windows 和 Mac OS X ),它的安

服务注册与发现

服务注册与发现 1.什么是服务注册与发现 微服务将传统的"巨石"应用拆分成一个一个的组件应用,每个组件应用提供特定的服务,可以是一个,也可以是多个,并且组件所含服务应该是可以动态扩展的,随着时间推移.系统进化,可任意拆分.合并. 组件化应用和颗粒化的服务,遍布在系统的各个角落,由不同的项目成员进行维护,微服务的核心是化整为零.各司其职,这就要求开发人员不得操作其业务或服务范围以外的数据模型等资源,只能通过接口的访问,使用某一服务. 由于服务的跨度很大(公司很大的情况下).数量很多(数以