通过配置AlbConfig实现ALB Ingress链路追踪

阿里云提供了链路追踪服务可观测链路 OpenTelemetry 版(Managed Service for OpenTelemetry),为分布式应用的开发者提供了完整的调用链路还原、调用请求量统计、链路拓扑等,以快速分析和诊断分布式应用架构下的性能瓶颈,提高微服务时代下的开发诊断效率。您可以为容器计算服务 ACS(Container Compute Service)集群安装ALB Ingress Controller组件并开启链路追踪功能,来查看服务调用链路相关数据。

前提条件

步骤一:获取日志服务Project ID

  1. 登录容器计算服务控制台,在左侧导航栏选择集群列表

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择集群信息

  3. 在右侧基本信息页签中的集群资源区块,复制保存日志服务 Project右侧的ID。

    说明

    若创建集群时未开启日志服务,您可以通过手动安装alibaba-log-controller组件的方式来启用日志服务,开启日志服务后默认的Project IDk8s-log-ACS集群ID。具体操作,请参见启用日志服务组件

步骤二:配置访问日志和链路追踪

  1. 拷贝以下内容到alb-test.yaml,用于创建AlbConfig。

    apiVersion: alibabacloud.com/v1
    kind: AlbConfig
    metadata:
      name: alb-demo
    spec:
      config:
        name: alb-test
        addressType: Internet
        # 指定的交换机必须在ALB当前所支持的可用区内,且与集群处于同一VPC。为保障业务高可用,请至少选择2个或以上不同可用区的交换机。
        zoneMappings:
        - vSwitchId: vsw-2vc82nndnoo**********          # 请根据实际情况,设置ALB交换机ID。
        - vSwitchId: vsw-2vc30f5mlhs**********          # 请根据实际情况,设置ALB交换机ID。
        accessLogConfig:
          logProject: k8s-log-xz92lvykqj1siwvif****     # 以步骤一中实际获取的日志服务Project为准。
          logStore: alb_test_xz92lvykqj1siwvif****      # logStore命名需要以alb_开头。若指定的logStore不存在,系统则会自动创建。
      listeners:
      - port: 80
        protocol: HTTP
        logConfig:
          accessLogRecordCustomizedHeadersEnabled: false
          accessLogTracingConfig:                       # Xtrace相关配置参数,前提需要配置accessLogConfig。
            tracingEnabled: true                        # 监听Xtrace开关。默认取值为false,如需打开Xtrace,请将该参数取值为true。
            tracingSample: 9999                         # 监听Xtrace采样率。取值范围:1~10000,仅在tracingEnabled开关为true时生效。
            tracingType: Zipkin                         # 监听Xtrace采样方式。取值为Zipkin,仅在tracingEnabled开关为true时生效。
  2. 执行以下命令,创建AlbConfig。

    kubectl apply -f alb-test.yaml

    预期输出:

    albconfig.alibabacloud.com/alb-demo created
  3. 创建并拷贝以下内容到alb.yaml文件中,用于创建IngressClass。

    apiVersion: networking.k8s.io/v1
    kind: IngressClass
    metadata:
      name: alb
    spec:
      controller: ingress.k8s.alibabacloud/alb
      parameters:
        apiGroup: alibabacloud.com
        kind: AlbConfig
        name: alb-demo
  4. 执行以下命令,创建IngressClass。

    kubectl apply -f alb.yaml

    预期输出:

    ingressclass.networking.k8s.io/alb created
说明

配置完成后,在集群对应的日志服务Project中会自动创建名为alb_test_xz92lvykqj1siwvif****的日志库。

步骤三:部署示例应用

  1. 创建并拷贝以下内容到cafe-service.yaml文件中,用于部署名称为coffeeDeployment,以及名称为coffeeService。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: coffee
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: coffee
      template:
        metadata:
          labels:
            app: coffee
        spec:
          containers:
          - name: coffee
            image: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginxdemos:latest
            ports:
            - containerPort: 80
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: coffee-svc
    spec:
      ports:
      - port: 80
        targetPort: 80
        protocol: TCP
      selector:
        app: coffee
      type: ClusterIP
  2. 执行以下命令,部署DeploymentService。

    kubectl apply -f cafe-service.yaml

    预期输出:

    deployment.apps/coffee created
    service/coffee-svc created
  3. 创建并拷贝以下内容到cafe-ingress.yaml文件中,用于配置Ingress规则,实现对外暴露服务。

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: cafe-ingress 
    spec:
      ingressClassName: alb
      rules:
       - host: demo.domain.ingress.top
         http:
          paths:
          # 配置Context Path
          - path: /coffee
            pathType: ImplementationSpecific
            backend:
              service:
                name: coffee-svc
                port: 
                  number: 80
  4. 执行以下命令,配置coffee服务对外暴露的域名和路径。

    kubectl apply -f cafe-ingress.yaml

    预期输出:

    ingress.networking.k8s.io/cafe-ingress created
  5. (可选)如果您在创建Ingress时配置了spec.rules.host字段为您的自有域名,您需要将您的域名添加CNAME记录解析到ALB DNS名称。后续通过您的自有域名访问服务。具体操作,请参见配置域名解析

步骤四:查看链路追踪信息

  1. 执行以下命令,获取ALB实例地址(ADDRESS)。

    kubectl get ingress

    预期输出:

    NAME           CLASS   HOSTS                     ADDRESS                                              PORTS   AGE
    cafe-ingress   alb     demo.domain.ingress.top   alb-u53i28ewt580*****.cn-<Region>.alb.aliyuncs.com   80      16m
  2. 执行以下命令,访问服务。

    curl -H Host:demo.domain.ingress.top http://alb-u53i28ewt580*****.cn-<Region>.alb.aliyuncs.com/coffee
    说明

    预期输出一个标题为Hello WorldHTML页面。您也可以在浏览器中访问配置好的域名,预期输出为以下页面:

    image

  3. 查看日志服务SLS中对应ALB实例的访问日志,确认上一步访问服务的操作已被记录到访问日志,并且链路追踪xtrace标记的字段已有数据。

    1. 登录日志服务控制台

    2. Project列表区域选择ACS集群对应的Project(默认为k8s-log-ACS集群ID),进入日志库列表页签。

    3. 单击名称以alb_开头的日志库(例如本示例的alb_test_xz92lvykqj1siwvif****),然后在当前页面搜索coffee

      image

      在查询到的日志中带有xtrace标记的字段主要有:

      • slb_xtrace:slb_xtrace: 19241ed1c4790d31:19241ed1c4790d31:-:1中的19241ed1c4790d31为该次请求的链路追踪ID(TraceId),TraceId可以作为查询条件来进一步分析调用链路。

      • xtrace_type:xtrace_type: zipkin为链路追踪采集方式,与步骤二:配置访问日志和链路追踪中的配置一致。

  4. 通过TraceId可观测链路OpenTelemetry中查询调用链信息。

    1. 登录可观测链路 OpenTelemetry 版控制台

    2. 应用列表页面顶部选择目标地域,然后单击目标应用名称,该名称默认为对应ALB的实例ID(例如本示例的alb-u53i28ewt580*****)。

    3. 在左侧导航栏中单击调用链分析,在右侧搜索框输入查询条件trace_id IN (19241ed1c4790d31),其中的TraceId19241ed1c4790d31为上一步日志中的TraceId信息。

      image

    4. 点击查询到的TraceId链接,即可查询这次请求所产生的调用链路的详细信息。

      image

相关文档