在探索kubernetes的應(yīng)用時(shí),調(diào)研了幾個(gè)gateway,發(fā)現(xiàn)fabio支持發(fā)現(xiàn)服務(wù),自動生成路由,結(jié)合consul,registrator, 可以很容易的部署一套服務(wù),比較輕量,很容易玩起來。結(jié)構(gòu)大致為:

Start Consul
安裝 consul, 如果檢測到多個(gè) private ip, 會報(bào)錯,可以用 -advertise 指定一個(gè)ip.
// config.json , 指定 DNS port{"recursors" : [ "8.8.8.8" ],"ports" : { "dns" : 53}} sudo docker run -d --name=consul --net=host -v $PWD/config.json:/config/config.json gliderlabs/consul-server -bootstrap -advertise=172.28.128.3 curl 172.28.128.3:8500/v1/catalog/services
Start Registrator
啟動 registrator, 因?yàn)樾枰{(diào)用docker api, 所以需要把docker.sock 映射到容器內(nèi)部,如果你使用了tcp, 那么需要設(shè)置對應(yīng)的url。
如果你希望上報(bào)容器內(nèi)部ip:port, 那么需要在啟動參數(shù)中加入 -internal=true
, 這樣注冊的 Service, 都是容器內(nèi)部的ip, 而port對于同一個(gè)service而言,一般是固定的,例如 一個(gè)hello服務(wù)的兩個(gè)實(shí)例分別為 10.10.1.12:9090, 10.10.1.13:9090. 這樣的話,就需要配置一個(gè)容器跨host的網(wǎng)絡(luò)方案,例如 flannel, 等。 可以參考上一篇 Flannel with Docker
為了簡便測試,這里就不配置flannel了。-ip
是指定注冊service時(shí)候使用的ip,建議要指定,選取當(dāng)前機(jī)器的內(nèi)網(wǎng) private ip即可。我這里是 172.28.128.3
.
sudo docker run -d --name=registrator --volume=/var/run/docker.sock:/tmp/docker.sock gliderlabs/registrator:latest -ip=172.28.128.3 consul://172.28.128.3:8500
Start service
啟動服務(wù),這里需要注意的是這些環(huán)境變量,作用是 override Registrator的默認(rèn)值,見名知意,在 registrator 文檔中有詳細(xì)介紹。例如 SERVICE_9090_NAME
就是指 端口為 9090 的service 的 name。
需要注意的是 tags 這個(gè)字段,urlprefix-/foo,hello
, 這里 urlprefix-
是 gateway 的一種配置,意思為 把訪問 /foo 為前綴的請求轉(zhuǎn)發(fā)到當(dāng)前應(yīng)用來。他能夠匹配到例如 /foo/bar
, footest
, 等。如果你想加上域名的限制,可以這樣 urlprefix-mysite.com/foo
。 后面還有一個(gè) hello
, 作用是給這個(gè)service打一個(gè)標(biāo)記,可以用作查詢用。
sudo docker run -d -P -e SERVICE_9090_CHECK_HTTP=/foo/healthcheck -e SERVICE_9090_NAME=hello -e SERVICE_CHECK_INTERVAL=10s -e SERVICE_CHECK_TIMEOUT=5s -e SERVICE_TAGS=urlprefix-/foo,hello silentred/alpine-hello:v2curl 172.28.128.3:8500/v1/catalog/services//現(xiàn)在應(yīng)該能看到剛啟動的hello服務(wù)了{(lán)"consul":[],"hello":["urlprefix-mysite.com/foo","hello","urlprefix-/foo"]}
測試 DNS
sudo yum install bind-utilsdig @172.28.128.3 hello.service.consul SRV
可以設(shè)置 /etc/resolv.conf
nameserver 172.28.128.3search service.consul
這樣無論在容器內(nèi)部,還是外部都可以直接解析 sevice 名, 例如:
[[email protected] ~]$ ping helloPING hello.service.consul (172.28.128.3) 56(84) bytes of data.64 bytes from localhost.localdomain.node.dc1.consul (172.28.128.3): icmp_seq=1 ttl=64 time=0.016 ms[[email protected] ~]$ sudo docker exec -it fdde1b8247b8 bashbash-4.4# ping helloPING hello (172.28.128.6): 56 data bytes64 bytes from 172.28.128.6: seq=0 ttl=63 time=0.361 ms
Start Gateway
前端Gateway 根據(jù) consul中注冊的 service,生成對應(yīng)的路由規(guī)則,把流量分發(fā)到各個(gè)節(jié)點(diǎn)。 這個(gè)項(xiàng)目還有一個(gè) ui 管理 route信息,端口為 9998。
創(chuàng)建一個(gè)配置文件 fabio.properties
registry.consul.addr = 172.28.128.3:8500
在當(dāng)前目錄運(yùn)行