在容器服务上可以通过
简单路由(支持 HTTP/HTTPS) 将基于域名的 HTTP 服务暴露出去,而且能够配合健康检查自动的负载均衡和服务发现,当其中一个容器出现问题之后,routing 会自动将健康检查失败的容器从后端摘除,所以能做到自动的服务发现。然而这个是将服务暴露到外网环境。
那么集群内服务间如何通过这种方式做到自动的服务发现和负载均衡呢?阿里云容器服务中的 routing 容器具备负载均衡的功能,您只需要使用以 .local 结尾的域名,让容器仅能被集群内的其他容器所访问,然后配合 external_links 标签,从而实现集群内服务间发现和负载均衡。
实现原理
restserver: # 模拟 rest 服务
image: nginx
labels:
aliyun.routing.port_80: restserver.local # 使用 local 的域名,只有集群内的容器可以访问这个域名
aliyun.scale: "2" # 扩展出两个实例,模拟负载均衡
aliyun.probe.url: "http://container:80" # 定义容器的健康检查策略是 http,端口是 80
aliyun.probe.initial_delay_seconds: "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 的服务的域名。请确保您设置了 external_links,否则访问会失败。
然后,通过如下的 restclient 服务的日志,您可以看到 restclient 的 curl 的 http 请求被路由到不同 rest 服务的容器上,容器 ID 分别为 053cb232fdfbcb5405ff791650a0746ab77f26cce74fea2320075c2af55c975f 和 b8c36abca525ac7fb02d2a9fcaba8d36641447a774ea956cd93068419f17ee3f。
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=/
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。