Rancher容器网络-Floating IP解决方案

Rancher网络使用中遇到的问题

首先,在为某一个stack编写Rancher catalog的时候,假设在docker-compose里指定了ports A:B,那么,cattle在调度的时将首先过滤掉所有已经占用了port A的主机。这也就意味着,假设用户只有4台host作为Rancher agent,但是需要运行5个在外网中占用80端口的服务,这显然是不行的。

另一方面,客户端通过主机的IP地址来访问Stack提供的服务,一旦由于系统异常,或者微服务内部程序崩溃导致Service被重新调度到其他主机,势必导致访问Stack服务IP地址的更改。

为了让客户端不被影响,常见的解决方案是通过使用Rancher提供的external-DNS;如果业务在公网,有像AWS的Router-53之类的解决方案;若是自建数据中心也可以通过使用支持RFC-2136的硬件路由器等来实现DNS条目的及时刷新。

从当前Github代码看External-DNS已经支持下面的Provider了:

但是,通过刷新DNS的方案要么价格昂贵,要么需要自己维护一个Rancher外部的DNS Server,都存在一定缺陷。

那么,有没有一种方式,既能够解决端口冲突,又能够解决stack对外服务IP变更的问题呢?答案就是今天我们的主角:Floating IP!

Floating IP解决方案

上一次Alan为大家分享的「关于在Rancher中使用keepalived」中就有提到VIP的概念,只是keepalived需要在Active+Passive的主机之间周期性发送心跳报文,然后基于优先级来判断将VIP绑定到哪一个host,它解决了服务迁移后访问的目标IP地址变化的问题。

而Floating IP却是从另一个角度来解决问题。熟悉OpenStack的人对Floating IP应该都不会陌生,所谓Floating IP就是为某台虚拟机绑定的一个外网IP地址。绑定之后,无论该虚拟机在OpenStack内被迁移到哪一台hypervisor,外网都可以通过Floating IP来访问到该虚拟机。我们来看Rancher中是怎么引入Floating IP的。首先上一张总体模块框图:

从图上我们可以看到,整个Floating IP的实现,只需要两个模块,或者说两个微服务:Metadata-confd和Network-plugin。至于IPAM为什么不需要重新实现,我们后面会讲到。接下来我们讲一下各个模块功能和作用。

Metadata-confd:

这是一个使用了Rancher managed网络的service,通过managed网络,它按照一定的周期从Agent-Instance上polling metadata信息。采用分布式架构,每一个Metadata-confd只关注属于自己host上的容器。

但是,也并非所有的container都会触发后续行为,只有该host上带有“io.rancher.container.floating.ip” 标签的容器有被新增、删除或更新IP的时候,Metadata-confd才会通过docker client向docker daemon发送操作命令。

需要注意的是,这里的network均是指Floating IP所在的网络。

对于Metadata-confd的实现方式,除了通过通过周期性polling之外,也可以采用支持Rancher backend的confd来生成map文件(包含ip <—> floating ip映射),然后使用confd里面的reload-cmd参数,指定脚本去解析和做后续处理。当然,这种方法存在不少坑,大家可以下来自己研究。

FIP Network Plugin:

FIP Network Plugin是按照CNM的定义来实现的一个libnetwork的remote driver。该service使用host网络,遵照docker deamon发送过来的请求指令,实现网络相关的操作。Network plugin所做的事情,我们可以通过下图来理解:

原生的docker bridge driver创建了docker0网桥,然后将所有的container通过link pair挂到桥上。在network root namespace内,通过NAPT规则将对Host上特定port的访问DNAT到container的内部port。而在Floating IP网络中,FIP network plugin创建了一个新的bridge,然后将label含Floating IP的container连接到该bridge上。

由于使用了与docker0 共享的“default” driver的IPAM,FIP network bridge的IP地址段不会与docker0所在的网段重叠,从而保障container在连接了两个网段后,路由不会冲突。

按照CNM的定义,Docker Network Plugin主要需要实现以下方法:

  1. create network
  2. delete network
  3. create endpoint
  4. delete endpoint
  5. join endpoint to network
  6. leave endpoint from network

而FIP Network Plugin除了要实现基本的功能外,还需要为Floating IP添加以下功能:

  1. 当收到join endpoint to network请求时,将Floating IP配置到host IP所在的接口上;
  2. 更新主机的NAT规则,将所有destination IP为FIP的报文DNAT到container的内网IP;
  3. 当container销毁时,执行反向的操作。

这些修改之后,container其实还无法通过FIP回包,为什么呢?有兴趣的可以研究一下挂载了两个network后container的路由表条目。至于还需要如何配置,大家可以下来自己实验。

演示

现在我们来做一个实验,看看Floating IP的报文转发是如何工作的。

1. 首先在Rancher catalog中选择“Wise2C Floating IP”,从详细页面看,Floating IP这个stack不需要添加任何配置参数:

启动过程中,可以看到:该stack在一个host ”vm-153-5”上启动了两个containers(在每个host上均会被调度):

2. 服务启动成功后,我们到host里面可以看到已经初始化好的network(其网段是172.18.0.0/16):

3. 然后我们再通过Rancher创建一个带有标签为“io.rancher.container.floating.ip=192.168.99.200”的container。这里的IP地址就是我们希望为该container绑定的Floating IP:

4. 当container启动成功后,metadata-confd会检测到该label,然后向docker daemon发送请求将该container加入到wise2c network。我们可以进入container查看interface详情来了解到:

上图中接口[email protected]就是接入到wise2c network的接口,其IP地址属于172.18.0.0/16网段。

5. 再来看host上的IP地址和NAT规则

其中enp0s8就是我们host的default gw对应的出口网卡,可以看到floating ip:192.168.99.200已经被添加到上面了。

主机的NAT表:

上图就是我们的network-plugin为Floating IP创建的基于destination IP的DNAT规则,其中br-d62debee292b是FIP network plugin为wise2c network创建的bridge。

下面的DNAT规则是将所有不来自br-d62debee292b,且目标IP地址为192.168.99.200的报文DNAT到172.18.0.2容器。

6. 接下来就是验证网络,在客户机(192.168.99.1)上ping Floating IP:

到wise2c network的bridge上抓包:

可以看到,DNAT规则已经生效。

总结

我们再来整理一下使用场景。

初始化:

  1. 首先FIP catalog指定在所有运行了Rancher agent的主机上均启动Floating IP service;
  2. 在服务启动后,Metadata-confd向docker daemon请求创建FIP network,然后开始polling Rancher metadata信息;

    一旦发现本机上存在带FIP标签的容器,Metadata-confd就向docker daemon请求将容器接入FIP network;

  3. 接下来network-plugin从docker daemon收到创建FIP network和将容器接入FIP network的请求后,执行操作。

在这个过程中,Floating IP被添加到host上默认网关对应的网卡,并更新NAT规则,保障外网访问Floating IP的流量被DNAT到容器。

容器迁移:

  1. 当容器从Host-A迁移到Host-B,Host-A上的docker-daemon会发起将container移出FIP network。network-plugin只需要按照leave endpoint from network的流程,逐一删除NAT规则,并移除host上的Floating IP address。
  2. 在Host-B上执行的操作除少了初始化时候的创建FIP network外,其他操作流程同“初始化”。

Q & A

Q:其他编排引擎怎么支持?

A:除了通过CNM来实现外,还可以通过外部实现,只需要能够为主机配置IP地址和NAT规则就能够支持的了。只是如果通过CNM实现,对资源的释放可以由docker daemon来触发,不需要完全自主控制。

Q:Metadata-confd poll metadata service的间隔是不是需要很短?否则是不是可能存在旧的host IP还没有移除,新的host已经在尝试添加IP的情况,导致IP冲突?

A:如果采用poll的方式来实现肯定是有一定的时间间隔的缺陷的,如果无法接受,就可以采用支持Rancher backend的confd来实现。

Q:今天讲的FIP在k8s环境下也可以用吗?

A:其实理论上是可用的,但我们还没测试。因为方案只用了docker label, Rancher metadata service 和 docker libnetwork,这些在Rancher 的k8s 环境都是有的。

Q:managed网络还是基于ipsec的隧道网络吗?性能上怎么样呢?

A:是的,基于ipsec,在很多生产环境的实际使用中,没什么性能问题,性能就是和普通VPN 一样。

在Docker本身提供的几种网络基础上提供了一种叫做Managed的网络特性,官方说法如下:The Rancher network uses IPsec tunnelling and encryption for security。

简单理解就是在容器之间构建了一条私有网络,只有容器与容器之间可以访问。

Rancher会为每个容器分配一个 10.42.*.* 的私有网络地址,这个地址只在容器之间是可达的,对外不可见,有点类似一种纯软件上的VPC方式。从路由上可以看出,对于10.42网段的路由是通过docker0接口,docker0的特殊的配置了IP也包含了10.42网段。

时间: 2024-10-10 20:20:50

Rancher容器网络-Floating IP解决方案的相关文章

Rancher Labs联手NeuVector,提供容器管理与安全解决方案

根据ClusterHQ与DevOps.com的调研报告,对于在生产环境中使用容器,企业最关心的问题中排名第三位的,是容器安全.近日,美国两大容器领域独角兽达成战略合作,合力应对这一需求与挑战. 全栈化容器管理平台提供商Rancher Labs Inc.,与容器网络安全提供商NeuVector近日宣布正式达成合作,希望能使容器安全像应用程序容器一样易于部署. 企业的DevOps团队现在可以在Ranche容器管理平台内使用NeuVector提供的容器网络安全应用程序.此次合作关系的达成,使NeuVe

有容云:容器网络那些事儿

编者注: 本文根据7月31日有容云<Docker Live时代线下沙龙-北京站>嘉宾分享内容整理而成,分享嘉宾杜东明,有容云高级技术顾问,十年IT经验,IT行业的全栈工程师.涉足领域包括存储.网络.备份/容灾.服务器/终端虚拟化.Docker等.拥有丰富的一线客户经验,曾帮助工行.建行.光大.国寿.泰康等诸多金融客户设计其虚拟化基础架. 我相信,真正拿容器工作或者是去运维一个容器环境,真正在容器上面做生产的时候大家都会遇到的一个话题就是容器网络,所以我今天给大家分享下这个话题,有不同意见的地方

理解Docker(6):若干企业生产环境中的容器网络方案

本系列文章将介绍 Docker的相关知识: (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 (4)Docker 容器的隔离性 - 使用 cgroups 限制容器使用的资源 (5)Docker 网络 (6)若干企业生产环境中的容器网络方案 Docker 在早期只有单机上的网络解决方案,在 1.19 版本引入了原生的 overlay 网络解决方案,但是它的性能损耗较大,可能无法适应一些生产环

docker容器分配静态IP

最近因为工作要求需要用学习使用docker,最后卡在了网络配置这一块.默认情况下启动容器的时候,docker容器使用的是bridge策略比如: docker run -ti ubuntu:latest /bin/bash 等效于 docker run -ti --net=bridge ubuntu:latest /bin/bash bridge策略下,docker容器自动为我们分配了一个IP地址,并连接到docker0的网桥上.但这里有一个问题,这个IP地址并不是静态分配的,这对我们的对容器的实

Docker的单主机容器网络

作者:杨冬 欢迎转载,也请保留这段声明.谢谢! 出处: https://andyyoung01.github.io/ 或 http://andyyoung01.16mb.com/ 本篇文章主要探索Docker的单机容器网络,了解一下单个Docker主机上网络的各种模式,从而为后续理解跨主机容器网络打下基础. Docker默认容器网络的建立和控制是一种结合了network namespace,iptables,Linux网桥及route table等多种技术的综合解决方案,本篇主要针对于如何使用单

4 个你需要了解的容器网络工具

摘要: 有如此之多的各种新的云计算技术.工具和技术需要我们跟进,到底从哪里开始学习是一个艰难的决定.这一系列下一代云计算技术的文章旨在让你快速了解新兴和快速变化领域的重大项目和产品,比如软件定义网络(SDN).容器,以及其交叉领域:容器网络. 有如此之多的各种新的云计算技术.工具和技术需要我们跟进,到底从哪里开始学习是一个艰难的决定.这一系列下一代云计算技术的文章旨在让你快速了解新兴和快速变化领域的重大项目和产品,比如软件定义网络(SDN).容器,以及其交叉领域:容器网络. 对于企业容器部署,容

容器网络——从CNI到Calico

从容器诞生开始,存储和网络这两个话题就一直为大家津津乐道.我们今天这个环境下讲网络这个问题,其实是因为容器对网络的需求,和传统物理.虚拟环境对网络环境需求是有差别的,主要面临以下两个问题: 过去IaaS层在网络方便做了很多工作,已经形成了成熟的环境,如果和容器环境适配,两边都需要做很多改造 容器时代提倡微服务,导致容器的粒度之小,离散程度之大,原有IaaS层网络解决方案很难承载如此复杂的需求 我们来看下一些主流的容器网络接入方案: Host network 最简单的网络模型就是让容器共享Host

Spring Cloud:多环境配置、注册中心安全认证、容器宿主机IP注册

记录一下搭建 Spring Cloud 过程中踩过的一些坑.写这篇随笔时候不知道为什么想到了看过的一个短片<断崖>,看的时候真的感受到了女主的绝望和无助.感觉自己就像女主一样,我在自己技术水平的坑里努力的爬着,好的是我爬出来了,坏的是外面还有一个更大的坑!!!人生路漫漫,且爬且珍惜! Spring 版本 Spring Boot:2.0.0.RELEASE Spring Cloud:Finchley.SR2 多环境配置 多配置的切换在开发中真是很常用,能有效提高效率.一些成熟的框架基本都有关于配

Kubernetes &amp; Docker 容器网络终极之战(十四)

目录 一.单主机 Docker 网络通信 1.1.host 模式 1.2 Bridge 模式 1.3 Container 模式 1.4.None 模式 二.跨主机 Docker 网络通信分类 2.1 通信方案 2.2.容器网络规范 2.3.网络通信实现方案 2.4.Kubernetes 网络模型 三.跨主机 Docker 网络 3.1 Flannel 网络方案 3.2.Calico 网络方案 3.3.Canal 网络方案 3.4.Docker overlay 网络方案 3.5.Docker ma