容器雲架構中使用gorouter+haproxy做爲流量入口

小貼士

Gorouter

項目地址:https://github.com/cloudfoundry/gorouter/Gorouter來源於CloudFoundry。是一個高性能、輕量級的路由器及負載,它是整個平臺的流量入口,負責分發全部的http請求到對應的instance。它在內存中維護了一張路由表,記錄了域名與實例的對應關係,所謂的實例自動遷移,靠得就是這張路由表,某實例宕掉了,就從路由表中剔除,新實例建立了,就加入路由表。vue

Gnatsd

Gnatsd來源cloudfoundry,是一個開源輕量高性能的消息系統,gorouter依賴它來做爲消息系統,進行PUB/SUB操做。
官方地址:http://nats.io/
項目地址:https://github.com/apcera/gnatsdnode

Confd

Confd是一個輕量級的配置管理工具。經過查詢Etcd,結合配置模板引擎,保持本地配置最新,同時具有按期探測機制,配置變動自動reload。其後端支持的數據類型有:etcd、consul、vault、environment variables、redis、zookeeper、dynamodb、stackengine、rancher。不過通常使用Confd和etcd的配合使用比較多。python

項目地址:https://github.com/kelseyhightower/confdlinux

HAProxy

HAProxy是一個免費的負載均衡軟件,能夠運行於大部分主流的Linux操做系統上。HAProxy提供了L4(TCP)和L7(HTTP)兩種負載均衡能力,具有豐富的功能。HAProxy的社區很是活躍,版本更新快速,最關鍵的是,HAProxy具有媲美商用負載均衡器的性能和穩定性。nginx

項目地址:https://github.com/haproxy/haproxygit

etcd

etcd是Go編寫,是一個分佈式一致性鍵值存儲系統,用於共享配置和服務發現,專一於:· 簡單:良好定義的,面向用戶的API (gRPC)。· 安全:帶有可選客戶端證書認證的自動TLS。· 快速:測試驗證,每秒10000寫入。· 可靠:使用Raft適當分佈。項目地址:https://github.com/etcd-io/etcd程序員

今天簡單分享下公司大規模容器應用中的數據流架構。github

咱們公司項目都是採用微服務架構設計,現服務對外訪問支持兩種模式以下:golang

  1. 使用的NodePort方式暴露應用端口至宿主機,上層經過配置nginx代理到這臺機器的端口,而後外網SLB在代理這個nginx。這種模式下帶來了一個麻煩,就是每次新上個應用都得去配置Nginx。:)redis

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

  2. 域名分發模式,使用gorouter+haproxy做爲流量的入口,域名經過泛解析到SLB上,SLB解析到內部的haproxy,haproxy代理gorouter,gorouter內部維護了一張應用的路由表,會進行匹配。這樣咱們在平臺上一個應用建立好後,啥也不用作,就能夠訪問。

架構示意

image

選擇兩個Node節點做爲流量節點,上面跑了confd,haproxy,gorouter容器,gorouter須要依賴nats(咱們是部署在了另外一個命名空間下)控制器使用的DaemonSet,開放了80,443端口。

其中原理就是

  1. 建立應用後若是使用域名分發模式,就會經過nats客戶端註冊一條消息到gorouter中,內容包含使用的域名+加上這應用的service IP,好比

    '{"host":"10.254.90.233","port":9528,"uris":["test.a.com"]}'
  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 &

先啓動一個後端服務,我這裏隨便起了個服務
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

相關文章
相關標籤/搜索