在K8s环境中通过镜像部署多语言微服务应用
随着Node.js、Go和Python等语言的快速发展,多语言微服务应用越来越多。EDAS能够通过服务网格支持在K8s集群部署多语言微服务应用,且提供应用托管和服务发现、链路追踪、负载均衡和应用监控等服务治理能力。本文介绍如何在EDAS的K8s集群中通过镜像部署多语言微服务应用。
前提条件
您的阿里云账号已同时开通EDAS和容器服务Kubernetes版:
如果您以RAM用户且使用企业版容器镜像仓库里的镜像创建应用时,需要阿里云账号为该RAM用户授权。具体信息,请参见配置仓库的RAM访问控制。
背景信息
应用从最初的单体架构演变到目前的微服务架构,在带来便利的同时也大大增加了服务部署、运维的复杂度。而微服务本身可以是任意语言开发的,在部署多语言服务后,如何对多语言的微服务提供通用的链路追踪、服务发现、负载均衡等能力,一种做法是提供多语言的SDK,一种是服务网格。SDK对应用有侵入性,而服务网格在无侵入性的同时也能提供服务发现、负载均衡、链路追踪等能力,EDAS对多语言的支持正是采用的后者——服务网格。
服务网格是致力于解决服务间通讯的基础设施层。它负责在现代云原生应用程序的复杂服务拓扑中可靠地传递请求,通常是通过一组轻量级网络代理,与应用程序部署在一起来实现,而无需感知应用程序本身。
示例场景说明
示例应用BookInfo模仿在线书店的一个分类,显示一本书的信息。页面上会显示一本书的描述,书籍的细节(ISBN、页数等),以及关于这本书的一些评论。
BookInfo是一个异构应用,几个微服务应用是由不同的语言编写的。这些服务构成了一个有代表性的服务网格的例子:由多个服务、多个语言构成,并且Reviews服务具有多个版本。
图 1. 多语言服务架构
BookInfo应用包含四个单独的服务:
Productpage:为Python服务,会调用Details和Reviews两个服务,用来生成页面。同时,Productpage还包含登录和登出功能。
Details:为Ruby服务,包含了书籍的信息。
Reviews:为Java服务,包含了书籍相关的评论,还会调用Ratings服务。Reviews包含3个版本:
v1版本不会调用Ratings服务。
v2版本会调用Ratings服务,并使用1到5个黑色星形图标来显示评分信息。
v3版本会调用Ratings服务,并使用1到5个红色星形图标来显示评分信息。
Ratings:为Node.js服务,包含了由书籍评价组成的评级信息。
操作流程
您需在容器服务ACK控制台中创建K8s集群,并将该集群导入到EDAS,然后在导入的K8s集群中使用自定义镜像来部署多语言应用。
ACK集群和ACK Serverless集群的操作流程类似, 本文以ACK集群为例来展示操作过程。

步骤一:创建容器服务Kubernetes集群
登录容器服务Kubernetes版控制台,创建容器服务Kubernetes集群。具体操作,请参见快速创建Kubernetes托管版集群。
如果创建Serverless Kubernetes集群,专有网络请选择自动创建(选择已有网络,创建完毕后请查看集群资源是否包含VPC和交换机资源),服务发现请选择PrivateZone,以便Serverless Kubernetes集群在导入EDAS后可以使用服务网格。具体操作,请参见创建ASK集群。
步骤二:在EDAS控制台中导入容器服务K8s集群
在EDAS控制台导入容器服务K8s集群时,会默认安装应用防护(限流降级)组件(ack-ahas-sentinel-pilot)、ARMS监控组件(ack-arms-pilot)以及Prometheus监控组件(ack-arms-prometheus)。
登录EDAS控制台,在左侧导航栏,选择 。
在顶部菜单栏选择地域,然后单击同步容器服务Kubernetes集群。
在导入的容器服务K8s集群的操作列,单击导入。
在导入预检对话框选,单击继续导入。
在导入Kubernetes集群对话框,从下拉列表中选择目标微服务空间,根据需要选择是否开启服务网格,然后单击导入。
当容器服务K8s集群状态显示为运行中,并且导入状态显示为导入成功时,表示容器服务K8s集群已成功导入到EDAS。
步骤三:添加链路追踪功能
EDAS控制台部署多语言应用采用的是基于Istio的服务网格链路追踪的监控方案。Istio代理虽能够自动发送Span信息,但应用程序仍然需要携带HTTP表头信息,以实现在发送Span信息时将Span信息正确地关联到单个跟踪中。
应用程序需要携带以下HTTP表头,并将其从传入请求传播到任意传出请求。
x-request-id
x-b3-traceid
x-b3-spanid
x-b3-parentspanid
x-b3-sampled
x-b3-flags
x-ot-span-context
此处仅介绍示例多语言应用中部分服务的应用程序中携带的HTTP表头信息。
以Python语言实现的Productpage服务的应用程序中携带的HTTP表头如下:
def getForwardHeaders(request):
headers = {}
# x-b3-*** headers can be populated using the opentracing span
span = get_current_span()
carrier = {}
tracer.inject(
span_context=span.context,
format=Format.HTTP_HEADERS,
carrier=carrier)
headers.update(carrier)
# ...
incoming_headers = ['x-request-id']
# ...
for ihdr in incoming_headers:
val = request.headers.get(ihdr)
if val is not None:
headers[ihdr] = val
return headers
以Java语言实现的Reviews服务的应用程序中携带的HTTP表头如下:
@GET
@Path("/reviews/{productId}")
public Response bookReviewsById(@PathParam("productId") int productId,
@HeaderParam("end-user") String user,
@HeaderParam("x-request-id") String xreq,
@HeaderParam("x-b3-traceid") String xtraceid,
@HeaderParam("x-b3-spanid") String xspanid,
@HeaderParam("x-b3-parentspanid") String xparentspanid,
@HeaderParam("x-b3-sampled") String xsampled,
@HeaderParam("x-b3-flags") String xflags,
@HeaderParam("x-ot-span-context") String xotspan) {
if (ratings_enabled) {
JsonObject ratingsResponse = getRatings(Integer.toString(productId), user, xreq, xtraceid, xspanid, xparentspanid, xsampled, xflags, xotspan);
// ...
}
}
步骤四:在K8s集群中部署多语言应用
登录EDAS控制台。
在左侧导航栏,单击 ,在顶部菜单栏选择地域,并在页面上方选择微服务空间,然后在应用列表页面左上角,单击创建应用。
在应用基本信息页签,设置应用的集群类型和应用运行环境,然后单击下一步。
配置项
描述
集群类型
选择Kubernetes集群。
应用运行环境
在托管应用类型区域,选择多语言Node.js、C++、Go…。系统会将应用运行环境默认选择为自定义,即使用自定义镜像部署应用。
在应用配置页签,设置应用的环境信息、基本信息及镜像相关配置,设置完成后单击下一步。
配置项
描述
微服务空间
选择您导入的K8s集群所在的微服务空间,如果您未创建微服务空间或不做选择,将选择默认微服务空间。
如果您没有创建微服务空间,或者需要创建新的微服务空间,您可以直接单击创建微服务空间,创建一个全新的微服务空间。具体操作,请参见使用控制台管理微服务空间。
集群
在下拉列表中选择目标K8s集群。
如果您选择的K8s集群未导入到EDAS,请选中该集群在EDAS初次使用,勾选后,将会在应用创建时将该集群导入EDAS,因此会产生一定耗时。并确认是否开启服务网格。
说明集群导入的微服务空间可以不是应用所属微服务空间。
如果需要监控和治理多语言应用,请单击立即开启,开启服务网格。
K8s Namespace
K8s Namespace通过将系统内部的对象分配到不同的Namespace中,形成逻辑上分组的不同项目、小组或用户组,便于不同的分组在共享使用整个集群的资源的同时还能被分别管理。
default:没有其他命名空间的对象的默认命名空间。
kube-system:系统创建的对象的命名空间。
kube-public:此命名空间是自动创建的,并且可供所有用户(包括未经过身份验证的用户)读取。
此处以选择default为例。
如果您需要自定义创建K8s Namespace,请单击创建K8s Namespace并设置K8s Namespace名称。名称设置要求只能包含数字、小写字母和短划线(-),且首尾只能是字母或数字,长度为1~63个字符。
应用名称
输入应用名称,必须以字母开头,允许数字、字母、短划线(-)组合。最多支持输入36个字符。
应用描述
输入应用描述 ,最大长度为128个字符。
版本
可在右侧单击生成版本号来生成版本,也可按照页面提示自定义版本号。
镜像类型
本文以选择Demo镜像为例,然后选择镜像edas-demo-project/provider并设置镜像版本来完成部署。
Pod总数
设置该应用要部署的Pod个数。
单Pod资源配额
设置单个Pod的CPU和内存,如果您需要限额,请填写具体的数字,使用默认值0则代表不限额。
在应用高级设置页面设置相关配置项,然后单击创建应用。
配置服务网格。
配置项
描述
协议
在下拉列表选择协支持的协议。
服务名
请输入应用提供的服务名,要和应用代码中的服务名一致,以保证服务能成功注册和被调用。
服务端口
请输入应用提供的服务端口,要和应用代码中的服务端口一致,以保证服务能成功注册和被调用。
可选:配置以下高级设置。
完成设置后单击创建应用,然后在应用创建完成页签单击确定创建应用。
应用创建可能需要几分钟,创建过程中,可以在页面上方单击查看详情,跳转到应用的变更记录页面查看部署进度及相关日志。创建完成后,返回应用总览页面查看实例Pod的运行状态若为运行中则说明应用发布成功,单击Pod的运行状态可以查看应用实例的工作负载、容器组(Pod)和启动命令等高级配置信息。
重复执行上述步骤,部署客户端应用。
说明在步骤4的镜像类型配置项中选择edas-demo-project/consumer镜像来完成部署。
结果验证
服务部署完成后,访问主服务,页面上会显示一本书的描述,书籍的细节(ISBN、页数等),以及关于这本书的一些评论。同时还能进行登录、登出操作。
在应用总览页面的访问方式配置区域单击负载均衡(公网)右侧的图标。
在负载均衡(公网)对话框设置SLB和监听参数,然后单击确认。
在选择SLB右侧的下拉列表中选择新建SLB。
如果您有SLB实例,可以在列表中选择已有的SLB实例。
选择协议,然后在协议右侧单击添加新的监听,然后将SLB端口和容器端口分别设置为80和18082。
说明如果您选择了HTTPS协议,则还需要选择SSL证书。
添加公网SLB大概需要30秒。添加完成后,访问方式配置区域的负载均衡(公网)右侧会显示公网SLB的地址,格式为
SLB实例IP:端口
。
复制公网SLB地址,在浏览器中粘贴该公网地址进入到示例应用(在线书店)首页。
在客户端应用首页单击Normal user或者Test user。
在页面顶部单击Sign in,输入User Name和Password,然后单击Sign in登录示例应用。
本示例的User Name和Password均为admin。
在该示例多语言应用里,您可看到书籍的详细信息和相关评论。
应用监控
示例多语言应用部署完成后,您可以查看应用的健康状况关键指标,包括请求总量、平均响应时间等总体指标,应用所提供的服务、所依赖的服务的相关指标;以及CPU使用量、内存使用量等系统信息。
常见问题
怎么查看应用变更的出错日志?
在进行应用部署的时候,如果镜像构建失败,可以在变更记录页面查看日志,请参见查看应用变更。
EDAS多语言应用交流群
如果您在部署EDAS多语言微服务应用过程中有任何疑问或建议,请使用钉钉搜索钉钉群号23307994加入钉钉群进行反馈。