ASM可以便捷地为部署在网格内的应用提供链路追踪能力,但要实现网格内和网格外应用的一体化追踪,需要使用链路追踪系统以形成调用链。本文介绍如何通过阿里云链路追踪,使网格外部应用调用网格内部应用并形成一个完整的链路追踪信息。
前提条件
已创建一个ASM实例,并已将ACK集群添加到ASM实例中。具体操作,请参见创建ASM实例和添加集群到ASM实例。
ASM实例已部署入口网关,便于访问网格内应用。具体操作,请参见创建入口网关。
已准备一个用于运行网格外示例应用的环境,并安装Python 2.7。
已启用阿里云链路追踪。具体操作,请参见将链路追踪数据采集到阿里云链路追踪服务。
使用说明
本示例将部署一个用Python编写的应用ExternalProxy。该应用会启用一个HTTP Server,当ExternalProxy的根路径被访问时,会调用网格内应用BookInfo的Productpage应用。
本示例将使用XTrace为追踪系统进行演示。若您使用自行部署的Zipkin兼容的追踪系统,可以将该系统上报地址暴露于网格外应用可以访问的地址,可以跳过步骤二:获取链路追踪Tracing Analysis的接入点地址,直接参照步骤三:部署网格外应用ExternalProxy使用该地址作为上报地址即可。
步骤一:部署网格内应用BookInfo
执行以下命令,将Bookinfo应用部署到ASM实例的集群中。
BookInfo应用的YAML文件,请从GitHub下载。
kubectl --kubeconfig=${DATA_PLANE_KUBECONFIG} apply -f bookinfo.yaml
执行以下命令,部署Bookinfo应用的VirtualService。
VirtualService的YAML文件,请从GitHub下载。
kubectl --kubeconfig=${ASM_KUBECONFIG} apply -f virtual-service-all-v1.yaml
执行以下命令,部署Bookinfo应用的DestinationRule。
DestinationRule的YAML文件,请从Github下载。
kubectl --kubeconfig=${ASM_KUBECONFIG} apply -f destination-rule-all.yaml
执行以下命令,部署Bookinfo应用的Gateway。
Gateway的YAML文件,请从GitHub下载。
kubectl --kubeconfig=${ASM_KUBECONFIG} apply -f bookinfo-gateway.yaml
步骤二:获取链路追踪Tracing Analysis的接入点地址
登录链路追踪Tracing Analysis控制台,在左侧导航栏,单击概览。
在概览页面,单击接入流程页签,然后单击查看接入点信息。
查看接入点地址。
在页面上方,选择目标地域。
请选择BookInfo应用部署的ACK集群所在地域来上报数据,否则追踪信息无法关联。
在接入点信息页签,单击显示Token,并根据您的ExternalProxy部署位置决定选择公网或私网接入点地址。
因为ExternalProxy通过Zipkin V1 API进行数据上报,因此选用V1版本的接入点地址。
步骤三:部署网格外应用ExternalProxy
将下面的代码保存至网格外应用运行环境,命名为ExternalProxy.py。
将
{XTRACE_ZIPKIN_V1_ENDPOINT}
替换为上一步获取到的接入点地址。如果您希望上报于自行部署的追踪系统,这里请替换为其上报地址。将
{INGRESS_GATE_WAY_IP}
替换为ACK集群Ingress Gateway的地址。
import requests from flask import Flask from py_zipkin.zipkin import zipkin_span,create_http_headers_for_new_span from py_zipkin.util import generate_random_64bit_string from py_zipkin.util import ZipkinAttrs import time app = Flask(__name__) def do_stuff(trace_id, span_id, parent_span_id): time.sleep(2) headers = create_http_headers_for_new_span() headers["X-B3-TraceId"] = trace_id headers["X-B3-SpanId"] = span_id headers["X-B3-ParentSpanId"] = parent_span_id print "SEND TO INGRESS HEADERS : {0}".format(headers) r = requests.get('http://${INGRESS_GATE_WAY_IP}/productpage', headers=headers) return 'OK' def http_transport(encoded_span): # encoding prefix explained in https://github.com/Yelp/py_zipkin#transport body=encoded_span zipkin_url="${XTRACE_ZIPKIN_V1_ENDPOINT}" headers = {"Content-Type": "application/x-thrift"} # You'd probably want to wrap this in a try/except in case POSTing fails r=requests.post(zipkin_url, data=body, headers=headers) print(body) @app.route('/') def index(): with zipkin_span( service_name='external-proxy', span_name='external-proxy/inbound', transport_handler=http_transport, port=5000, sample_rate=100, ) as inbound_span: do_stuff(inbound_span.zipkin_attrs.trace_id, inbound_span.zipkin_attrs.span_id, inbound_span.zipkin_attrs.parent_span_id) return 'OK', 200 if __name__=='__main__': app.run(host="0.0.0.0",port=5000,debug=True)
执行下面的命令,启动ExternalProxy。
python ExternalProxy.py
* Serving Flask app "main" (lazy loading) * Environment: production WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. * Debug mode: on * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit) * Restarting with stat * Debugger is active! * Debugger PIN: 317-792-686
执行以下命令,调用ExternalProxy。
curl localhost:5000
预期输出:
OK
步骤四:查看链路追踪信息
在左侧导航栏,单击应用列表,然后在上方选择地域,单击下方列表中的ExternalProxy。
在左侧导航栏,单击应用详情,单击调用链路页签,单击相应的traceId查看链路追踪信息。
可以看到,网格外部应用ExternalProxy与内部应用BookInfo之间已形成完整的调用链路。