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

资料引用