开发者社区> 问答> 正文

Swarm mode 集群中服务发现和负载均衡的负载均衡路由

反向一觉 2017-10-30 16:01:44 1437

暴露 HTTP 协议或者 HTTPS 协议的服务
推荐使用简单路由服务(即 routing)的方式来暴露 HTTP 服务或者 HTTPS 协议的服务。如果您希望直接用SLB来暴露HTTP或HTTPS服务,可以购买新的内网或者公网负载均衡实例,并通过 aliyun.lb.port_$container_port 标签来设置路由。
[backcolor=transparent]适用场景:
7 层协议负载均衡,自定义各服务的路由,在将传统架构迁移到容器架构过程中非容器集群的服务访问容器集群中容器的服务。

暴露 TCP 协议或者 UDP 协议的服务
swarm mode 集群下支持自动配置负载均衡实例,并且一个负载均衡服务可以绑定多个服务。如果要暴露 TCP/UDP 协议的服务,负载均衡实例会自动绑定到集群机器的 9080 端口,你也可以配置好主机端口与容器端口的映射(通过 [backcolor=transparent]端口映射 和 [backcolor=transparent]容器标签 来设置)。

注意:目前如果要使用负载均衡实例,你需要购买一个新的负载均衡实例。

[backcolor=transparent]适用场景:
4 层协议的负载均衡,自定义各服务的路由,在将传统架构迁移到容器架构过程中非容器集群的服务访问容器集群中容器的服务。
[backcolor=transparent]示例:
通过自定义负载均衡的方式来将容器集群内的 Redis 服务暴露给容器集群外的 Python 应用。
  1. 首先在 负载均衡管理控制台 (单击页面右上角的 [backcolor=transparent]创建负载均衡)购买一个用于路由的负载均衡实例。本示例中选择的是按量付费公网实例,您可以根据自己的需要进行选择。

    [backcolor=transparent]注意: 由于负载均衡不支持跨地域(Region)部署,因此应选择与您所使用容器服务集群相同的地域。

  2. 返回 负载均衡管理控制台,将购买创建的负载均衡实例命名为 slb_redis_app。容器服务会通过该名称来引用这个负载均衡实例。
    单击左侧导航栏中的 [backcolor=transparent]实例管理 > 选择实例所在的地域 > 选择所需实例 > 编辑实例的名称并单击 [backcolor=transparent]确定。
  3. 选择一个已有的 swarm mode 集群,创建一个名称为 redis-demo 的应用,单击 [backcolor=transparent]使用镜像创建。
    有关如何创建应用,参见 使用镜像创建应用

    注意:由于负载均衡不支持跨地域(Region)部署,因此您所使用的容器服务集群需要和上边创建的负载均衡实例处于相同的地域。

  4. 输入 Redis 镜像名称(域名/namespace/imagename:tag),并设置 [backcolor=transparent]端口映射。
    此处 Redis 镜像只开通了容器的 80 端口,主机端口未指定。如果你想指定负载均衡实例的映射规则,请参考 安全组规则 ,前往 负载均衡控制台 设置监听规则。

    注意:容器服务开通了一些默认的安全组规则,负载均衡会自动路由到这个容器端口,负载均衡实例前端—>后端 ECS 机器的预留端口的映射是 80:9080。


  5. 您可以通过注入一个 [backcolor=transparent]容器标签 来绑定负载均衡实例。
    本示例中,标签为 aliyun.lb.port_80: tcp://slb_redis_app:80。
    标签格式如下,带 $ 的变量为占位符。
    aliyun.lb.port_$container_port:$scheme://$[slb_name|slb_id]:$front_port
    • $container_port 表示容器要暴露的端口。
    • $scheme表示负载均衡实例监听端口支持的协议,可能的值为 tcp、http、https、udp。
    • $[slb_name|slb_id] 表示可以填写负载均衡实例的名称或者 ID。
    • $front_port 表示负载均衡实例要暴露的前端端口。

  • 单击 [backcolor=transparent]创建,Redis 应用即开始创建了。Redis 应用在创建的过程中会自动将名称为 slb_redis_app 的负载均衡实例绑定到部署了 redis 镜像的后端主机,支持通过负载均衡的访问地址进行访问。

  • 当应用处于就绪状态后,登录 负载均衡管理控制台,查看名为 slb_redis_app 的负载均衡实例的状态。
    单击左侧导航栏中的 [backcolor=transparent]实例管理 > 选择实例所在的地域 > 选择所需实例 > 单击实例右侧的 [backcolor=transparent]管理 > 单击左侧导航栏中的 [backcolor=transparent]服务器 > [backcolor=transparent]后端服务器。
    由健康状态可见,负载均衡已经正确地绑定到了 Redis 的后端,并且同一个集群内的多个服务所在的后端机器都绑定到该 SLB 上。

  • 您可以在 负载均衡管理控制台 配置实例的监听规则,在本例中,配置前端口协议的端口是预留的 80 端口。在 [backcolor=transparent]实例管理页面查看负载均衡实例的 [backcolor=transparent]服务地址 ,并使用命令行工具 telnet $Server_Load_Balancer_IP_address 80 来检查端口的可访问性。

  • 为了测试以上配置,在本地运行一个简单的 Python 应用来通过 slb_redis_app 负载均衡实例访问容器集群内的 Redis。

    [backcolor=transparent]注意:Redis 主机地址是负载均衡的服务地址。

    [backcolor=transparent]app.py[backcolor=transparent]from[backcolor=transparent] flask [backcolor=transparent]import[backcolor=transparent] [backcolor=transparent]Flask
  • [backcolor=transparent]from[backcolor=transparent] redis [backcolor=transparent]import[backcolor=transparent] [backcolor=transparent]Redis
  • [backcolor=transparent]app [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent]Flask[backcolor=transparent]([backcolor=transparent]__name__[backcolor=transparent])
  • [backcolor=transparent]redis [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent]Redis[backcolor=transparent]([backcolor=transparent]host[backcolor=transparent]=[backcolor=transparent]'$Server_Load_Balancer_IP_address'[backcolor=transparent],[backcolor=transparent] port[backcolor=transparent]=[backcolor=transparent]80[backcolor=transparent])[backcolor=transparent] [backcolor=transparent]#注意
  • [backcolor=transparent]@app[backcolor=transparent].[backcolor=transparent]route[backcolor=transparent]([backcolor=transparent]'/'[backcolor=transparent])
  • [backcolor=transparent]def[backcolor=transparent] hello[backcolor=transparent]():
  • [backcolor=transparent]redis[backcolor=transparent].[backcolor=transparent]incr[backcolor=transparent]([backcolor=transparent]'hits'[backcolor=transparent])
  • [backcolor=transparent]return[backcolor=transparent] [backcolor=transparent]'Hello World! I have been seen %s times.'[backcolor=transparent] [backcolor=transparent]%[backcolor=transparent] redis[backcolor=transparent].[backcolor=transparent]get[backcolor=transparent]([backcolor=transparent]'hits'[backcolor=transparent])
  • [backcolor=transparent]if[backcolor=transparent] __name__ [backcolor=transparent]==[backcolor=transparent] [backcolor=transparent]"__main__"[backcolor=transparent]:
  • [backcolor=transparent]app[backcolor=transparent].[backcolor=transparent]run[backcolor=transparent]([backcolor=transparent]host[backcolor=transparent]=[backcolor=transparent]"0.0.0.0"[backcolor=transparent],[backcolor=transparent] debug[backcolor=transparent]=[backcolor=transparent]True[backcolor=transparent])

  • [backcolor=transparent]requirements.txt
    1. [backcolor=transparent]flask
    2. [backcolor=transparent]redis

    [backcolor=transparent]shell
    1. [backcolor=transparent]$ pip install [backcolor=transparent]-[backcolor=transparent]r requirements[backcolor=transparent].[backcolor=transparent]txt
    2. [backcolor=transparent]$ python app[backcolor=transparent].[backcolor=transparent]py
    3. [backcolor=transparent]Running[backcolor=transparent] on http[backcolor=transparent]:[backcolor=transparent]//0.0.0.0:5000/ (Press CTRL+C to quit)
    4. [backcolor=transparent]Restarting[backcolor=transparent] [backcolor=transparent]with[backcolor=transparent] stat
    5. [backcolor=transparent]Debugger[backcolor=transparent] [backcolor=transparent]is[backcolor=transparent] active[backcolor=transparent]!
    6. [backcolor=transparent]Debugger[backcolor=transparent] pin code[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]243[backcolor=transparent]-[backcolor=transparent]626[backcolor=transparent]-[backcolor=transparent]653

    访问结果如下图所示。

    弹性计算 负载均衡 NoSQL 网络协议 前端开发 Shell Redis Python 容器
    分享到
    取消 提交回答
    全部回答(0)

    集结各类场景实战经验,助你开发运维畅行无忧

    推荐文章
    相似问题
    推荐课程