traefik简介
ArthurClear
8年前
<p>traefik(https://traefik.io/)是一款开源的反向代理与负载均衡工具。它最大的优点是能够与常见的微服务系统直接整合,可以实现自动化动态配置。目前支持Docker, Swarm, Mesos/Marathon, Mesos, Kubernetes, Consul, Etcd, Zookeeper, BoltDB, Rest API等等后端模型。</p> <p>traefik的具体模型如下: <img alt="traefik" src="https://simg.open-open.com/show/adbdd7f81f4ed1bf30fe2ee73ce072ee.png"></p> <h2>为什么选择traefik?</h2> <p>事实上在之前我对LB的选择一直更倾向于使用<a href="/misc/goto?guid=4958861780261699442">HAProxy</a>。但是选择traefik主要是有以下特点让我们决定使用:</p> <ul> <li>Golang编写,单文件部署,与系统无关,同时也提供小尺寸Docker镜像。</li> <li>支持Docker/Etcd后端,天然连接我们的微服务集群。</li> <li>内置Web UI,管理相对方便。</li> <li>自动配置ACME(Let's Encrypt)证书功能。</li> <li>性能尚可,我们也没有到压榨LB性能的阶段,易用性更重要。</li> </ul> <p>除了这些以外,traefik还有以下特点:</p> <ul> <li>Restful API支持。</li> <li>支持后端健康状态检查,根据状态自动配置。</li> <li>支持动态加载配置文件和graceful重启。</li> <li>支持WebSocket和HTTP/2。</li> </ul> <p>除了上面提到的微服务化集群支持,一些AB测试阶段也可以通过frontend的路由特性进行动态分配,当然这些对HAProxy等软件都是标准支持的。</p> <h2>traefik的配置</h2> <p>traefik支持的配置方式支持文件方式进行配置,这个也是比较常见的配置方式,我们这里简单介绍一下。</p> <p>traefik支持的toml方式进行配置,官方提供了一个<a href="/misc/goto?guid=4959676068959489333">示例的traefik.toml文件</a>用于演示配置。除此之外,后端服务一般是采用单独文件进行存储,比如演示配置中指定的rules.toml。</p> <p>具体一个例子,如果我们有两个后端,127.0.0.1:7727,127.0.0.1:7728,我们希望所有的Chrome用户都可以访问127.0.0.1:7727,其它人都访问127.0.0.1:7728,这样这个rules.toml应该如何配置呢?</p> <pre> <code># rules.toml [backends] [backends.backend1] [backends.backend1.servers.server1] url = "http://127.0.0.1:7727" [backends.backend2] [backends.backend2.servers.server1] url = "http://127.0.0.1:7728" [frontends] [frontends.frontend1] entrypoints = ["http"] backend = "backend1" [frontends.frontend1.routes.test_1] rule = "HeadersRegexp: User-Agent, Chrome" [frontends.frontend2] entrypoints = ["http"] backend = "backend2" </code></pre> <p>首先定义两个后端服务,每个后端服务可以支持多个服务单元,这里我们只有一个。前端frontends用于匹配请求落到哪个后端服务中。我们这里定义一个规则test_1,设置规则为根据HTTP请求头部正则进行分配:如果UserAgent中包含Chrome字样,则访问到127.0.0.1:7727。匹配的规则方式包含了以下几种方式:</p> <ul> <li><code>Headers</code>/<code>HeaderRegexp</code>: 头部匹配方式,分别对应按值和正则表达式两种方式。</li> <li><code>Host</code>/<code>HostRegexp</code>: 按照请求主机名进行匹配,与头部信息相似。</li> <li><code>Method</code>: 按照请求方式区分。</li> <li><code>Path</code>/<code>PathStrip</code>/<code>PathPrefix</code>/<code>PathPrefixStrip</code>: 按照路径区分后端。</li> </ul> <h2>traefik与微服务集群</h2> <p>这个有人已经写过相关的文章了,我在这里简单推荐一下: <a href="/misc/goto?guid=4959674636175228100">Microservices Bliss with Docker and Traefik </a>(<a href="http://www.open-open.com/lib/view/open1466151441928.html">中文译文</a>)。我就不做额外的描述了。</p> <p> </p> <p>来自:https://ipfans.github.io/2016/08/introduce-traefik-load-balance/</p> <p> </p>