利用阿里云容器服务实现Docker微服务间的负载均衡和服务发现-阿里云开发者社区

开发者社区> csome> 正文

利用阿里云容器服务实现Docker微服务间的负载均衡和服务发现

简介: 容器服务的服务间的负载均衡和自动服务发现方案
+关注继续查看

基于容器服务实现Docker微服务间的负载均衡和自动服务发现的方法

在容器服务上可以通过acsrouting将基于域名的http的服务暴漏出去,而且能够配合健康检查自动的负载均衡和服务发现,当其中一个容器出现问题之后,routing会自动将健康检查失败的容器从后端摘除,所以能做到自动的服务发现。

然而这个是将服务暴漏到外网的,那么服务间如何通过这种方式做到自动的服务发现和的负载均衡呢?容器服务引入了负载均衡的功能,只需要使用.local结尾的域名,并在依赖的服务的external_links中增加这个域名, 依赖的服务便可以通过.local的域名访问到依赖的服务,并且能够配合健康检查做到自动的服务发现,例如:

restserver: # 模拟rest服务
  image: nginx
  labels:
    aliyun.routing.port_80: restserver.local # 使用local的域名,只有集群内的容器可以访问这个域名
    aliyun.scale: "2" # 扩展出2个实例,模拟负载均衡
    aliyun.probe.url: "http://container:80" # 定义容器的健康检查策略是http,端口是80
    aliyun.probe.initial_delay_seconds: "2" # 健康检查在容器起来之后2秒之后再检查
    aliyun.probe.timeout_seconds: "2" # 健康检查超时时间,如果两秒还没返回认为不健康
restclient: # 模拟rest服务消费者
  image: registry.aliyuncs.com/acs-sample/alpine:3.3
  command: "sh -c 'apk update; apk add curl; while true; do curl --head restserver.local; sleep 1; done'" #访问rest服务,测试负载均衡
  tty: true  
  external_links: 
    - "restserver.local" #指定link的服务的域名

然后通过如下的restclient服务的日志,我们可以看到restclient的curl的http的请求就被路由到不同的rest服务的容器上了,容器id分别是053cb232fdfbcb5405ff791650a0746ab77f26cce74fea2320075c2af55c975fb8c36abca525ac7fb02d2a9fcaba8d36641447a774ea956cd93068419f17ee3f:

internal-loadbalance_restclient_1 | 2016-07-01T06:43:49.066803626Z Server: nginx/1.11.1
internal-loadbalance_restclient_1 | 2016-07-01T06:43:49.066814507Z Date: Fri, 01 Jul 2016 06:43:49 GMT
internal-loadbalance_restclient_1 | 2016-07-01T06:43:49.066821392Z Content-Type: text/html
internal-loadbalance_restclient_1 | 2016-07-01T06:43:49.066829291Z Content-Length: 612
internal-loadbalance_restclient_1 | 2016-07-01T06:43:49.066835259Z Last-Modified: Tue, 31 May 2016 14:40:22 GMT
internal-loadbalance_restclient_1 | 2016-07-01T06:43:49.066841201Z ETag: "574da256-264"
internal-loadbalance_restclient_1 | 2016-07-01T06:43:49.066847245Z Accept-Ranges: bytes
internal-loadbalance_restclient_1 | 2016-07-01T06:43:49.066853137Z Set-Cookie: CONTAINERID=053cb232fdfbcb5405ff791650a0746ab77f26cce74fea2320075c2af55c975f; path=/

internal-loadbalance_restclient_1 | 2016-07-01T06:43:50.080502413Z HTTP/1.1 200 OK
internal-loadbalance_restclient_1 | 2016-07-01T06:43:50.082548154Z Server: nginx/1.11.1
internal-loadbalance_restclient_1 | 2016-07-01T06:43:50.082559109Z Date: Fri, 01 Jul 2016 06:43:50 GMT
internal-loadbalance_restclient_1 | 2016-07-01T06:43:50.082589299Z Content-Type: text/html
internal-loadbalance_restclient_1 | 2016-07-01T06:43:50.082596541Z Content-Length: 612
internal-loadbalance_restclient_1 | 2016-07-01T06:43:50.082602580Z Last-Modified: Tue, 31 May 2016 14:40:22 GMT
internal-loadbalance_restclient_1 | 2016-07-01T06:43:50.082608807Z ETag: "574da256-264"
internal-loadbalance_restclient_1 | 2016-07-01T06:43:50.082614780Z Accept-Ranges: bytes
internal-loadbalance_restclient_1 | 2016-07-01T06:43:50.082621152Z Set-Cookie: CONTAINERID=b8c36abca525ac7fb02d2a9fcaba8d36641447a774ea956cd93068419f17ee3f; path=/

实现的原理:

  1. 首先利用了docker 1.10之后支持在容器中做别名的方式,在依赖负载于restserver.local的服务的容器中restserver.local的域名解析到的是routing服务的地址,这样可以实现HTTP请求转发到routing的容器,并带上了HOSTrestserver.local的请求头。
  2. 然后routing会对配置了aliyun.routing_port_xxx: restserver.local的服务监听它的容器的健康状态并挂载到haproxy的后端,haproxy接收到带有restserver.local HOST头的HTTP请求就能转发到对应了容器了。
    screenshot

优势

  1. 相对于使用link或者hostname的基于DNS的方式来说,首先不同客户端对DNS缓存的处理不一致会导致服务发现的延迟性,其次DNS的方案也只有round robin,对于微服务的场景是不够用的;
  2. 而相对于其他的微服务服务发现的解决方案,提供了一个实现无关的服务发现和负载均衡机制,无需server端和client应用做任何修改即可使用;
  3. 并且服务生命周期解耦的,每个微服务可以采用一个docker-compose模板独立部署,更新。相互只是通过一个虚拟域名实现动态绑定即可。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云容器服务新建集群优化方案
前言 选择阿里云的容器服务,主要原因是公司主要业务基本都运行在阿里云上。相较自建 kubernetes 集群,容器服务的优势在于部署相对简单,与阿里云 VPC 完美兼容,网络的配置相对简单,而如果使用 kubeadmin 安装部署 kubernetes 集群,除了众所周知的科学上网问题,还有一系列的问题,包括 etcd 、 scheduler 和 controller-manager 的高可用问题等。
1274 0
阿里云容器服务--自定义路由和负载均衡策略
阿里云容器服务已经提供了默认的简单路由服务来提供http请求的路由和负载均衡,但是对某些对路由和负载均衡有定制需求的用户来说,这往往不能满足用户的需求,下面我们就来介绍阿里云容器服务推出的自定义路由镜像acs/proxy
9777 0
docker服务发现——confd
confd confd通过读取配置(支持etcd,consul,环境变量),通过go的模板,生成最终的配置文件。 安装 安装和etcd一样,非常方便,已经提供了64位的可执行程序,下载下来之后直接放到PATH中(/usr/local/bin)即可(别忘了+x)。 haproxy配置生成 c
8198 0
微服务和容器技术有风险,望君三思而后行
本文讲的是微服务和容器技术有风险,望君三思而后行,【编者的话】微服务和容器技术拥有令人兴奋的潜力,强烈建议客户开始研究这些技术。但是,这并不是说客户应该立即全面采用。上述技术领域的发展太快了,必须清晰地了解这些技术能干什么,不能干什么,才能够决定是否采用这些技术。
980 0
部署 Docker Registry 服务
本文讲的是部署 Docker Registry 服务,【编者的话】本文阐释了怎样部署私有的 Docker Registry 服务 —— 或为公司私用,或公开给其他用户使用。例如,你公司可能需要私人的 Registry 来支持持续集成(CI)。
2272 0
+关注
csome
阿里云容器服务的高级研发工程师,花名溪恒,专注于容器底层技术和网络
24
文章
34
问答
来源圈子
更多
容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级 Kubernetes 容器化应用的全生命周期管理。容器服务 Kubernetes 版简化集群的搭建和扩容等工作,整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳的 Kubernetes 容器化应用运行环境。
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载