博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Docker容器服务发现方案
阅读量:5116 次
发布时间:2019-06-13

本文共 5308 字,大约阅读时间需要 17 分钟。

 

一、      目的

在服务在容器中部署时,外部调用服务需要知道服务接口ip及端口号,这样导致部署时需要配置,从而增加部署的困难。本文档主要介绍如何使用ningx反向代理和consul进行自动化服务发现与部署,从而使外部访问服务只需要访问nginx代理即可解决,同时也可以解决分布式服务及大访问量负载问题。

场景说明:如有一个数据服务data-service,如果在docker集群中部署的话,ip和port都可能变化,这时线上服务必须更改配置,才能访问到data-service服务。而采用本方案的话,只需要配置好ningx负载均衡的ip与地址,数据服务可随时重新部署调整,不需要重新配置。

 

二、      概述

Nginx是常用的轻量级反向代理插件,使用Ningx可以让服务统一入口,通过Ningx配置服务路径请求转发路径,将对应的请求路由到对应的服务中处理。使用Ningx可以使后端服务部署更加灵活。

Consul包含多个组件,但是作为一个整体,为你的基础设施提供服务发现和服务配置的工具.他提供以下关键特性:

服务发现 Consul的客户端可用提供一个服务,比如 api 或者mysql ,另外一些客户端可用使用Consul去发现一个指定服务的提供者.通过DNS或者HTTP应用程序可用很容易的找到他所依赖的服务.

健康检查 Consul客户端可用提供任意数量的健康检查,指定一个服务(比如:webserver是否返回了200 OK 状态码)或者使用本地节点(比如:内存使用是否大于90%). 这个信息可由operator用来监视集群的健康.被服务发现组件用来避免将流量发送到不健康的主机.

Key/Value存储 应用程序可用根据自己的需要使用Consul的层级的Key/Value存储.比如动态配置,功能标记,协调,领袖选举等等,简单的HTTP API让他更易于使用.

多数据中心 Consul支持开箱即用的多数据中心.这意味着用户不需要担心需要建立额外的抽象层让业务扩展到多个区域.

Consul面向DevOps和应用开发者友好.是他适合现代的弹性的基础设施.

 

三、      部署方案

  i.  部署图

图1 部署图

 

 

ii.  部署过程

  1. 部署consul server 
    docker run -d --name=consul_server -p 8400:8400 -p 8500:8500 -p 8600:53/udp -h docker_server progrium/consul -server -bootstrap
  2. 部署consul registrator
    docker run -d --name=consul_registrator --net=host --volume=/var/run/docker.sock:/tmp/docker.sock gliderlabs/registrator:latest  -ip="192.168.1.60" consul://192.168.1.60:8500

    -ip:使用主机ip,因为nginx转发可能涉及到跨主机的服务请求转发,所以需要绑定主机ip;

    consul://192.168.1.60:8500:为consul server的ip和端口。

  3. 部署consul template&nginx
  •   部署容器
    docker -d run liberalman/nginx-consul-template:latest
  •   配置Nginx

    Nginx配置存储路径为:/etc/nginx/conf.d,使用的是分文件,该文件是由consul template自动更新的,不需要进行配置。

  •   配置Consul template

    配置文件存储的路径为:/etc/consul-templates/nginx.conf.ctmpl,该文件为consul template在监控consul server服务有改动时,进行配置修改,并存储到/etc/nginx/conf.d/app.conf当中。

 

示例配置:

upstream solr {  least_conn;  {
{range service "solr"}}server {
{.Address}}:{
{.Port}} max_fails=3 fail_timeout=60 weight=1; {
{else}}server 127.0.0.1:65535; # force a 502{
{end}}} upstream data_service { least_conn; {
{range service "data_service"}}server {
{.Address}}:{
{.Port}} max_fails=3 fail_timeout=60 weight=1; {
{else}}server 127.0.0.1:65535; # force a 502{
{end}}} server { listen 80 default_server; location /solr { proxy_pass http://solr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } location /data { proxy_pass http://data_service; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; }}

配置一个服务需要俩个地方进行配置修改。

upstream solr {  least_conn;  {
{range service "solr"}}server {
{.Address}}:{
{.Port}} max_fails=3 fail_timeout=60 weight=1; {
{else}}server 127.0.0.1:65535; # force a 502{
{end}}}

1)      upstream配置

    •   upstream solr:该solr为定义的服务别名,在后面server节点中需要用到;
    •   {
      {range service "solr"}}
      :其中solr为该服务在注册时到服务时的服务名称,该名称在容器启动时设置环境变量SERVICE_NAME得到,如果需指定某端口对应某服务,使用SERVICE_80_NAME,80替换为端口号即可,下图是配置了80端口的服务名为data_service

2)      server配置

  location /solr:配置路由进行转发

  proxy_pass :配置对应的路由转发到哪个upstream上。

  

location /solr {    proxy_pass http://solr;    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;    proxy_set_header Host $host;    proxy_set_header X-Real-IP $remote_addr;  }

该段代码表示将请求路径/solr的请求转发到服务名为solr的地址上。

以app.conf为例:

upstream solr {  least_conn;  server 192.168.1.60:8080 max_fails=3 fail_timeout=60 weight=1; } upstream data_service {  least_conn;  server 192.168.1.60:5000 max_fails=3 fail_timeout=60 weight=1;} server {  listen 80 default_server;   location /solr {    proxy_pass http://solr;    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;    proxy_set_header Host $host;    proxy_set_header X-Real-IP $remote_addr;  }   location /data {    proxy_pass http://data_service;    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;    proxy_set_header Host $host;    proxy_set_header X-Real-IP $remote_addr;  }}

假设nginx部署在192.168.1.112服务器上,那么访问 http://192.168.1.112/solr,该请求会被转发到http://192.168.1.60:8080/solr

      4. 启动服务

1)      如果需要忽略不注册到consul上,则在创建容器时添加环境变量SERVICE_IGNORE=true

2)      如果需要注册到consul上,则需要设置服务名,使用SERVICE_NAME=[服务名]进行设置,也可将容器对应的不同端口设置为不同的服务名,例如需要将容器暴露的端口8088设置为bussiness服务名,则使用SERVICE_8088_NAME=[服务名],即在中间加上端口号即可

3)      如果需要对服务加上标签,可使用环境变量SERVICE_TAGS进行设置,多个标签以英文逗号隔开

            iii.          采用docker compose部署

 Docker compose部署可以解决容器先后启动顺序问题    

version: '2'services:  load_balancer:    image: nginx-consul-template:latest    hostname: lb    container_name: consul-nginx-template    links:      - consul_server    depends_on:      - consul_server    ports:      - "80:80"    environment:      - SERVICE_IGNORE=true  consul_server:    image: progrium/consul     hostname: consul_server    container_name: consul_server    ports:      - "8300:8300"      - "8301:8301"      - "8302:8302"      - "8400:8400"      - "8500:8500"      - "8600:8600"    environment:      - SERVICE_IGNORE=true    command: -server -bootstrap  registrator:    image: gliderlabs/registrator:latest    hostname: registrator    container_name: consul_registrator    links:      - consul_server    depends_on:      - consul_server    volumes:      - "/var/run/docker.sock:/tmp/docker.sock"    environment:      - SERVICE_IGNORE=true    command:  -ip 192.168.1.60 consul://192.168.1.60:8500

    

四、      常见问题

  待补充...

转载于:https://www.cnblogs.com/flyingaway/p/10410913.html

你可能感兴趣的文章
HDU4405(期望DP)
查看>>
拉格朗日乘子法 那些年学过的高数
查看>>
vs code 的便捷使用
查看>>
Spring MVC @ResponseBody返回中文字符串乱码问题
查看>>
用户空间与内核空间,进程上下文与中断上下文[总结]
查看>>
JS 中的跨域请求
查看>>
JAVA开发环境搭建
查看>>
mysql基础语句
查看>>
Oracle中的rownum不能使用大于>的问题
查看>>
cassandra vs mongo (1)存储引擎
查看>>
Visual Studio基于CMake配置opencv1.0.0、opencv2.2
查看>>
遍历Map对象
查看>>
MySQL索引背后的数据结构及算法原理
查看>>
#Leetcode# 209. Minimum Size Subarray Sum
查看>>
SDN第四次作业
查看>>
DM8168 DVRRDK软件框架研究
查看>>
django迁移数据库错误
查看>>
yii 跳转页面
查看>>
洛谷 1449——后缀表达式(线性数据结构)
查看>>
Data truncation: Out of range value for column 'Quality' at row 1
查看>>