在Rancher上使用Traefik構建主動負載均衡

      簡述      

本文原文做者:Raul Sanchez Liebanaon,是DevOps微服務架構師,專門從事敏捷,看板,微服務,CI/CD,開源以及其餘新技術的應用。前端

 

這篇文章的重點是Traefik「主動模式」負載均衡技術結合Docker標籤和Rancher元數據,以實現自動配置和提供服務接入。git

 

 

負載均衡/代理是使您夠訪問服務後臺成爲可能的軟件程序。github

在微服務架構裏,它們有一個額外的挑戰那就是管理高活力。它們必須以動態和自動化的方式察覺前端和後端的變化,從而更新和從新裝載它們的配置。它們還須要與服務發現系統通信。golang

 

元數據服務

在Rancher中,咱們有一個傑出的內置服務發現系統被稱爲Rancher的元數據服務。在Rancher的元數據服務中,咱們能夠從本機服務或者從其餘堆棧或服務獲取信息。Rancher的元數據裏有最新的有關什麼服務在系統上運行而且位於何處信息。web

想爲你的服務生成動態配置文件,你須要與Rancher的元數據服務通信。要作到這一點,可使用confd與具體的模板。docker

想了解更多細節,我建議你讀Bill Maxwell的這篇文章:http://rancher.com/introducing-rancher-metadata-service-for-docker/。編程

 

負載均衡

Rancher提供了一個內建的負載均衡服務。它是一個容器化的HAProxy,並且它在對外發布你的服務端口很是有用。後端

這個負載均衡能夠在兩種不一樣的模式下工做。這意味着,它能夠在兩種不一樣的OSI層工做,特別是4層和7層。但是,這意味着什麼呢?服務器

第4層架構

-------------------------------------------------------------------------------------------------------------

您能夠發佈和提供TCP端口的訪問。你使用這種有點原始的模式給你的服務後端發包,但沒法修改端口。在這種模式下,你不能共享端口。這意味着你須要爲每一個服務發佈不一樣的端口。

 

 

第7層

-------------------------------------------------------------------------------------------------------------

在這一層,你是在應用層面工做,並且只能發佈HTTP(S)端口。在這種模式下,負載均衡能夠查看和修改HTTP數據包。你能夠檢查,添加或修改HTTP頭文件。在這種模式下,你能夠共享相同的發佈端口給不一樣的服務。顯然,負載均衡必須知道如何區分傳入數據包,以便將它們轉發給正確的服務。要作到這一點,你須要定義一個用於檢查傳入HTTP數據包的HTTP頭文件過濾器。一旦匹配成功,請求將會發送給正確的服務。

 

 

在這兩種模式下,負載均衡都是以「被動模式」工做。這意味着,一旦你部署一個新的服務,你必須修改負載均衡配置並從新添加服務。顯然,若是你從負載均衡中刪除一個服務,它的配置也會在負載均衡配置中被刪除。

 

 

主動負載均衡

爲了給用戶提供一個更好的選擇,咱們已經建立了一個基於Docker標籤和Rancher元數據服務的「主動模式」負載均衡。負載均衡掃描Rancher元數據,並能自行配置,併爲已配置特定標籤的服務提供接入。

要得到這個功能,咱們使用Traefik。Traefik是一個可編程的開源負載均衡,用golang編寫。它可與Zookeeper,etcd,Consul等不一樣的服務發現系統集成。咱們作了與Rancher元數據的初步集成。Traefik有一個真正意義上的零宕機時間重載,並實現定義斷路器規則的可能性。要獲取更多信息,請訪問https://traefik.io/。

要使用Traefik,從社區Catalog中選擇它並啓動。使用默認參數,Traefik將在標籤traefik_lb=true的全部主機上運行。暴露用於HTTP服務的主機端口8080以及做爲Traefik管理的端口8000。它每60秒刷新配置一次。讓你部署服務時覆蓋全部參數成爲可能。

 

一旦服務被部署,您能夠訪問管理界面http://host-address:9000

您須要在服務端定義如下標籤來使您的的服務自動暴露給Traefik:

traefik.enable=<true|false>

traefik.domain=<domain name to route rule>

traefik.port=<port to expose throught traefik>

 

在你的服務中定義一個健康檢查是強制性的要求,由於只有健康的後端才能添加到Traefik。若是你在你的服務中定義traefik.enable=true的標籤,可是服務不具備健康檢查,前端雖然能夠被添加到Traefik,然後端只會爲空列表。

 

測試

咱們已經寫了一個基本的Web測試服務,使其可以檢查Traefik服務,並以快速的方式進行測試。這項服務在8080端口公開Web服務。

你能夠導入如下docker-compose.yml和rancher-compose.yml來建立一個新的Stack。

 

docker-compose.yml

web-test:

log_driver:''

labels:

traefik.domain:local

traefik.port:'8080'

traefik.enable:'true'

io.rancher.container.hostname_override:container_name

tty:true

log_opt:{}

image:rawmind/web-test

rancher-compose.yml

web-test:

scale:3

health_check:

port:8080

interval:2000

initializing_timeout:60000

unhealthy_threshold:3

strategy:recreate

response_timeout:2000

request_line:GET"/""HTTP/1.0"

healthy_threshold:2

 

它將Traefik標籤添加到它的定義中。在部署後,其後端將會是「健康」的狀態。他們將被自動添加到Traefik服務中如下方式暴露:

 

http://${service_name}.${stack_name}.${traefik.domain}:${http_port}.

你能夠在Traefik管理界面查看http://host-address:8000

 

若是你切換web-test服務開啓或關閉,你能夠在Traefik管理界面中看到後端服務器將自動添加或刪除。可是,你必須等待刷新間隔時間以前的配置被刷新。

要訪問web-test服務,添加一個別名到DNS,web-test.proxy-test.local指向你的主機地址,而後轉到http://web-test.proxy-test.local:8080.

當你請求的web-test服務,它會顯示全部的頭文件信息,以下圖所示:

http://web-test.proxy-test.local:8080

一旦你刷新頁面,你應該能夠看到Real_server正在發生變化而且負載均衡開始工做。

小提示:爲了不設置DNS紀錄,你可使用curl測試服務,添加主機頭文件。

curl –H Host:web-test.proxy-test.local http://host-address:8080

 

暴露你的服務

給Traefik暴露你的服務,給它們的添加如下標籤:

traefik.enable=true

traefik.domain=<yourdomain>

traefik.port=<service_port>

這個服務${traefik.port}將會暴露爲:

http://${service_name}.${stack_name}.${traefik.domain}:${http_port}

小提示:若是你刪除Traefik Stack,當你再次部署它,你不須要從新配置它,它會自動經過掃描服務標籤進行配置。

 

參考

https://github.com/rawmind0/alpine-traefik

https://github.com/rawmind0/rancher-traefik

https://github.com/rawmind0/web-test

 

Docker企業落地交流羣

一塊兒分享容器落地經驗

長按二維碼關注

 

相關文章
相關標籤/搜索