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

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 在容器服务中,暴露应用提供的服务到公网有两种选择,一种是通过系统默认的路由应用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服务器,运行该镜像。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
1月前
|
Kubernetes 负载均衡 应用服务中间件
深入理解 Kubernetes Ingress:路由流量、负载均衡和安全性配置
深入理解 Kubernetes Ingress:路由流量、负载均衡和安全性配置
|
26天前
|
网络协议 Linux C语言
Intel HDSLB 高性能四层负载均衡器 — 基本原理和部署配置
本篇主要介绍了 Intel HDSLB 的基本运行原理和部署配置的方式,希望能够帮助读者们顺利的把 HDSLB-DPVS 项目 “玩” 起来。
130 9
Intel HDSLB 高性能四层负载均衡器 — 基本原理和部署配置
|
1月前
|
负载均衡 应用服务中间件 nginx
解决nginx配置负载均衡时invalid host in upstream报错
在Windows环境下,配置Nginx 1.11.5进行负载均衡时遇到问题,服务无法启动。错误日志显示“invalid host in upstream”。检查发现上游服务器列表中,192.168.29.128的主机地址无效。负载均衡配置中,两个服务器地址前误加了"http://"。修正方法是删除上游服务器列表和proxy_pass中的"http://"。问题解决后,Nginx服务应能正常启动。
92 4
解决nginx配置负载均衡时invalid host in upstream报错
|
1月前
|
负载均衡 网络协议 算法
【Docker 专栏】Docker 容器内服务发现与负载均衡
【5月更文挑战第8天】本文探讨了Docker容器中的服务发现与负载均衡。服务发现通过环境变量、DNS或集中式系统(如Consul、Zookeeper)来定位服务实例。负载均衡则采用轮询、随机等算法,可通过软件负载均衡器、云服务或容器编排工具(如Kubernetes)实现。服务发现与负载均衡结合使用,确保请求有效分发和系统稳定性。面对动态性、网络延迟及大规模部署的挑战,需采取相应措施优化。选择合适技术并持续优化,能提升Docker容器应用的性能和可靠性。
【Docker 专栏】Docker 容器内服务发现与负载均衡
|
1月前
|
负载均衡 前端开发 应用服务中间件
Nginx+Tomcat负载均衡配置_nginx做tomcat的负载均衡成功,但tomcat的css文件400
Nginx+Tomcat负载均衡配置_nginx做tomcat的负载均衡成功,但tomcat的css文件400
|
1月前
|
负载均衡 前端开发 应用服务中间件
Nginx+Tomcat负载均衡配置_nginx做tomcat的负载均衡成功,但tomcat的css文件400(2)
Nginx+Tomcat负载均衡配置_nginx做tomcat的负载均衡成功,但tomcat的css文件400(2)
|
1月前
|
运维 负载均衡 Cloud Native
Serverless 应用引擎产品使用之在Serverless 应用引擎中,使用云原生网关的情况下,SLB(负载均衡器)和证书配置如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
1月前
|
运维 Kubernetes 监控
本地CentOS安装轻量级容器PaaS平台KubeSphere并实现无公网IP远程访问
本地CentOS安装轻量级容器PaaS平台KubeSphere并实现无公网IP远程访问
25 0
|
1月前
|
存储 安全 文件存储
如何在群辉NAS使用Docker搭建容器魔方并实现无公网ip远程访问
如何在群辉NAS使用Docker搭建容器魔方并实现无公网ip远程访问
76 0
|
6天前
|
NoSQL 关系型数据库 Redis
Docker的通俗理解和通过宿主机端口访问Redis容器的实例
本文目标:引导初学者入门Docker,理解镜像、容器和宿主机概念,学习常用Docker命令,特别是如何创建并从Redis容器通过宿主机端口访问。 关键点: - Docker核心:镜像(类)、容器(实例)、宿主机(运行环境)。 - `docker pull` 拉取镜像,如 `redis:3.0`。 - `docker run -d --name` 后台运行容器,如 `my-redis`。 - `-p` 参数做端口映射,如 `6379:6379`。 - `docker exec -it` 交互式进入容器,如 `bash` 或执行命令。

相关产品

  • 容器计算服务