新反向代理与负载均衡工具 traefik 安装配置部署详解
  Al5uDOulaaVi 2023年11月02日 44 0


traefik

## 简介

  traefik是一款开源的反向代理与负载均衡工具。软件定位是做负载均衡器,提供好用的负载均衡服务,不要老拿它跟nginx对比。它最大的优点是能够与常见的微服务系统直接整合,可以实现自动化动态配置。           

目前支持:Docker, Swarm, Mesos/Marathon, Mesos, Kubernetes, Consul, Etcd, Zookeeper, BoltDB, Rest API等等后端模型。


#### ME为什么选择traefik?


Golang编写,单文件部署,与系统无关;    

热加载配置文件;    

内置Web UI,管理相对方便;  


功能特点:

```

It's fast

No dependency hell, single binary made with go

Rest API

Multiple backends supported: Docker, Swarm, Kubernetes, Marathon, Mesos, Consul, Etcd, and more to come

Watchers for backends, can listen for changes in backends to apply a new configuration automatically

Hot-reloading of configuration. No need to restart the process

Graceful shutdown http connections

Circuit breakers on backends

Round Robin, rebalancer load-balancers

Rest Metrics

Tiny official docker image included

SSL backends support

SSL frontend support (with SNI)

Clean AngularJS Web UI

Websocket support

HTTP/2 support

Retry request if network error

Let's Encrypt support (Automatic HTTPS with renewal)

High Availability with cluster mode

```


### 安装部署:


#### 规划服务路径


####  服务主路径

cd /etc/traefik/


#### ssl 证书存放路径

mkdir -p /etc/traefik/ssl 


#### 配置文件存放路径

mkdir -p /etc/traefik/config


#### 日志存放路径

mkdir -p /etc/traefik/log 


#### 源码包安装:

测试版本:v1.2.3


软件下载地址:https://github.com/containous/traefik/releases/tag/v1.2.3


软件下载到服务器后,加压,修改权限,探后启动服务;


chmod 755 traefik 


#### 启动服务

traefik go 语言编写,启动服务比较简单,指定一下配置文件即可,


```

./traefik -c ./config/traefik.toml 

```


#### 默认没有配置文件,需要自己根据官网参考文件进行整理,下面我根据官网信息,进行整理优化了一个主配置文件。


```

[root@trarfik-test config]# more traefik.toml 

##开启debug 模式,Default,false

debug = true


##日志级别, "DEBUG", "INFO", "WARN", "ERROR", "FATAL", "PANIC"

logLevel = "INFO"


##Traefik 服务日志,如果不配置,日志将屏幕输出;

#traefikLogsFile = "/etc/traefik/log/traefik.log"



##成功访问日志

accessLogsFile = "/etc/traefik/log/access.log"


##与后端连接保持时间,避免反复与后端服务建立连接,Default,"2s"

##ProvidersThrottleDuration = "5s"

ProvidersThrottleDuration = 5


###控制最大空闲连接数,使用net/http模块,试过设置为0 ,则不限制,如果看到'too many open files' 报错,建议修改系统层`ulimit`值

,Default: 200

maxIdleConnsPerHost = 60000


###如果设置为true,将使用后端服务SSL证书。注意:这禁用中间人***的检测只能用于后端网络安全。Default: false

#insecureSkipVerify = true


###配置默认监听端口


###配置服务默认监听端口,如果想改变监听端口,可以进行单独配置

defaultEntryPoints = ["http", "https"]

[entryPoints]

  [entryPoints.http]

  address = ":80"

  compress = true

  [entryPoints.https]

  address = ":443"

  compress = true

###ssl 证书配置

    [entryPoints.https.tls]

      `entryPoints`.`https`.`tls`.`certificates`

      certFile = "/etc/traefik/ssl/www.ptengine.cn.crt"

      keyFile = "/etc/traefik/ssl/www.ptengine.cn.key"


## 管理界面监听端口

[web]

  address = ":8800"


##设置 REST API 为只读模式

  ReadOnly = false


##启用详细信息输出,会在管理界面下方打印一些错误信息,提供参考;

  [web.statistics]

  RecentErrors = 10


## To enable Traefik to export internal metrics to Prometheus

##[web.metrics.prometheus]

###  Buckets=[0.1,0.3,1.2,5.0]


### webui基本认证配置

### 密码可以编码在MD5、SHA1和BCrypt:您可以使用htpasswd生成

### 用户可以直接在toml指定文件,或间接通过引用一个外部文件;如果两个,两个并存,外部文件内容优先


### 测试配置实例

### 用户名/密码: 测试和test2:test2码:测试:测试和test2:test2


#[web.auth.basic]

#users = ["test:$apr1$H6uskkkW$IgXLP6ewTrSuBkTrqE8wj/", "test2:$apr1$d9hr9HBB$4HxwgUir3HP4EsggP/QNo0"]


### 指定配置文件

### usersFile = "/path/to/.htpasswd"


### 配置文件扩展,可以加载监视文件内容


[file]

##不支持监听目录,监听文件名要写死

filename = "/etc/traefik/config/rules.toml"


### 监视文件变更

watch = true


##发送请求重试

[retry]

##默认只向后端请求一次,不重试,

attempts = 3

```



使用上面的配置文件启动服务,会监听3个端口, 80:http ,443:https ,8800:api ,上面的配置文件我开启了debug 模式,实际生产环境不需要。服务启动后即可访问,api 管理界面查看一下基础信息。

#### 浏览器访问地址:
​​http://localhost:8800​​


#### 使用curl 访问api 接口获取信息

```
/api/providers: GET providers
/api/providers/{provider}: GET or PUT provider
/api/providers/{provider}/backends: GET backends
/api/providers/{provider}/backends/{backend}: GET a backend
/api/providers/{provider}/backends/{backend}/servers: GET servers in a backend
/api/providers/{provider}/backends/{backend}/servers/{server}: GET a server in a backend
/api/providers/{provider}/frontends: GET frontends
/api/providers/{provider}/frontends/{frontend}: GET a frontend
/api/providers/{provider}/frontends/{frontend}/routes: GET routes in a frontend
/api/providers/{provider}/frontends/{frontend}/routes/{route}: GET a route in a frontend
```


#### 查看API接口 信息,可以显示,
```
[root@trarfik-test ~]# curl -s "http://localhost:8800/health"|jq
{
"pid": 23955,
"uptime": "4m19.415827181s",
"uptime_sec": 259.415827181,
"time": "2017-04-21 10:38:44.925762492 +0800 CST",
"unixtime": 1492742324,
"status_code_count": {},
"total_status_code_count": {
"304": 3,
"404": 2,
"429": 6
},
"count": 0,
"total_count": 11,
"total_response_time": "11.553372ms",
"total_response_time_sec": 0.011553372000000001,
"average_response_time": "1.050306ms",
"average_response_time_sec": 0.001050306,
"recent_errors": [
...............
]
}
```

#### 查看配置信息接口:
```
[root@trarfik-test ~]# curl -s "http://localhost:8800/api"|jq
{
"file": {
"backends": {
"test1": {
"servers": {
"server1": {
"url": "http://172.16.100.70:80",
"weight": 1
},
"server2": {
"url": "http://172.16.100.71:80",
"weight": 1
}
},
"circuitBreaker": {
"expression": "NetworkErrorRatio() > 0.5"
},
"loadBalancer": {
"method": "drr"
},
"maxConn": {
"amount": 10,
"extractorFunc": "request.host"
}
}
},
"frontends": {
"test1": {
"entryPoints": [
"http",
"https"
],
"backend": "test1",
"routes": {
"service1": {
"rule": "Host:test.ptmind.com;"
}
},
"passHostHeader": true,
"priority": 10
}
}
}
}
```


### DOCKER 方式启动

Docker 启动需要先准备一下配置文件,将配置文件挂载到容器内部,另外注意下,api 管理端口。

docker run -d -p 8080:8080 -p 80:80 -v $PWD/traefik.toml:/etc/traefik/traefik.toml traefik


### 域名反向代理配置实例演示

#### 监听域名

test.ptmind.com
pttest.ptmind.com


#### 后端轮训站点:
172.16.100.70:80
172.16.100.71:80

#### 安全考虑:
显示单个客户端请求链接数;
后端不稳定停止转发轮训;


配置信息如下:
```
[root@trarfik-test config]# more rules.toml
##后端配置
#[backends]
##发送请求重试
#[retry]
###默认只向后端请求一次,不重试,
attempts = 3
[backends.testptmindcom]
##后端网络错误率>0.5 停止转发;
[backends.testptmindcom.circuitbreaker]
expression = "NetworkErrorRatio() > 0.5"

##轮训方式,method=drr(加权轮训调度)default:wrr(队列轮转算法)
[backends.testptmindcom.LoadBalancer]
method = "drr"

##安全限制,单个主机连接数大于指定值,会提示“max connections reached”
[backends.testptmindcom.maxconn]
amount = 10
extractorfunc = "request.host"
##第一台后端节点
[backends.testptmindcom.servers.server1]
url = "http://172.16.100.70:80"
weight = 1

##第二台后端节点
[backends.testptmindcom.servers.server2]
url = "http://172.16.100.71:80"
weight = 1
##前端配置
[frontends]
#定义一个接入点的名字
[frontends.testptmindcom]
passHostHeader = true
priority = 10
##定义调用后端名称
backend = "testptmindcom"
##前端监听域名,可以监听多域名
[frontends.testptmindcom.routes.service]
rule = "Host:test.ptmind.com,pttest.ptmind.com;"
```


#### 验证配置信息:
[root@trarfik-test ~]# curl http://localhost:8800/api|jq
```
{
"file": {
"backends": {
"testptmindcom": {
"servers": {
"server1": {
"url": "http://172.16.100.70:80",
"weight": 1
},
"server2": {
"url": "http://172.16.100.71:80",
"weight": 1
}
},
"circuitBreaker": {
"expression": "NetworkErrorRatio() > 0.5"
},
"loadBalancer": {
"method": "drr"
},
"maxConn": {
"amount": 10,
"extractorFunc": "request.host"
}
}
},
"frontends": {
"testptmindcom": {
"entryPoints": [
"http",
"https"
],
"backend": "testptmindcom",
"routes": {
"service": {
"rule": "Host:test.ptmind.com,pttest.ptmind.com;"
}
},
"passHostHeader": true,
"priority": 10
}
}
}
}
```

### 注意:
1:traefik 可以热加载配置文件,不用每次都重启服务,在修改主配置文件选项或着修改域名监听端口时,需要重启服务;
2:一组配置内, "backends": "frontends" 名称要统一;
3:注意观察实例中的名称配置;

### 参考文档

​https://docs.traefik.io/toml/  ​

​http://docs.traefik.io/toml/#retry-configuration​


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  xqA0sOKuvLcb   2023年11月22日   38   0   0 redisDockerredisdocker
  bifOjSxj34Bv   2023年12月07日   38   0   0 nginxDockerdockernginx
  Fo7woytj0C0D   2023年12月23日   31   0   0 pythonsedidepythonidesed
Al5uDOulaaVi