全部产品
存储与CDN 数据库 安全 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网
容器服务

自定义路由-支持 TCP 协议

更新时间:2017-06-28 18:07:16

阿里云容器服务在使用的过程中,针对 TCP 负载均衡的场景,会遇到这样的问题:如果一个应用的客户端镜像和服务端镜像均部署在同一个节点(ECS)上面,由于受负载均衡的限制,该应用的客户端不能通过负载均衡访问本机的服务端。本文档以常用的基于 TCP 协议的 redis 为例,通过自定义路由 acs/proxy 来解决这一问题。

注意:任何两个不同的服务均不能共享使用同一个负载均衡,否则会导致负载均衡后端机器被删除,服务不可用。

解法一:通过调度容器,避免客户端和服务端容器部署在同一个节点

示例应用模板(使用了 lb 标签和 swarm filter 功能):

  1. redis-master:
  2. ports:
  3. - 6379:6379/tcp
  4. image: 'redis:alpine'
  5. labels:
  6. aliyun.lb.port_6379: tcp://proxy_test:6379
  7. redis-client:
  8. image: 'redis:alpine'
  9. links:
  10. - redis-master
  11. environment:
  12. - 'affinity:aliyun.lb.port_6379!=tcp://proxy_test:6379'
  13. command: redis-cli -h 120.25.131.64
  14. stdin_open: true
  15. tty: true

注意:

  • 如果发现调度不生效,在容器服务管理控制台,单击左侧导航栏的 服务 进入服务列表页面 > 选择您需要调度的服务 > 单击 重新调度 > 在弹出的对话框中勾选 强制重新调度 > 单击 确定
  • 强制重新调度 会丢弃已有容器的 volume,请做好相应的备份迁移工作。

示例应用模板(使用了 lb 标签):

  1. redis-master:
  2. ports:
  3. - 6379:6379/tcp
  4. image: 'redis:alpine'
  5. labels:
  6. aliyun.lb.port_6379: tcp://proxy_test:6379
  7. redis-client:
  8. image: 'redis:alpine'
  9. links:
  10. - redis-master
  11. command: redis-cli -h redis-master
  12. stdin_open: true
  13. tty: true

解法三:容器集群内部客户端使用 自定义路由(基于 HAProxy)作为代理访问服务端,集群外部使用负载均衡

示例应用模板(使用了 lb 标签和 自定义路由镜像):

  1. lb:
  2. image: registry.aliyuncs.com/acs/proxy:0.5
  3. ports:
  4. - '6379:6379/tcp'
  5. restart: always
  6. labels:
  7. # addon 使得 proxy 镜像有订阅注册中心的能力,动态加载服务的路由
  8. aliyun.custom_addon: "proxy"
  9. # 每台 vm 部署一个该镜像的容器
  10. aliyun.global: "true"
  11. # 前端绑定负载均衡,使用 lb 标签
  12. aliyun.lb.port_6379: tcp://proxy_test:6379
  13. # 告诉系统,自定义路由需要等待 master 和 slave 启动之后再启动,并且对 master 和 slave 有依赖
  14. aliyun.depends: redis-master,redis-slave
  15. environment:
  16. # 支持加载路由的后端容器的范围,"*"表示整个集群,默认为应用内的服务
  17. ADDITIONAL_SERVICES: "*"
  18. EXTRA_DEFAULT_SETTINGS: "log rsyslog local0,log global,option httplog"
  19. # 配置 HAProxy 工作于 tcp 模式
  20. MODE: "tcp"
  21. links:
  22. - rsyslog:rsyslog
  23. rsyslog:
  24. image: registry.cn-hangzhou.aliyuncs.com/linhuatest/rsyslog:latest
  25. redis-master:
  26. ports:
  27. - 6379/tcp
  28. image: 'redis:alpine'
  29. labels:
  30. # 告诉自定义路由需要暴露 6379 端口
  31. aliyun.proxy.TCP_PORTS: "6379"
  32. # 告诉系统,该服务的路由需要添加到自定义路由服务中
  33. aliyun.proxy.required: "true"
  34. redis-slave:
  35. ports:
  36. - 6379/tcp
  37. image: 'redis:alpine'
  38. links:
  39. - redis-master
  40. labels:
  41. # 告诉自定义路由需要暴露 6379 端口
  42. aliyun.proxy.TCP_PORTS: "6379"
  43. # 告诉系统,该服务的路由需要添加到自定义路由服务中
  44. aliyun.proxy.required: "true"
  45. # 告诉系统,slave 需要等待 master 启动之后再启动,并且对 master 有依赖
  46. aliyun.depends: redis-master
  47. command: redis-server --slaveof redis-master 6379
  48. redis-client:
  49. image: 'redis:alpine'
  50. links:
  51. - lb:www.example.com
  52. labels:
  53. aliyun.depends: lb
  54. command: redis-cli -h www.example.com
  55. stdin_open: true
  56. tty: true

该解决方案,做到了 redis 的主从架构,同时经过 自定义路由镜像 做负载均衡,做到了一定程度的高可用。

本文导读目录