在容器服务中如何暴露服务到公网并配置负载均衡

简介: 在容器服务中,暴露应用提供的服务到公网有两种选择,一种是通过系统默认的路由应用acsrouting暴露服务到公网,适用的场景是:普通且简单的7层协议负载均衡,web页面访问路由服务,容器集群内服务之间7层协议互相访问的通信代理和负载均衡。另外一种是通过自定义SLB方式暴露服务,这种方式是属于较高级的
+关注继续查看

在容器服务中,暴露应用提供的服务到公网有两种选择,一种是通过系统默认的路由应用acsrouting暴露服务到公网,适用的场景是:普通且简单的7层协议负载均衡,web页面访问路由服务,容器集群内服务之间7层协议互相访问的通信代理和负载均衡。另外一种是通过自定义SLB方式暴露服务,这种方式是属于较高级的功能,适用的场景是:4层协议负载均衡,自定义各服务的路由,在将传统架构迁移到容器架构过程中非容器集群的服务访问容器集群中容器的服务。下面分别以举例的方式介绍这些暴露服务到公网并配置负载均衡的能力。

如何暴露服务到Internet

通过系统默认acsrouting路由应用暴露服务

暴露HTTP服务

  • 适用场景:普通且简单的7层协议负载均衡,web路由服务,容器集群内服务之间7层协议互相访问的通信代理和负载均衡
  • 如下图所示,当我们新建一个集群的时候,我们会默认给这个集群分配一个slb实例,这个slb实例会将集群中的所有节点加入作为后端,同时前端会暴露80端口,后端所有节点的机器也会暴露80端口,我们会启动一个路由应用,应用的名称叫"acsrouting",是阿里云容器服务路由应用(Aliyun Container Service Routing)的意思,这个路由应用只有一个服务,就是路由服务,该服务是全局(global)的,也就是说每个节点(下面说到的主机和节点都是同一个意思,即ECS的vm实例)都部署了这个服务(或者说镜像)的一个拷贝,也就是容器。每个节点都有这个容器用来路由HTTP服务或者HTTPS服务。如图所示,HTTP服务,SLB前后端端口的映射是"80:80",主机与路由容器之间的端口映射也是"80:80",即路由的容器暴露的也是80端口,其它用作web服务的容器可以暴露任意的端口,只要在容器启动的时候设置主机和容器端口的映射,routing服务就能获取到相应的端口进行请求的路由。暴露HTTP服务完整示例可以参见通过镜像创建Wordpress

设置主机和容器端口的映射

  • 通过容器服务管理控制台进行设置

    • 在容器服务控制台左侧边栏选择"服务"选项卡,在"服务列表"中,选择需要暴露的服务,例如该处示例的服务是"spring-boot",选择"spring-boot"服务的"变更配置"
    • 在变更配置页面,配置主机和容器端口的映射,如下图所示
    • 如图,主机端口为空,表示随机暴露一个主机的端口(暴露http/https服务时,我们可以不需要知道这个主机暴露的具体端口是什么,而是使用overlay网络或者vpc网络来直接访问容器的端口),容器端口为8080。我们使用spring boot默认暴露web服务的8080端口来提供http服务,使用的协议是tcp协议
    • 如图,路由配置通过域名来暴露服务,须标明要暴露的端口,此处为我们的web服务8080端口。域名字段只填写了域名前缀,如果域名前缀为"XXX",会给到域名"XXX.$cluster_id.$region_id.alicontainer.com"供测试使用,此处我们拿到的域名为"spring-boot.c0cffb4340aee47ccb26dea062cfb0b2e.cn-beijing.alicontainer.com",用户也可以填写自己的域名,需要添加解析到相应的SLB实例IP。关于配置路由的容器端口和http服务的域名,详情见routing标签
  • 通过客户端工具进行设置

    • docker help run 查看使用的"-p"选项, 路由配置在容器服务管理控制台进行
    • docker-compose 查看支持的"ports"选项 路由配置规则详情见routing标签

暴露HTTPS服务

  • 与暴露HTTP服务的区别主要在于,暴露HTTPS服务,SLB前后端端口的映射是"443:80"以及证书配置。只需要在SLB这一层前端暴露443端口,后端暴露80端口路由到routing服务,同时上传相应域名的证书,就能够提供https服务了,具体的信息见 slb帮助文档-证书管理

通过自定义SLB方式暴露服务

暴露HTTP协议或者HTTPS协议的服务

  • 推荐使用简单路由服务(即routing)的方式来暴露HTTP服务或者HTTPS协议的服务,如果开发者希望搭建自己的路由链路,可以开通新的内网或者公网SLB实例路由到vm的端口(通过label aliyun.lb.port_$container_port来实现),并设置主机和容器的映射关系来进行请求的路由
  • 适用场景:7层协议负载均衡,自定义各服务的路由,在将传统架构迁移到容器架构过程中非容器集群的服务访问容器集群中容器的服务

暴露TCP协议或者UDP协议的服务

  • 目前如果要暴露TCP协议的服务,需要用户自行设置SLB实例或者公网IP,并配置好主机端口与容器端口的映射(通过label aliyun.lb.port_$container_port来实现)
  • 适用场景:4层协议的负载均衡,自定义各服务的路由,在将传统架构迁移到容器架构过程中非容器集群的服务访问容器集群中容器的服务
  • 示例:通过自定义SLB的方式来将容器集群内的redis服务暴露给容器集群外的python应用

    • 首先在SLB官网控制台,购买创建一个用于路由的SLB,这里选择的是公网实例,用户可以根据自己的需要选择公网或者内网
    • 然后给刚刚购买创建的SLB实例命名为slb_redis_app,容器服务会通过该名称来引用这个SLB
    • 选择一个已有的集群,创建一个名称为redis-demo的应用,点击使用镜像创建
    • 选择redis镜像,注意,此处redis镜像只是开通了容器的6379端口,为了让我们创建的SLB路由到这个容器端口,我们必须知道redis镜像的主机:端口映射,这里我们勾选publish,选择使用的协议是TCP协议,同时指定主机端口为6379,主机端口6379即为SLB绑定的后端主机端口。
    • 为了配置自定义SLB,需要让redis服务知道使用的SLB的信息,这些信息是通过向服务注入一个标签来实现的,标签格式如下,带$的变量为占位符

      aliyun.lb.port_$container_port:$scheme://$[slb_name|slb_id]:$front_port

$container_port表示容器要暴露的端口,$scheme表示SLB监听端口支持的协议,可能的值为tcphttphttpsudp$[slb_name|slb_id]表示可以填写slb实例的名称或者Id,$front_port表示slb实例要暴露的前端端口。更多详情见aliyun.lb.port_$container_port

  • 创建应用页面,点击更多设置,找到自定义SLB表单。这里设置我们要配置的SLB实例的信息,如下图配置所示,对应的标签内容为aliyun.lb.port_6379: tcp://slb_redis_app:6379。 标签设置我们要路由到的容器端口为6379,引用前面创建的SLB名称slb_redis_app,与上面主机:容器端口映射设置的TCP协议相呼应,这里我们设置监听端口的协议为TCP协议,同时设置SLB的前端端口为6379,点击添加按钮。至此,我们在容器服务中引用了刚刚创建的SLBslb_redis_app,同时将SLB的前端端口,后端端口(即主机的端口),容器端口均设置为了6379(用户可以根据自己的需要设置不同的前端端口和主机端口)
  • 点击创建并部署,redis应用即开始创建了。redis应用在创建的过程中会自动将名称为slb_redis_app的SLB实例绑定到部署了redis镜像的后端主机。
  • 当应用处于就绪状态后,查看名为slb_redis_app的SLB实例的状态。由健康状态可见,SLB已经正确地绑定到了redis的后端了,除了SLB绑定的后端和监听的6379端口外,用户此时可以根据自己的需要修改名为slb_redis_app的SLB实例的属性。
  • 查询到SLB实例的IP地址为120.25.129.150,用户可以使用命令行工具telnet 120.25.129.150 6379来检查端口的可访问性。
  • 示例起见,在本地起一个简单的python应用来通过slb_redis_appSLB实例访问容器集群内的redis,注意redis主机地址是SLB的地址120.25.129.150

app.py

    from flask import Flask
    from redis import Redis
    app = Flask(__name__)
    redis = Redis(host='120.25.129.150', port=6379)

    @app.route('/')
    def hello():
        redis.incr('hits')
        return 'Hello World! I have been seen %s times.' % redis.get('hits')

    if __name__ == "__main__":
        app.run(host="0.0.0.0", debug=True)

requirements.txt

    flask
    redis

shell

    $ pip install -r requirements.txt
    $ python app.py
    Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
    Restarting with stat
    Debugger is active!
    Debugger pin code: 243-626-653
  • 访问结果如下图所示
相关实践学习
Docker镜像管理快速入门
本教程将介绍如何使用Docker构建镜像,并通过阿里云镜像服务分发到ECS服务器,运行该镜像。
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
2月前
|
弹性计算 Kubernetes 负载均衡
将阿里云Kubernetes容器服务中的某些服务暴露为内网路由,
将阿里云Kubernetes容器服务中的某些服务暴露为内网路由,
55 1
|
8月前
|
Serverless
《基于阿里云容器服务 实现Serverless服务》电子版地址
基于阿里云容器服务 实现Serverless服务
88 0
《基于阿里云容器服务 实现Serverless服务》电子版地址
|
9月前
|
Serverless
《基于阿里云容器服务 实现Serverless服务》电子版地址
基于阿里云容器服务 实现Serverless服务
62 0
《基于阿里云容器服务 实现Serverless服务》电子版地址
|
10月前
|
弹性计算 网络协议 应用服务中间件
公网请求slb端口发现大概率会被拒绝连接
公网请求slb端口发现大概率会被拒绝连接
公网请求slb端口发现大概率会被拒绝连接
|
11月前
|
弹性计算 tengine 负载均衡
管理公网流量-SLB | 学习笔记
快速学习管理公网流量-SLB
234 0
管理公网流量-SLB | 学习笔记
|
负载均衡
云速搭部署和导入公网型负载均衡CLB
本最佳实践讲解如何通过云速搭导入一个已保有的公网型负载均衡CLB,并部署一个新的公网型CLB。
云速搭部署和导入公网型负载均衡CLB
|
运维 Kubernetes 安全
服务网格 ASM +容器服务 ACK 助力画雕科技构建 IoT 服务管理能力
将服务网格组件和集群拆分开,对服务网格组件进行升级不会影响到集群, 解耦网格实例和Kubernetes集群的生命周期管理;通过服务网格多入口网关, 轻松自定义实现,一个CRD就搞定了,而且可以将K8s集群利用率变得更高!
4330 0
服务网格 ASM +容器服务 ACK 助力画雕科技构建 IoT 服务管理能力
|
域名解析 弹性计算 负载均衡
阿里云公网负载均衡实例快速创建教程
负载均衡就是把多台服务器(阿里云服务器)联合起来,形成服务器集群,当用户访问量增大时,负载均衡服务器把流量分配给集群内的其他服务器,解决因为大流量产生的卡顿,失去响应,404等问题,也可以有效的防止DDOS攻击。阿里云负载均衡就是我们常说的负载均衡SLB。
1757 0
|
负载均衡
负载均衡包年包月公网临时扩容踩坑
公司全域会员系统才上线几天,公司C端业务忽然搞促销活动,活动持续大概2小时,难免用户的访问量相比平时要大很多,SLB负载均衡带宽采用的是包年包月且带宽的速率达不到要求,想着既要为公司节约成本又要满足此次活动的,想到的肯定是临时提升带宽。
355 0
负载均衡包年包月公网临时扩容踩坑
相关产品
容器镜像服务
容器服务Kubernetes版
推荐文章
更多