分布式请求追踪系统分析及实战(k8s部署skywalking)

分布式请求追踪系统分析

1、什么是分布式追踪

链路追踪,就是将一次分布式请求还原成调用链路,进行日志记录,性能监控并将一次分布式请求的调用情况集中展示。比如各个服务节点上的耗时、请求具体到达哪台机器上、每个服务节点的请求状态等等。

2、痛点

  • 某个核心服务挂了,导致上游出现大量报警,如何快速确定哪个服务出了问题?
  • 某个核心服务挂了,导致大量报错,如何快速确定哪里出了问题?
  • 应用程序有性能瓶颈,怎样确定瓶颈在哪里?
  • App端请求响应延迟高,怎样确定是有哪些服务导致的?
  • 线上发布了服务,怎么知道它一切正常,比如发布8台服务器,如何直观了解是否有请求进来,访问一切正常?

微服务调用

在这里插入图片描述

3、解决痛点

需要一些可以帮助开发人员理解系统行为,快速定位问题的工具,分布式追踪系统应运而生

4、分布式追踪系统产品

分布式追踪系统是2014年Google在《Dapper,a Large-Scale Distributed Systems Tracing Infrastructure》中提出,目前市面上很多开源的APM都参考Google Dapper

APM工具可视化埋点方式开发者支持语言特点社区活跃度(相对)
CAT侵入式美团点评JAVA、php、.NET基于Java语言开发,提供多种语言的客户端,监控数据全量统计,对代码侵入性强
hydra非侵入式京东JAVA、.NET多协议支持 。Hydra支持多种协议,用户可以根据实际情况选择适用的协议进行密码破解。 高效快速 。Hydra使用并发技术,可以同时进行多个密码破解尝试,提高破解速度。 灵活性 。Hydra提供了丰富的选项和参数,用户可以根据需要进行定制化配置。 广泛应用 。Hydra可以应用于各种场景,包括渗透测试、密码破解等。
Zipkin侵入式TwitterJava、Go由Java语言开发,侵入性相对于CAT较低,需要对web.xml等配置文件进行修改
Pinpoint非侵入式韩国团队Java、php、nodeJs采用字节码增强技术,对代码无侵入,支持Java和PHP语言,底层采用HBase存储数据,不支持trace查询
SkyWalking非侵入式国人开源Java支持Java、.Net、NodeJs等探针,数据存储支持Mysql、Elasticsearch等,采用字节码注入方式实现代码无侵入,探针采集数据粒度粗但性能表现优秀,对云原生支持较好,并且对jvm支持监控、告警,性能损失低

详细产品对比分析

5、skywalking服务端部署

服务端部署主要分为oap-server和ui,k8s部署参考如下:

5.1、oap部署

镜像可直接从Apache镜像仓库拉去

kind: Deployment
apiVersion: apps/v1
metadata:
  name: skywalking-oap-svr
  namespace: apm
  labels:
    app: skywalking-oap-svr
  annotations:
    deployment.kubernetes.io/revision: '8'
    kubesphere.io/creator: admin
spec:
  replicas: 3
  selector:
    matchLabels:
      app: skywalking-oap-svr
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: skywalking-oap-svr
      annotations:
        kubesphere.io/creator: admin
        kubesphere.io/imagepullsecrets: '{"skywalking-oap-svr":"aics-aic-image-secret"}'
        kubesphere.io/restartedAt: '2023-08-10T06:27:45.920Z'
    spec:
      volumes:
        - name: host-time
          hostPath:
            path: /etc/localtime
            type: ''
      containers:
        - name: skywalking-oap-svr
          image: >-
            sky.test.cn/snapshot-docker-local/skywalking-oap-server:9.3.0
          ports:
            - name: http-0
              containerPort: 11800
              protocol: TCP
            - name: http-1
              containerPort: 12800
              protocol: TCP
            - name: http-2
              containerPort: 9421
              protocol: TCP
          env:
            - name: SW_STORAGE
              value: elasticsearch
            - name: SW_STORAGE_ES_CLUSTER_NODES
              value: '10.143.164.5:9200'
            - name: SW_HEALTH_CHECKER
              value: default
            - name: SW_ES_USER
              value: elastic
            - name: SW_ES_PASSWORD
              value: KvavH!GaP%xn
          resources: {}
          volumeMounts:
            - name: host-time
              readOnly: true
              mountPath: /etc/localtime
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
          imagePullPolicy: Always
      restartPolicy: Always
      terminationGracePeriodSeconds: 30
      dnsPolicy: ClusterFirst
      serviceAccountName: default
      serviceAccount: default
      securityContext: {}
      imagePullSecrets:
        - name: aics-aic-image-secret
      schedulerName: default-scheduler
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 25%
      maxSurge: 25%
  revisionHistoryLimit: 10
  progressDeadlineSeconds: 600

5.2、ui部署

kind: Deployment
apiVersion: apps/v1
metadata:
  name: skywalking-ui
  namespace: apm
  labels:
    app: skywalking-ui
  annotations:
    deployment.kubernetes.io/revision: '8'
    kubesphere.io/creator: admin
spec:
  replicas: 1
  selector:
    matchLabels:
      app: skywalking-ui
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: skywalking-ui
      annotations:
        kubesphere.io/creator: admin
        kubesphere.io/imagepullsecrets: '{"skywalking-ui":"aics-aic-image-secret"}'
        kubesphere.io/restartedAt: '2023-08-10T06:43:46.709Z'
        logging.kubesphere.io/logsidecar-config: '{}'
    spec:
      volumes:
        - name: host-time
          hostPath:
            path: /etc/localtime
            type: ''
        - name: volume-wp616w
          secret:
            secretName: aics-aic-image-secret
            defaultMode: 420
      containers:
        - name: skywalking-ui
          image: >-
            sky.test.cn/snapshot-docker-local/skywalking-ui:9.3.0
          ports:
            - name: http-0
              containerPort: 8080
              protocol: TCP
          env:
            - name: SW_OAP_ADDRESS
              value: 'http://127.0.0.1:31069'
            - name: SW_ZIPKIN_ADDRESS
              value: 'http://127.0.0.1:30983'
          resources: {}
          volumeMounts:
            - name: host-time
              readOnly: true
              mountPath: /etc/localtime
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
          imagePullPolicy: Always
      restartPolicy: Always
      terminationGracePeriodSeconds: 30
      dnsPolicy: ClusterFirst
      serviceAccountName: default
      serviceAccount: default
      securityContext: {}
      imagePullSecrets:
        - name: aics-aic-image-secret
      schedulerName: default-scheduler
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 25%
      maxSurge: 25%
  revisionHistoryLimit: 10
  progressDeadlineSeconds: 600

服务接入skywalking

获取skywalking agent,获取agent两种方式,可直接从Apache镜像仓库直接拉去,或者自己打镜像,后者可参考:agent镜像制作

服务接入agent采用sidecar的方式将agent镜像作为初始化容器,参考如下:

**注意:**服务镜像需要将java agent参数已变量的形式提供:例如:

环境变量:

在这里插入图片描述

启动参数:

在这里插入图片描述

服务部署:

kind: Deployment
apiVersion: apps/v1
metadata:
  name: telecom-ai-base
  namespace: ct-aics-dialog
  labels:
    name: telecom-ai-base
  annotations:
    deployment.kubernetes.io/revision: '11'
spec:
  replicas: 1
  selector:
    matchLabels:
      name: telecom-ai-base
  template:
    metadata:
      creationTimestamp: null
      labels:
        name: telecom-ai-base
      annotations:
        kubesphere.io/restartedAt: '2023-08-10T07:49:05.901Z'
    spec:
      volumes: #挂载共享存储
        - name: side-car-share-volume
          emptyDir: {}
      initContainers: #sidecar方式:初始化agent容器
        - name: skywalking-java-agent
          image: >-
            skywalking.agent.cn/snapshot-docker-local/skywalking-java-agent:8.16.0-alpine	#agent镜像仓库地址
          command:
            - sh
          args:
            - '-c'
            - >-
              mkdir -p /data/paasops/sk/agent/ && cp -r /skywalking/agent/*
              /data/paasops/sk/agent/
          resources: {}
          volumeMounts: #共享存储定义
            - name: side-car-share-volume
              mountPath: /data/paasops/sk/agent
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
          imagePullPolicy: Always
      containers: #服务容器
        - name: telecom-ai-base
          image: >-
            skywalking.test.cn/snapshot-docker-local/telecom-ai-base-api:20230810     #服务镜像仓库地址
          command:
            - /bin/bash
            - '-c'
            - chmod +x bin/* && ./bin/start.sh
          ports:
            - name: web-port
              containerPort: 8088
              protocol: TCP
          env:
            - name: NACOS_ADDR
              value: 'http://127.0.0.1:8808'
            - name: NACOS_USERNAME
              value: nacos
            - name: NACOS_PASSWORD
              value: nacos123456
            - name: NACOS_NAMESPACE
              value: 98dd1ba4-27e1-4502-a33d-bbead14da5c5
            - name: knife4j.switch
              value: 'true'
            - name: JAVA_AGENT_OPS #设置java agent启动参数
              value: >-
                -javaagent:/data/paasops/sk/agent/skywalking-agent.jar
                -Dskywalking.agent.service_name=sky-log-test
                -Dskywalking.collector.backend_service=127。0.0.1:32128
          resources: {}
          volumeMounts: #设置共享存储
            - name: side-car-share-volume
              mountPath: /data/paasops/sk/agent
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
          imagePullPolicy: Always
      restartPolicy: Always
      terminationGracePeriodSeconds: 30
      dnsPolicy: ClusterFirst
      securityContext: {}
      imagePullSecrets:
        - name: ct-aics-dialog-image-secret
      schedulerName: default-scheduler
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 25%
      maxSurge: 25%
  revisionHistoryLimit: 10
  progressDeadlineSeconds: 600


k8s部署skywalking可按以下步骤进行: 1. 安装K8S集群,可以使用kubeadm进行部署。具体的K8s集群安装步骤可以参考中的文档。 2. 创建命名空间,可以使用kubectl命令创建一个新的命名空间,用于部署skywalking。 3. 给节点打标签,使用kubectl命令给需要部署skywalking的节点打上特定的标签,方便后续的Pod调度。 4. 下载skywalking的配置文件,可以从提供的GitHub链接中获取skywalking的配置文件。这些配置文件包括skywalking-oap.yml和skywalking-ui.yml。 5. 使用kubectl命令部署skywalking的oap服务,可以通过执行kubectl apply命令来部署skywalking-oap.yml文件中定义的服务。 6. 使用kubectl命令部署skywalking的ui服务,可以通过执行kubectl apply命令来部署skywalking-ui.yml文件中定义的服务。 7. 配置访问skywalking,可以通过访问skywalking-ui的IP地址和端口来查看和管理skywalking的监控数据。 你可以参考中的文档和中的GitHub链接获取更详细的部署步骤和配置信息。 引用: 安装K8S集群kubeadm部署K8s集群V1.19.0 https://github.com/loveowie/skywalking-kubernetes<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [K8S部署skywalking](https://blog.csdn.net/anqixiang/article/details/120807866)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [K8S 部署全链路监控skywalking8.7和9.1](https://blog.csdn.net/ice_bird/article/details/122054784)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值