使用consul、consul-template、registrator进行容器负载
部署
部署consul:
docker run -p 8400:8400 -p 8500:8500 -p 8600:53/udp -h consul --name consul progrium/consul -server -advertise 172.18.18.10 -bootstrap
部署registrator:
docker run -d -v /var/run/docker.sock:/tmp/docker.sock --name registrator -h registrator gliderlabs/registrator:latest consul://172.18.18.10:8500
启动consul-template
consul-template 模板内容如下:
consul-template cat tmpl/app.conf
{{range services}}
upstream {{.Name}} {
least_conn;{{range service .Name}}
server {{.Address}}:{{.Port}};{{end}}
}
{{end}}
server {
listen 80 default_server;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
location / {
proxy_pass http://cart/cart/;
}
location /cart {
proxy_pass http://cart/cart;
}
{{range services}}
location /api/{{.Name}} {
proxy_read_timeout 180;
proxy_pass http://{{.Name}}/{{.Name}};
}
{{end}}
}
启动:
consul-template -consul=172.18.18.10:8500 -template="/Users/goyoo/workspace/consul-template/tmpl/app.conf:/Users/goyoo/workspace/consul-template/conf/app.conf"
生成nginx配置如下:
consul-template cat conf/app.conf
upstream alpine-nginx-1.8.0-80 {
least_conn;
}
upstream consul {
least_conn;
server 172.18.18.10:8300;
}
upstream consul-53 {
least_conn;
server 172.17.0.4:8600;
}
upstream consul-8400 {
least_conn;
server 172.17.0.4:8400;
}
upstream consul-8500 {
least_conn;
server 172.17.0.4:8500;
}
server {
listen 80 default_server;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
location / {
proxy_pass http://cart/cart/;
}
location /cart {
proxy_pass http://cart/cart;
}
location /api/alpine-nginx-1.8.0-80 {
proxy_read_timeout 180;
proxy_pass http://alpine-nginx-1.8.0-80/alpine-nginx-1.8.0-80;
}
location /api/consul {
proxy_read_timeout 180;
proxy_pass http://consul/consul;
}
location /api/consul-53 {
proxy_read_timeout 180;
proxy_pass http://consul-53/consul-53;
}
location /api/consul-8400 {
proxy_read_timeout 180;
proxy_pass http://consul-8400/consul-8400;
}
location /api/consul-8500 {
proxy_read_timeout 180;
proxy_pass http://consul-8500/consul-8500;
}
}
总结
现象
- registrator 获取当前机器上所有容器状况,并注册到consul 的service服务中(不是key/value)
- consul-template 读取consul 的service并渲染模块生成配置文件。
实际情况分析
- 我们现在的集群在实际使用过程中会有很多的辅助功能的容器,比如zabbix-agent 监控使用 etcd、k8s中dns cephfs挂载容器等。这些都是不需要暴露出去的。
- 统一注册后不方便针对某一个app服务的容器状态以及负载状态的查询与配置。
总结
不适合当前业务