容器云架构中使用gorouter+haproxy作为流量入口

栏目: 服务器 · 发布时间: 6年前

内容简介:​项目地址:Gnatsd来源cloudfoundry,是一个开源轻量高性能的消息系统,gorouter依赖它来作为消息系统,进行PUB/SUB操作。

小贴士

Gorouter

项目地址: https://github.com/cloudfoundry/gorouter/ Gorouter来源于CloudFoundry。是一个高性能、轻量级的路由器及负载,它是整个平台的流量入口,负责分发所有的http请求到对应的instance。它在内存中维护了一张路由表,记录了域名与实例的对应关系,所谓的实例自动迁移,靠得就是这张路由表,某实例宕掉了,就从路由表中剔除,新实例创建了,就加入路由表。

Gnatsd

Gnatsd来源cloudfoundry,是一个开源轻量高性能的消息系统,gorouter依赖它来作为消息系统,进行PUB/SUB操作。

官方地址: http://nats.io/

项目地址: https://github.com/apcera/gnatsd

Confd

Confd是一个轻量级的配置管理工具。通过查询Etcd,结合配置模板引擎,保持本地配置最新,同时具备定期探测机制,配置变更自动reload。其后端支持的数据类型有:etcd、consul、vault、environment variables、 redis 、zookeeper、dynamodb、stackengine、rancher。不过一般使用Confd和etcd的配合使用比较多。

项目地址: https://github.com/kelseyhightower/confd

HAProxy

HAProxy是一个免费的负载均衡软件,可以运行于大部分主流的 Linux 操作系统上。HAProxy提供了L4(TCP)和L7(HTTP)两种负载均衡能力,具备丰富的功能。HAProxy的社区非常活跃,版本更新快速,最关键的是,HAProxy具备媲美商用负载均衡器的性能和稳定性。

项目地址: https://github.com/haproxy/haproxy

etcd

etcd是 Go 编写,是一个分布式一致性键值存储系统,用于共享配置和服务发现,专注于:· 简单:良好定义的,面向用户的API (gRPC)。· 安全:带有可选客户端证书认证的自动TLS。· 快速:测试验证,每秒10000写入。· 可靠:使用Raft适当分布。项目地址: https://github.com/etcd-io/etcd

今天简单分享下公司大规模容器应用中的数据流架构。

我们公司项目都是采用微服务架构设计,现服务对外访问支持两种模式如下:

  1. 使用的NodePort方式暴露应用端口至宿主机,上层通过配置nginx代理到这台机器的端口,然后外网SLB在代理这个nginx。这种模式下带来了一个麻烦,就是每次新上个应用都得去配置Nginx。:)

    流量走向: SLB->Nginx>node(kube-proxy)>pod

  2. 域名分发模式,使用gorouter+haproxy作为流量的入口,域名通过泛解析到SLB上,SLB解析到内部的haproxy,haproxy代理gorouter,gorouter内部维护了一张应用的路由表,会进行匹配。这样我们在平台上一个应用创建好后,啥也不用做,就可以访问。

架构示意

容器云架构中使用gorouter+haproxy作为流量入口

image

选择两个Node节点作为流量节点,上面跑了confd,haproxy,gorouter容器,gorouter需要依赖nats(我们是部署在了另一个命名空间下)控制器使用的DaemonSet,开放了80,443端口。

其中原理就是

  1. 创建应用后如果使用域名分发模式,就会通过nats客户端注册一条消息到gorouter中,内容包含使用的域名+加上这应用的service IP,比如

    <pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="" cid="n179" mdtype="fences" style="margin: 15px 0px; padding: 8px 4px 6px; max-width: 100%; word-wrap: break-word !important; box-sizing: border-box !important; overflow: visible; font-family: var(--monospace); font-size: 0.9em; break-inside: avoid; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); border-width: 1px; border-style: solid; border-color: rgb(231, 234, 237); border-radius: 3px; width: inherit; position: relative !important;">'{"host":"10.254.90.233","port":9528,"uris":["test.a.com"]}'</pre>

  2. confd监听etcd中的key变化,如果有更新就同步修改haproxy配置规则并重新加载。

  3. SLB绑定到这流量节点上的80端口(haproxy开的端口)

  4. 泛域名解析到SLB,用户通过域名 test.a.com 请求,会经过gorouter路由匹配,匹配成功进行代理,反之访问会提示未注册路由错误。

因为这架构涉及很多知识,本次就使用最简单的例子,使用gorouter ,nats 实现负载。

下载部署nats

wget https://github.com/nats-io/gnatsd/releases/download/v1.4.1/gnatsd-v1.4.1-linux-amd64.zip
unzip gnatsd-v1.4.1-linux-amd64.zip
cd gnatsd-v1.4.1-linux-amd64
# 启动
./gnatsd -p 4222 -m 8222 &

下载nats-pub

go get -v github.com/nats-io/nats
cd $GOPATH/src/github.com/nats-io/nats/examples
go build -o nats-pub main.go
mv nats-pub $GOPATH/bin/

下载gorouter

go get -v github.com/cloudfoundry/gorouter
cd $GOPATH/src/github.com/cloudfoundry/gorouter
go build -o gorouter .
mv gorouter $GOPATH/bin/

启动gorouter

配置文件格式为yaml,内容如下:

status:
  port: 8082
  user: admin
  pass: admin123

nats:
  - host: "10.90.2.103" # nats地址
  port: 4222
  user:
  pass:

logging:
  file:
  syslog:
  level: info

# 指定流量入口端口
port: 9999
index: 0

go_max_procs: -1

publish_start_message_interval: 600
prune_stale_droplets_interval: 10
droplet_stale_threshold: 80
publish_active_apps_interval: 0 # 0 means disabled
secure_cookies: false
route_service_timeout: 600
route_services_secret: "tWPE+sWJq+ZnGJpyKkIPYg=="

extra_headers_to_log:
- Span-Id
- Trace-Id
- Cache-Control

启动命令

gorouter -c gorouter.yml &

先启动一个后端服务,我这里随便起了个服务

容器云架构中使用gorouter+haproxy作为流量入口

image.png

使用nat-pub注册一条路由到gorouter

nats-pub -s nats://admin:admin@localhost:4222 'router.register' '{"host":"10.90.2.103","port":9100,"uris":["test.a.com"]}'
Published [router.register] : '{"host":"10.90.2.103","port":9100,"uris":["test.a.com"]}'

-s 指定nats地址

router.register: 往这个频道里发消息

Gorouter监听了router.register、router.unregister等几个频道,所以Gorouter可以接收到。

也可以取消路由

nats-pub -s nats://admin:admin@localhost:4222 'router.unregister'   '{"host":"10.90.2.103","port":9100,"uris":["test.a.com"]}'

查看gorouter路由表,路由表默认120秒失效,可以注册路由的时候指定"stale_threshold_in_seconds":8000设置

curl http://admin:admin123@10.90.2.103:8082/routes
{"test.a.com":[{"address":"10.90.2.103:9100","ttl":0}]}</pre>

在本机添加gorouter主机的hosts映射,我这里是在windows下添加的。

10.90.2.103 test.a.com

容器云架构中使用gorouter+haproxy作为流量入口

image.png

可以发现使用域名用9999端口也能访问应用,这就是gorouter的路由匹配。

目前就使用最简单模式演示下gorouter的功能,Thanks♪(・ω・)ノ。

欢迎您关注 程序员 同行者订阅号,程序员同行者是一个技术分享平台,主要是运维自动化开发:linux、 python 、django、saltstack、redis、golang、 docker 、kubernetes、vue等经验分享及经验交流。

趁现在,关注我们

容器云架构中使用gorouter+haproxy作为流量入口

image

牛人并不可怕,可怕的是牛人比我们还努力!

如果您觉得不错,请别忘了转发、分享、点赞让更多的人去学习, 您的举手之劳,就是对小编最好的支持,非常感谢!

容器云架构中使用gorouter+haproxy作为流量入口

image


以上所述就是小编给大家介绍的《容器云架构中使用gorouter+haproxy作为流量入口》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Computational Advertising

Computational Advertising

by Kushal Dave、Vasudeva Varma / Now Publishers Inc / 2014

Computational Advertising (CA), popularly known as online advertising or Web advertising, refers to finding the most relevant ads matching a particular context on the Web. The context depends on the t......一起来看看 《Computational Advertising》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

SHA 加密
SHA 加密

SHA 加密工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具