本文原文做者: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企業落地交流羣
一塊兒分享容器落地經驗
長按二維碼關注