項目地址:https://github.com/cloudfoundry/gorouter/Gorouter來源於CloudFoundry。是一個高性能、輕量級的路由器及負載,它是整個平臺的流量入口,負責分發全部的http請求到對應的instance。它在內存中維護了一張路由表,記錄了域名與實例的對應關係,所謂的實例自動遷移,靠得就是這張路由表,某實例宕掉了,就從路由表中剔除,新實例建立了,就加入路由表。vue
Gnatsd來源cloudfoundry,是一個開源輕量高性能的消息系統,gorouter依賴它來做爲消息系統,進行PUB/SUB操做。
官方地址:http://nats.io/
項目地址:https://github.com/apcera/gnatsdnode
Confd是一個輕量級的配置管理工具。經過查詢Etcd,結合配置模板引擎,保持本地配置最新,同時具有按期探測機制,配置變動自動reload。其後端支持的數據類型有:etcd、consul、vault、environment variables、redis、zookeeper、dynamodb、stackengine、rancher。不過通常使用Confd和etcd的配合使用比較多。python
項目地址:https://github.com/kelseyhightower/confdlinux
HAProxy是一個免費的負載均衡軟件,能夠運行於大部分主流的Linux操做系統上。HAProxy提供了L4(TCP)和L7(HTTP)兩種負載均衡能力,具有豐富的功能。HAProxy的社區很是活躍,版本更新快速,最關鍵的是,HAProxy具有媲美商用負載均衡器的性能和穩定性。nginx
項目地址:https://github.com/haproxy/haproxygit
etcd是Go編寫,是一個分佈式一致性鍵值存儲系統,用於共享配置和服務發現,專一於:· 簡單:良好定義的,面向用戶的API (gRPC)。· 安全:帶有可選客戶端證書認證的自動TLS。· 快速:測試驗證,每秒10000寫入。· 可靠:使用Raft適當分佈。項目地址:https://github.com/etcd-io/etcd程序員
今天簡單分享下公司大規模容器應用中的數據流架構。github
咱們公司項目都是採用微服務架構設計,現服務對外訪問支持兩種模式以下:golang
使用的NodePort方式暴露應用端口至宿主機,上層經過配置nginx代理到這臺機器的端口,而後外網SLB在代理這個nginx。這種模式下帶來了一個麻煩,就是每次新上個應用都得去配置Nginx。:)redis
流量走向: SLB->Nginx>node(kube-proxy)>pod
域名分發模式,使用gorouter+haproxy做爲流量的入口,域名經過泛解析到SLB上,SLB解析到內部的haproxy,haproxy代理gorouter,gorouter內部維護了一張應用的路由表,會進行匹配。這樣咱們在平臺上一個應用建立好後,啥也不用作,就能夠訪問。
選擇兩個Node節點做爲流量節點,上面跑了confd,haproxy,gorouter容器,gorouter須要依賴nats(咱們是部署在了另外一個命名空間下)控制器使用的DaemonSet,開放了80,443端口。
其中原理就是
建立應用後若是使用域名分發模式,就會經過nats客戶端註冊一條消息到gorouter中,內容包含使用的域名+加上這應用的service IP,好比
'{"host":"10.254.90.233","port":9528,"uris":["test.a.com"]}'
confd監聽etcd中的key變化,若是有更新就同步修改haproxy配置規則並從新加載。
SLB綁定到這流量節點上的80端口(haproxy開的端口)
泛域名解析到SLB,用戶經過域名test.a.com
請求,會通過gorouter路由匹配,匹配成功進行代理,反之訪問會提示未註冊路由錯誤。
由於這架構涉及不少知識,本次就使用最簡單的例子,使用gorouter ,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 &
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/
go get -v github.com/cloudfoundry/gorouter cd $GOPATH/src/github.com/cloudfoundry/gorouter go build -o gorouter . mv gorouter $GOPATH/bin/
配置文件格式爲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 &
先啓動一個後端服務,我這裏隨便起了個服務
使用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
能夠發現使用域名用9999端口也能訪問應用,這就是gorouter的路由匹配。
目前就使用最簡單模式演示下gorouter的功能,Thanks♪(・ω・)ノ。
歡迎您關注程序員同行者訂閱號,程序員同行者是一個技術分享平臺,主要是運維自動化開發:linux、python、django、saltstack、redis、golang、docker、kubernetes、vue等經驗分享及經驗交流。
趁如今,關注咱們
牛人並不可怕,可怕的是牛人比咱們還努力!
若是您以爲不錯,請別忘了轉發、分享、點贊讓更多的人去學習, 您的舉手之勞,就是對小編最好的支持,很是感謝!