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

Posted 程序员同行者

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了容器云架构中使用gorouter+haproxy作为流量入口相关的知识,希望对你有一定的参考价值。


小贴士

Gorouter

Gnatsd

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

Confd

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

HAProxy

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

etcd

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


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

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

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

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

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

架构示意

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

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

其中原理就是

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

    '{"host":"10.254.90.233","port":9528,"uris":["test.a.com"]}'
  1. confd监听etcd中的key变化,如果有更新就同步修改haproxy配置规则并重新加载。

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

  1. 泛域名解析到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 监控检查

    具体说明见官方:https://github.com/cloudfoundry/gorouter

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

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

使用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"]}'

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}]}

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

10.90.2.103 test.a.com

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

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

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


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





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

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


以上是关于容器云架构中使用gorouter+haproxy作为流量入口的主要内容,如果未能解决你的问题,请参考以下文章

GRPC 在 Cloud Foundry 中如何工作? GoRouter 不支持 HTTP2

云原生架构中的Kubernetes可观察性挑战

云原生架构中Kubernetes可观察性的挑战

LVS/Nginx/HAProxy keepalived/heartbeat总结

传统云环境下的CI/CD操作手册系统架构概述

HAProxy 2.0发布,长期支持版本