K8S - 集群中部署Zipkin

一、链路追踪部署流程

这里有两种部署流程,这里简单介绍下:

1、两种日志采集方式

  • 方式一: 将链路日志直接推送到 Zipkin Server 进行聚合,存储到 ElasticSearch 中,最后再用 Zipkin UI 展示链路过程。
  • 方式二: 将链路日志推送到 Kafka,然后启动 Zipkin Server 聚合日志,监听 Kafka ,如果有新的消息则进行拉取存入到 ElasticSeach,最后再用 Zipkin UI 展示链路过程。

两种方式的比较:

  • 第一种方式使用与配置起来比较简单,并且在 Kubernetes 中能够很容易的横向扩展来处理一定的链路日志数据,不过如果服务过多,链路日志数据量过大还是可能造成 Zipkin Server 的崩溃,所以比较适合服务数量不大的境中。
  • 第二种方式使用与配置比较复杂,需要 Kubernetes 集群中部署 Kafka 与 Zookeeper,通过将链路日志数据写入 Kafka 进行削峰,再由 Kafka 写入 Zipkin Server 进行聚合,所以比较适合数据量大、服务多的环境。

2、流程图

方式一:Zipkin Server + ElasticSearch

K8S - 集群中部署Zipkin_第1张图片

方式二:Zipkin Server + ElasticSearch + Kafka

K8S - 集群中部署Zipkin_第2张图片

二、准备部署环境

在实际生产环境中,一般都需要配合 Kafka 完成链路工作,所以我们将围绕第二种来介绍,需要准备下面组件:

  • Kafka: 需要拥有在 Kubernetes 环境中能访问的 Kafka 集群。
  • ElasticSearch: 需要拥有在 Kubernetes 环境中能访问的 ElasticSearch 集群。
  • Zipkin: 在 Kubernetes 中部署 Zipkin,后面将演示这个部署的过程。
  • 两个 SpringCloud 服务: 需要两个 SpringCloud 服务,通过 Feign 相互调用接口产生链路日志便于测试,后面将演示如何写测试项目部署到 Kubernetes 中。

在 Kubernetes 中完成链路流程的方案,需要依赖上面各个组件,这些组件最好部署在 Kubernetes 中来保证稳定,关于如何在 Kubernetes 中部署 Kafka、ElasticSearch、Kibana 本人之前发的博文中已经有过部署流程,所以不再过度描述,如果 Kubernetes 集群外已经有能够使用的上面组件并且还能正常调用,直接调用即可。

三、Kubernetes 部署 Zipkin

1、部署 Zipkin Server

Zipkin Server 是用于收集链路日志信息进行聚合,然后保存数据,并通过 UI 展示数据的组件,这里新建部署文件,然后执行 Kuberctl 命令在 Kubernetes 集群创建 Zipkin Server,并且由于 Zipkin Server 需要监听 Kafka,所以这里也要设置 Kafka 相关配置。

vi zipkin-server.yaml

apiVersion: v1
kind: Service
metadata:
  namespace: springcloud
  name: zipkin
  labels:
    app: zipkin
spec:
  type: NodePort        #指定为 NodePort 方式暴露出口
  ports:
    - name: server
      port: 9411
      targetPort: 9411
      protocol: TCP
  selector:
    app: zipkin
---
apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: springcloud
  name: zipkin
  labels:
    name: zipkin
spec:
  replicas: 1
  selector:
    matchLabels:
      app: zipkin
  template:
    metadata:
      labels:
        app: zipkin
    spec:
      containers:
      - name: zipkin
        image: openzipkin/zipkin:2.15
        ports:
        - containerPort: 9411
        env:
        - name: JAVA_OPTS
          value: "
                  -Xms512m -Xmx512m
                  -Dlogging.level.zipkin=DEBUG
                  -Dlogging.level.zipkin2=DEBUG
                  -Duser.timezone=Asia/Shanghai
                  "
        - name: STORAGE_TYPE
          value: "elasticsearch"   #设置数据存储在ES中
        - name: ES_HOSTS
          value: "elasticsearch.logging:9200"   #ES地址
        - name: ES_INDEX           #设置ES中存储的zipkin索引名称
          value: "zipkin"
        - name: ES_INDEX_REPLICAS  #ES索引副本数
          value: "1"
        - name: ES_INDEX_SHARDS    #ES分片数量
          value: "3"
        #- name: ES_USERNAME       #如果ES启用x-pack,需要设置用户名、密码
        #  value: ""
        #- name: ES_PASSWORD
        #  value: ""
        - name: KAFKA_BOOTSTRAP_SERVERS #Kafka 地址
          value: "kafka-svc.kafka:9092"
        - name: KAFKA_TOPIC             #Kafka Topic名称,默认为"zipkin"
          value: "zipkin"
        - name: KAFKA_GROUP_ID          #Kafka 组名,默认为"zipkin"
          value: "zipkin"
        - name: KAFKA_STREAMS           #消耗Topic的线程数,默认为1
          value: "1"
        resources:
          limits:
            cpu: 1000m
            memory: 512Mi
          requests:
            cpu: 500m
            memory: 256Mi

2、部署 Zipkin-Dependencies

zipkin-dependencies 是一个聚合数据依赖关系的服务,这里启动服务后它会自动从 ElasticSearch 中获取索引,分析依赖关系然后再以 zipkin索引名称-dependency-yyyy-mm-dd 命名创建新索引存入 ElasticSearch。

并且这个服务内置 Crond 定时任务,默认每隔一小时会执行分析 ElasticSearch 中索引关系的任务(在 Kubernetes 中将其设置一个 Job 任务来使用也是可以的,因为它每次启动时候都会先进行分析依赖数据,当然也可以用容器内部的 Crond 来执行定时任务)。

注意:下面 yaml 中一定要设置 command 命令来启用 crond 定时任务,否则之后执行一次分析依赖关系任务后程序自动关闭。

vi zipkin-dependencies.yaml

apiVersion: v1
kind: Service
metadata:
  namespace: springcloud
  name: zipkin
  labels:
    app: zipkin
spec:
  type: NodePort        #指定为 NodePort 方式暴露出口
  ports:
    - name: server
      port: 9411
      targetPort: 9411
      protocol: TCP
  selector:
    app: zipkin
---
apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: springcloud
  name: zipkin
  labels:
    name: zipkin
spec:
  replicas: 1
  selector:
    matchLabels:
      app: zipkin
  template:
    metadata:
      labels:
        app: zipkin
    spec:
      containers:
      - name: zipkin
        image: openzipkin/zipkin:2.15
        ports:
        - containerPort: 9411
        env:
        - name: JAVA_OPTS
          value: "
                  -Xms512m -Xmx512m
                  -Dlogging.level.zipkin=DEBUG
                  -Dlogging.level.zipkin2=DEBUG
                  -Duser.timezone=Asia/Shanghai
                  "
        - name: STORAGE_TYPE
          value: "elasticsearch"   #设置数据存储在ES中
        - name: ES_HOSTS
          value: "elasticsearch.logging:9200"   #ES地址
        - name: ES_INDEX           #设置ES中存储的zipkin索引名称
          value: "zipkin"
        - name: ES_INDEX_REPLICAS  #ES索引副本数
          value: "1"
        - name: ES_INDEX_SHARDS    #ES分片数量
          value: "3"
        #- name: ES_USERNAME       #如果ES启用x-pack,需要设置用户名、密码
        #  value: ""
        #- name: ES_PASSWORD
        #  value: ""
        - name: KAFKA_BOOTSTRAP_SERVERS #Kafka 地址
          value: "kafka-svc.kafka:9092"
        - name: KAFKA_TOPIC             #Kafka Topic名称,默认为"zipkin"
          value: "zipkin"
        - name: KAFKA_GROUP_ID          #Kafka 组名,默认为"zipkin"
          value: "zipkin"
        - name: KAFKA_STREAMS           #消耗Topic的线程数,默认为1
          value: "1"
        resources:
          limits:
            cpu: 1000m
            memory: 512Mi
          requests:
            cpu: 500m
            memory: 256Mi
[root@k8s-master01 zipkin]# ls
zipkin-dependencies.yaml  zipkin-server.yaml
[root@k8s-master01 zipkin]# cat zipkin-dependencies.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: springcloud
  name: zipkin-dependencies
  labels:
    name: zipkin-dependencies
spec:
  replicas: 1
  selector:
    matchLabels:
      app: zipkin-dependencies
  template:
    metadata:
      labels:
        app: zipkin-dependencies
    spec:
      containers:
      - name: zipkin
        image: openzipkin/zipkin-dependencies:2.3.1
        ports:
        - containerPort: 80
        command: ["sh","-c","crond -f"]
        env:
        - name: JAVA_OPTS
          value: "-Xms512m -Xmx512m"
        - name: STORAGE_TYPE
          value: "elasticsearch"
        - name: ES_HOSTS
          value: "elasticsearch.logging:9200"
        - name: ES_INDEX        #设置ES中存储的zipkin索引名称
          value: "zipkin"
        #- name: ES_USERNAME    #如果ES启用x-pack,需要设置用户名、密码
        #  value: ""
        #- name: ES_PASSWORD
        #  value: ""
        resources:
          limits:
            cpu: 1000m
            memory: 512Mi
          requests:
            cpu: 500m
            memory: 256Mi

四、访问 Zipkin Web UI

K8S - 集群中部署Zipkin_第3张图片

K8S - 集群中部署Zipkin_第4张图片

你可能感兴趣的:(K8S,zipkin)