UDN-企业互联网技术人气社区

板块导航

浏览  : 3031
回复  : 0

[技术交流] Docker完整解决方案实践(下)

[复制链接]
芭芭拉的头像 楼主
发表于 2016-7-18 10:31:15 | 显示全部楼层 |阅读模式
  六、流量接入层配置

  这边主要采用的是nginx+consul-template方案,我觉得nginx做代理,效率比较好,再说nginx的7层规则写起来也比较方便。当然也可以用别的方法,例如:dns、haproxy等。

  consul-template主要是从consul自动发现service的主机+端口信息,这样一组服务的容器在减缩时,可以做到自动伸缩,不需要人为干预。

  6.1、nginx服务

  nginx服务可以选择原生的,也可以选择阿里的tenginx

  也可以选择sina开源的一个nginx模块,不过用这个不需要consul-tempate支持并且是即时生效的,并且不需要reload nginx服务,所以没有性能损耗。https://github.com/weibocom/nginx-upsync-module

  6.2、consul-template

  nginx模块文件

  vim www.test.com.ctmpl
  1. upstream www.test.com {
  2. {{range service "nginx-test-80"}}
  3. server {{.Address}}:{{.Port}};
  4. server {{.Address}}:{{.Port}} weight=10 max_fails=3 fail_timeout=10s;

  5. {{end}}
  6. keepalive 65;
  7. check interval=3000 rise=2 fall=5 timeout=3000 type=http

  8. check_http_send "GET /health HTTP/1.1\r\n\r\n";

  9. check_http_expect_alive http_2xx http_3xx;

  10. }

  11. server {
  12. listen 80;
  13. server_name www.test.com;

  14. location / {
  15. proxy_pass http://www.test.com;
  16. proxy_redirect off;
  17. proxy_set_header Host $host;
  18. proxy_set_header X-Real-IP $remote_addr;
  19. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  20. proxy_next_upstream error timeout invalid_header http_500 http_502 h
  21. ttp_503 http_504;
  22. proxy_max_temp_file_size 0;
  23. proxy_connect_timeout 90;
  24. proxy_send_timeout 90;
  25. proxy_read_timeout 90;
  26. proxy_buffer_size 4k;
  27. proxy_buffers 4 32k;
  28. proxy_busy_buffers_size 64k;
  29. proxy_temp_file_write_size 64k;
  30. }

  31. error_page 500 502 503 504 /50x.html;
  32. location = /50x.html {
  33. root html;
  34. }
复制代码

  }

  #consu-template配置文件
  1. consul = "10.2.0.80:8500"
  2. log_level = "warn"
复制代码

  token = "f37ab43b-4d2de-aa283-6effsdf507a9eb71d1b” //如果consul有配token,需要加上token,不然是取不到数据。
  1. template {
  2. source = "/opt/test/consultemplate/www.test.com.ctmpl"
  3. destination = "/opt/test/nginx/conf/conf.d/www.test.com.conf"
  4. command = “/opt/test/nginx/sbin/nginx -t && /opt/test/nginx/sbin/nginx -s
  5. reload"
  6. }
复制代码

  启动consul-template服务
  1. ./consul-template --config check_nginx.conf
复制代码

  启动结果:
  1. 2016/07/05 14:50:56 [DEBUG] (config) loading configs from "check_nginx.conf"
  2. the configuration file /opt/test/nginx/conf/nginx.conf syntax is ok
  3. configuration file /opt/test/nginx/conf/nginx.conf test is successful
复制代码

  在本机绑定一下hosts,在浏览器中输入www.test.com,肯定有惊喜 ^-^!

  七、容器资源监控

  我们通过三个组件(cadvisor influxdb grafana)来搭建一个监控容器主机系统的实时信息。这里面有一个重要的问题,需要大家明确一个问题,因为容器有一个很重要的特性就是随时启动运行,随时停止销毁,所以我们的监控也需要支持,能够随着容器的启动运行,并自动加入监控,当销毁时,监控能够自动删除。这样就不需要人工过多的干预。

  这边介绍下几个组件的功能,cadvisor谷歌公司自己用来监控他们基础设施的一款工具,这个工具厉害之处不仅能监控Docker容器的实时信息,而且还能将你的cadvisor这容器所在的主机的系统的实时信息!,但是由于cadvisor只是能监控到实时的信息而不能保存,所以我们要使用influxdb将这些实时监控到的信息存放起来,以备以后需要。而grafana这个就是将influxdb存放的信息以图表的形式,非常清晰,完美地展现出来!

  7.1、部署influxdb

  具体可以参考https://github.com/tutumcloud/influxdb
  1. Docker pull tutum/influxdb:0.10
  2. Docker run -d \
  3. -p 8083:8083 \
  4. -p 8086:8086 \
  5. --expose 8090 \
  6. --expose 8099 \
  7. -v /opt/test/data/influxdb:/data \
  8. --name influxsrv tutum/influxdb:0.10
复制代码

  参数解释:

  • -p 8083:8083 映射8083端口,是为能够看到influxdb的web管理平台.
  • -p 8086:8086 映射8086端口,数据API接口,到时候cadvisor会访问这个接口.
  • -v /opt/test/data/influxdb:/data 映射数据目录到宿主机上,这样容器重启保证数据不会丢失

  Docker ps
  1. b2da5c842a06 tutum/influxdb:0.10 "/run.sh" 5 days ago Up 23 hours 0.0.0.0:8083->8083/tcp, 8090/tcp, 0.0.0.0:8086->8086/tcp, 8099/tcp influxsrv
复制代码

  新建数据酷
  1. Docker exec -ti influxsrv /bin/bash
  2. root@b2da5c842a06:/# influx
  3. Visit https://enterprise.influxdata.com to register for updates, InfluxDB server management, and monitoring.
  4. Connected to http://localhost:8086 version 0.10.0
  5. InfluxDB shell 0.10.0
复制代码
  1. CREATE DATABASE cadvisor
  2. SHOW DATABASES
  3. name: databases

  4. name
  5. _internal
  6. cadvisor
  7. use cadvisor
  8. CREATE USER "root" WITH PASSWORD 'root' WITH ALL PRIVILEGES
  9. show users
  10. user admin
  11. root true
  12. exit
复制代码

  7.2、部署cadvisor服务

  具体可以参考https://github.com/google/cadvisor
  1. Docker run -d \
  2. --volume=/:/rootfs:ro \
  3. --volume=/var/run:/var/run:rw \
  4. --volume=/sys:/sys:ro \
  5. --volume=/var/lib/Docker/:/var/lib/Docker:ro \
  6. --publish=8080:8080 \
  7. --detach=true \
  8. --link influxsrv:influxsrv \
  9. --name=cadvisor google/cadvisor:latest \
  10. -Docker_only \
  11. -h $HOSTNAME
  12. -storage_driver=influxdb \
  13. -storage_driver_db=cadvisor \
  14. -storage_driver_host=10.2.0.134:8086
复制代码

  启动容器后,用浏览器就可以看到本机所有容器的时时监控信息了。

  http://10.2.2.134:8080

  参数解释:

  别的参数我就不解释了,大家可以看看文档,我就说一个最重要的。

  • -Docker_only 这个参数主要是说明现在cadvisor容器只监控容器,如果不加会把Docker相关一堆没有用的信息都加进来,对后续添加grafana时带来很多的麻烦.
  • -h $HOSTNAME 这个参数很重要,一定要加上,不然后面的grafana取监控主机时,只能看到的是一串数字,很不方便,加上这个参数,就可以直接看到主机名了,一目了然。

  7.3、部署grafana服务
  1. Docker run -d \
  2. -p 3000:3000 \
  3. -e INFLUXDB_HOST=10.2.0.134 \
  4. -e INFLUXDB_PORT=8086 \
  5. -e INFLUXDB_NAME=cadvisor \
  6. -e INFLUXDB_USER=root \
  7. -e INFLUXDB_PASS=root \
  8. --link influxsrv:influxsrv \
  9. --name grafana grafana/grafana
复制代码

  这个参数就不解释了,比较明显易懂。

  还有具体的使用方法,可以参考官方网站,如果有什么不懂可以参考官方的例子很方便的。http://play.grafana.org/

  7.4、监控实例

  这是一台宿主机的所有容器的资源监控,它会随着容器的不停更替而变化,不需要人为干预。加粗文字
2.png

  八、日志收集

  我这边用的是graylog,为什么要用这个日志的方案,有兴趣的朋友可以看一下这篇文章(https://testerhome.com/topics/3026),当然有开发实力的朋友,很多功能是可以自已去开发解决的。但是如果开源的产品也符合我们的需求,就不需要再重复的造轮子了。还有一点,这个日志的方案也是Docker官方推荐的,所以我想应该也是不错的。(https://docs.Docker.com/engine ... view/)

  8.1、graylog部署方法

  graylog安装方法,我这边用测试用的是官方的Docker-compose的方法,如果实际生产环境使用,如果量比较大的就需要采用分布式部署了。

  http://docs.graylog.org/en/2.0 ... .html

  这套日志系统唯一的缺点,我觉得是在mongodb上,所以如果量比较大的话,这个可能是一个瓶颈,当然mongodb的使用方案,现在也比较成熟,比如多个shard.还有公司如果有钱,用ssd盘来解决,问题也不大。这些都是需要随着业务的发展,去不断优化的。
  1. some-mongo:
  2. image: "mongo:3"
  3. volumes:
  4. - /opt/graylog/data/mongo:/data/db
  5. some-elasticsearch:
  6. image: "elasticsearch:latest"
  7. command: "elasticsearch -Des.cluster.name='graylog'"
  8. volumes:
  9. - /opt/graylog/data/elasticsearch:/usr/share/elasticsearch/data
  10. graylog:
  11. image: graylog2/server
  12. volumes:
  13. - /opt/graylog/data/journal:/usr/share/graylog/data/journal
  14. - /opt/graylog/config:/usr/share/graylog/data/config
  15. environment:
  16. GRAYLOG_PASSWORD_SECRET: somepasswordpepper
  17. GRAYLOG_ROOT_PASSWORD_SHA2: 8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92
  18. GRAYLOG_REST_TRANSPORT_URI: http://10.2.0.134:12900

  19. links:
  20. - some-mongo:mongo
  21. - some-elasticsearch:elasticsearch
  22. ports:
  23. - "9000:9000"
  24. - "12900:12900"
  25. - "12201/udp:12201/udp"
  26. - "1514/udp:1514/udp"
复制代码

  8.2、启动graplog服务
  1. Docker-compose up -d
复制代码

  8.3、http://10.2.0.134:9000/

  用户名:admin

  密码:graylog

  8.4、设置接收器

  我这里用的是Gelf UDP的input方法来接收日志,用udp协议的好处是,当日志系统性能有问题或者别的故障时,不会影响生产服务。
  1. system==>input==>select input ===>GELF UDP
复制代码

2.png

2.png

  设置好后就可以接收日志了。

  8.5、设置容器的日志收集方法

  大家都知道我们的每个容器产生的日志会自动保存在/var/lib/Docker/containers/7e7cb74f63xxxxxxxxx/7e7cb74f63xxxxxxxxx.json.log

  所以我们收集日志的方法很多:

  a、可以在本地启动一个收集日志的工具,时时监听这个日志文件

  b、可以用Docker原生自带的log-driver方法来收集日志,我是比较偏向这个,因为日志存本地,对于请求量比较大的业务,IO是一项极大的挑战。

  注:如果想把Docker的应用日志输出到外面,也就是说用Docker logs -f可以看到,需要我们在编写Dockerfile时把日志做一下处理。

  例如:nginx服务 参考官方https://www.nginx.com/blog/dep ... cker/

  #Dockerfile
  1. FROM centos:centos7

  2. MAINTAINER NGINX Docker Maintainers "Docker-maint@nginx.com"

  3. RUN yum install -y ca-certificates

  4. Download certificate and key from the customer portal (https://cs.nginx.com)

  5. and copy to the build context

  6. ADD nginx-repo.crt /etc/ssl/nginx/
  7. ADD nginx-repo.key /etc/ssl/nginx/

  8. Get other files required for installation

  9. RUN wget -q -O /etc/yum.repos.d/nginx-plus-7.repo https://cs.nginx.com/static/fi ... .repo

  10. Install NGINX Plus

  11. RUN yum install -y nginx-plus

  12. forward request logs to Docker log collector

  13. RUN ln -sf /dev/stdout /var/log/nginx/access.log
  14. RUN ln -sf /dev/stderr /var/log/nginx/error.log

  15. EXPOSE 80 443

  16. CMD ["nginx", "-g", "daemon off;"]
复制代码

  进入容器里看到的
  1. access.log -> /dev/stdout
  2. error.log -> /dev/stderr
复制代码

  如果容器里的应用服务用supervisord来管理,那么需要把supervisord的服务配置文件做以下设置,应用的日志才会对外输出。

  #nginx.ini
  1. [program:nginx]
  2. command=/usr/sbin/nginx -g 'daemon off;'
  3. autostart = true
  4. startsecs = 3
  5. autorestart = true
  6. startretries = 3
  7. user = root
  8. redirect_stderr = false
复制代码

  这个是为了把日志输出到Docker的容器日志文件上,必需加上这个设置
  1. stdout_logfile_maxbytes=0
  2. stdout_logfile=/dev/stdout
  3. stderr_logfile_maxbytes=0
复制代码

  stderr_logfile=/dev/stderr
  1. #设置单个Docker的日志收集方法
  2. Docker run -d -p 80 \
  3. -h $HOSTNAME \
  4. --name www.test-01 \
  5. --log-driver=gelf \
  6. --log-opt gelf-address=udp://10.2.0.134:12201 \
  7. registry.intra.test.com:5000/ops/nginx-test:v0.1
复制代码

  全局设置Docker的日志转发

  这样的好处是,不用每次创建容器时,都需要指定日志的接收器的地址。
  1. /etc/sysconfig/Docker

  2. #
  3. Other arguments to pass to the Docker daemon process

  4. These will be parsed by the sysv initscript and appended

  5. to the arguments list passed to Docker -d

  6. other_args="-g /opt/Docker -H tcp://127.0.0.1:2375 -H unix:///var/run/Docker.sock --insecure-registry registry.intra.test.

  7. com:5000 "

  8. other_args="-g /opt/Docker -H tcp://127.0.0.1:2375 -H unix:///var/run/Docker.sock --log-driver=gelf --log-opt gelf-address=udp://10.2.0.134:12201 --insecure-registry registry.intra.test.
  9. com:5000 "

  10. Resolves: rhbz#1176302 (Docker issue #407)

  11. Docker_NOWARN_KERNEL_VERSION=1
  12. Location used for temporary files, such as those created by

  13. # Docker load and build operations. Default is /var/lib/Docker/tmp

  14. # Can be overriden by setting the following environment variable.

  15. # Docker_TMPDIR=/var/tmp
复制代码

  Docker_TMPDIR=/opt/test/Docker/tmp

  8.6、监控实例

  这个日志面板生成功能非常方便,简单易用,随时用随时生成。还有最重要的这套日志系统,还可以设置数据流的报警功能,需要大家自已去研究使用。并且有完善的用户管理体系。
2.png

原文作者:佚名 来源:http://dockone.io/article/1545


  Docker完整解决方案实践(上)

相关帖子

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们
联系我们
  • 电话:010-86393388
  • 邮件:udn@yonyou.com
  • 地址:北京市海淀区北清路68号
移动客户端下载
关注我们
  • 微信公众号:yonyouudn
  • 扫描右侧二维码关注我们
  • 专注企业互联网的技术社区
版权所有:用友网络科技股份有限公司82041 京ICP备05007539号-11 京公网网备安1101080209224 Powered by Discuz!
快速回复 返回列表 返回顶部