内容简介:项目地址: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 容器化框架初探
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Python for Data Analysis
Wes McKinney / O'Reilly Media / 2012-11-1 / USD 39.99
Finding great data analysts is difficult. Despite the explosive growth of data in industries ranging from manufacturing and retail to high technology, finance, and healthcare, learning and accessing d......一起来看看 《Python for Data Analysis》 这本书的介绍吧!