内容简介:项目地址: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
今天简单分享下公司大规模容器应用中的数据流架构。
我们公司项目都是采用微服务架构设计,现服务对外访问支持两种模式如下:
-
使用的NodePort方式暴露应用端口至宿主机,上层通过配置nginx代理到这台机器的端口,然后外网SLB在代理这个nginx。这种模式下带来了一个麻烦,就是每次新上个应用都得去配置Nginx。:)
流量走向: SLB->Nginx>node(kube-proxy)>pod
-
域名分发模式,使用gorouter+haproxy作为流量的入口,域名通过泛解析到SLB上,SLB解析到内部的haproxy,haproxy代理gorouter,gorouter内部维护了一张应用的路由表,会进行匹配。这样我们在平台上一个应用创建好后,啥也不用做,就可以访问。
架构示意
image
选择两个Node节点作为流量节点,上面跑了confd,haproxy,gorouter容器,gorouter需要依赖nats(我们是部署在了另一个命名空间下)控制器使用的DaemonSet,开放了80,443端口。
其中原理就是
-
创建应用后如果使用域名分发模式,就会通过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>
-
confd监听etcd中的key变化,如果有更新就同步修改haproxy配置规则并重新加载。
-
SLB绑定到这流量节点上的80端口(haproxy开的端口)
-
泛域名解析到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自带两个http终端:
/varz: 自身状态监控
/routes: 目前承载的proxy rules list
/healthz 监控检查
先启动一个后端服务,我这里随便起了个服务
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
image.png
可以发现使用域名用9999端口也能访问应用,这就是gorouter的路由匹配。
目前就使用最简单模式演示下gorouter的功能,Thanks♪(・ω・)ノ。
欢迎您关注 程序员 同行者订阅号,程序员同行者是一个技术分享平台,主要是运维自动化开发:linux、 python 、django、saltstack、redis、golang、 docker 、kubernetes、vue等经验分享及经验交流。
趁现在,关注我们
image
牛人并不可怕,可怕的是牛人比我们还努力!
如果您觉得不错,请别忘了转发、分享、点赞让更多的人去学习, 您的举手之劳,就是对小编最好的支持,非常感谢!
image
以上所述就是小编给大家介绍的《容器云架构中使用gorouter+haproxy作为流量入口》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- Docker架构、镜像和容器
- OpenShift+VMware:新的容器架构
- 『高级篇』docker容器来说软件架构的进化(二)
- 你知道支付宝容器化架构是怎么搭建的吗?
- 支付宝客户端架构解析:Android 容器化框架初探
- 支付宝客户端架构解析:iOS 容器化框架初探
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Web开发秘方
Brian P. Hogan、Chris Warren、Mike Weber、Chris Johnson、Aaron Godin / 七印部落 / 华中科技大学出版社 / 2013-7-10 / 66.00元
猜猜硅谷的前端工程师怎么折腾JS的?想知道无限下拉的列表怎么做吗?你知道DropBox可以当Web服务器用吗?你知道怎么做出跨平台的幻灯片效果吗?不借助插件,怎样在移动设备上实现动画效果?怎样快速搭建和测试HTML电子邮箱?怎样制作跨PC和移动设备显示的应用界面?怎样利用最新的JavaScript框架(Backbone和Knockout)提高应用的响应速度?怎样有效利用CoffeeScript和S......一起来看看 《Web开发秘方》 这本书的介绍吧!