Fabio 体验笔记
fabio 是一个快速、现代、zero-conf 负载均衡 HTTP(S) 路由器,用于部署 consul 管理的微服务。
为Docker配置DNS
cat <<EOF>/etc/docker/daemon.json
{
"registry-mirrors": ["https://x84nz4y4.mirror.aliyuncs.com"],
"dns": ["172.17.0.1", "8.8.8.8"]
}
EOF
启动 consul 服务
这里为了简单体验,使用单实例,生产上应使用consul集群(3个节点或以上)
docker run -d --name=dev-consul \
-e CONSUL_BIND_INTERFACE=eth0 \
consul:latest
启动 registrator 服务
docker run -d -v /var/run/docker.sock:/tmp/docker.sock \
--net=host gliderlabs/registrator \
-internal consul://localhost:8500
配置并启用 Fabio 服务
- 创建
fabio.properties
文件,并写入下列内容(IP根据实际更改)
registry.consul.addr = <consul ip>:8500
- 结合配置文件,启动fabio docker实例
docker run -d -p 80:9999 -p 9998:9998 -v $PWD/fabio.properties:/etc/fabio/fabio.properties fabiolb/fabio
- 9998 为 fabio 的状态页面端口
- 9999 为 fabio 前端入口端口,将其映射到80端口
使用nginx模拟 backend
使用环境变量传递到registrator
并存储到 consul
docker run -d -e "SERVICE_NAME=test" \
-e SERVICE_TAGS=urlprefix-test.com/ \
-e "SERVICE_ID=test1" \
-e "SERVICE_CHECK_HTTP=true" \
-e "SERVICE_CHECK_HTTP=/" \
-e "SERVICE_CHECK_INTERVAL=10s" \
-e "SERVICE_CHECK_TIMEOUT=5s" \
--name=test1 nginx:alpine
- SERVICE_TAGS=urlprefix-test.com/ 约定使用test.com访问该应用
- SERVICE_ID=test1 ID 号为test1
- SERVICE_CHECK_HTTP=true 启用健康检查
- SERVICE_CHECK_HTTP=/ 检查的URL为根目录
访问测试
查看consul中的数据
# curl -s localhost:8500/v1/catalog/service/test | jq '.'
[
{
"Node": "myconsul",
"Address": "172.17.0.2",
"ServiceID": "test1",
"ServiceName": "test",
"ServiceTags": [
"urlprefix-test.com/"
],
"ServiceAddress": "172.17.0.7",
"ServicePort": 80,
"ServiceEnableTagOverride": false,
"CreateIndex": 257,
"ModifyIndex": 258
}
]
查看 fabio API数据
# curl -s http://192.168.50.11:9998/api/routes | jq '.'
[
{
"service": "test",
"host": "test.com",
"path": "/",
"src": "test.com/",
"dst": "http://172.17.0.7:80/",
"opts": "",
"weight": 1,
"cmd": "route add",
"rate1": 0,
"pct99": 0
}
]
访问 fabio 的9998 端口
使用 curl 模拟客户端请求
# curl -I -H "Host: test.com" http://192.168.50.11
HTTP/1.1 200 OK
Accept-Ranges: bytes
Content-Length: 612
Content-Type: text/html
Date: Sun, 30 Dec 2018 05:53:25 GMT
Etag: "5c240d0d-264"
Last-Modified: Wed, 26 Dec 2018 23:21:49 GMT
Server: nginx/1.15.8
其它笔记
配置30x跳转
比如 demo.com/css
目录301 跳转到https://css.demo.com
往consul 的 fabio/config 里面添加如下内容即可
route add svc demo.com/css https://css.demo.com/ opts "redirect=301"
授权白名单访问
容器启用时在TAGS 中加入 allow=WhiteList
-e "SERVICE_TAGS=urlprefix-demo.com/ allow=ip:192.168.11.235/32" \
或者直接操作consul 数据
route add svc demo.com/css https://css.demo.com/ opts "allow=ip:192.168.11.235/32"
后端为非标端口
后端服务非80或者443端口,直接docker启动标签中添加即可
docker run -d --name=dev-consul \
-e CONSUL_BIND_INTERFACE=eth0 \
-e "SERVICE_TAGS=urlprefix-demo.com/" \
-e SERVICE_8500_CHECK_HTTP=/ \
-e SERVICE_8500_NAME=foo \
-e SERVICE_CHECK_INTERVAL=10s \
-e SERVICE_CHECK_TIMEOUT=5s \
consul:latest
网站为HTTPS
cat ~/fabio/fabio.properties
proxy.addr=:443;/etc/fabio/ssl/mycert.pem;/etc/fabio/ssl/mykey.key
docker run -d -p 443:443 -p 9998:9998 -v $PWD/fabio:/etc/fabio fabiolb/fabio
后端为HTTPS
直接在SERVICE_TAGS
中加入 proto=https
即可
docker run -d --name=dev-consul \
-e CONSUL_BIND_INTERFACE=eth0 \
-e "SERVICE_TAGS=urlprefix-demo.com/ proto=https,tlsskipverify=true" \
-e SERVICE_8500_CHECK_HTTP=/ \
-e SERVICE_8500_NAME=foo \
-e SERVICE_CHECK_INTERVAL=10s \
-e SERVICE_CHECK_TIMEOUT=5s \
consul:latest