Janrs.com | 杨建勇
Janrs.com | 杨建勇

K8s/Rancher 部署 Open-Telemetry 以及对接 ELK 和 Jaeger

基于 k8s 管理工具 Rancher UI 部署 OTEL 以及 Jaeger,有状态的 ELK 采用单独的服务器部署,不放在 k8s

转载请注明来源:https://janrs.com/1wqi


部署 ELK 以及安装 APM

参考博文:https://janrs.com/c9rq

部署 Jaeger

部署 Jaeger 使用 Operator 部署,采用 Helm 方式部署 OperatorRancher UI 自带 JaegerHelm Repo,直接安装即可:

helm install jaegertracing/jaeger-operator

部署 Jaeger 实例,部署在 jaeger 的命名空间:

apiVersion: jaegertracing.io/v1
kind: Jaeger
metadata:
  name: jaeger
  namespace: jaeger
spec:
  strategy: production

部署后查看 pod 状态,显示 Running 即表示正常:

NAME                               READY   STATUS    RESTARTS        AGE
jaeger-5c46cb5c8d-q2429            1/1     Running   3 (23h ago)     6d12h
jaeger-operator-569475574d-dsgmq   2/2     Running   5 (7d22h ago)   23d

部署 OTEL

部署前创建命名空间:otelOperator 以及 Collector 都部署在 otel 命名空间。

部署 Operator

部署 OTEL 同样使用 Operator 部署,同样使用 Helm 安装 Operator

Rancher UI 自带没有 OTELhelm 仓库,手动添加添加 helm 仓库:

仓库地址为:https://open-telemetry.github.io/opentelemetry-helm-charts

步骤:左侧菜单[应用] –> Chart仓库 –> 创建 –> 添加仓库地址以及名称 –> 点击右下角创建

创建后直接在应用中搜索 opentelemetry 就会出现应用,安装 opentelemetry-operator 即可。

部署 Collector

部署 Collector 可以采用 deployment 以及 daemonset 方式部署,这里采用 deployment 方式。

修改 RancherHelm 选项中的参数:modedeployment,然后点击安装即可。

对接 ELK 以及 Jaeger

对接 ELK

OTEL 上报链路数据到 ES 是通过 ELK 安装的 APM 代理服务器上报的,所以需要设置 OTEL 对接 ELKAPM 服务地址就行了,相关配置如下。

修改 CollectorConfigmap 配置对接 ELK,主要配置如下:

otlphttp/elastic:
        endpoint: "http://elasticsearch.com:8200"
        headers:
          Authorization: "Bearer AAEAAWVsYXN0aWMvZmxlZXQtc2VydmVyL3Rva2VuLTE2ODI3NTY1MDEzOTQ6TTNkcE9sWjBSQi14em80eVRQdHJzQQ"

对接 Jaeger

同样修改 CollectorConfigmap 配置对接 Jaeger , 主要配置如下:

jaeger:
        endpoint: jaeger-collector.jaeger.svc.cluster.local:14250
        tls:
          insecure: true

以下是完整的 OTELCollector 对接 ELKAPM 以及 JaegerConfigmap

apiVersion: v1
data:
  relay: |
    exporters:
      logging:
        loglevel: warn
      otlphttp/elastic:
        endpoint: "http://elasticsearch.com:8200"
        headers:
          Authorization: "Bearer AAEAAWVsYXN0aWMvZmxlZXQtc2VydmVyL3Rva2VuLTE2ODI3NTY1MDEzOTQ6TTNkcE9sWjBSQi14em80eVRQdHJzQQ"
      jaeger:
        endpoint: jaeger-collector.jaeger.svc.cluster.local:14250
        tls:
          insecure: true
    extensions:
      health_check: {}
      memory_ballast:
        size_in_percentage: 40
    processors:
      batch: {}
      memory_limiter:
        check_interval: 5s
        limit_percentage: 80
        spike_limit_percentage: 25
    receivers:
      jaeger:
        protocols:
          grpc:
            endpoint: ${MY_POD_IP}:14250
          thrift_compact:
            endpoint: ${MY_POD_IP}:6831
          thrift_http:
            endpoint: ${MY_POD_IP}:14268
      otlp:
        protocols:
          grpc:
            endpoint: ${MY_POD_IP}:4317
          http:
            endpoint: ${MY_POD_IP}:4318
      prometheus:
        config:
          scrape_configs:
          - job_name: opentelemetry-collector
            scrape_interval: 10s
            static_configs:
            - targets:
              - ${MY_POD_IP}:8888
      zipkin:
        endpoint: ${MY_POD_IP}:9411
    service:
      extensions:
      - health_check
      - memory_ballast
      pipelines:
        logs:
          exporters:
          - logging
          - otlphttp/elastic
          processors:
          - memory_limiter
          - batch
          receivers:
          - otlp
        metrics:
          exporters:
          - logging
          - otlphttp/elastic
          processors:
          - memory_limiter
          - batch
          receivers:
          - otlp
          - prometheus
        traces:
          exporters:
          - logging
          - otlphttp/elastic
          - jaeger
          processors:
          - memory_limiter
          - batch
          receivers:
          - otlp
          - jaeger
          - zipkin
      telemetry:
        metrics:
          address: ${MY_POD_IP}:8888
kind: ConfigMap
metadata:
  annotations:
    meta.helm.sh/release-name: opentelemetry-collector-0-1682785137
    meta.helm.sh/release-namespace: otel
  creationTimestamp: '2023-04-29T16:18:58Z'
  labels:
    app.kubernetes.io/instance: opentelemetry-collector-0-1682785137
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/name: opentelemetry-collector
    app.kubernetes.io/version: 0.76.1
    helm.sh/chart: opentelemetry-collector-0.55.0
  name: opentelemetry-collector-0-1682785137
  namespace: otel

golang 对接 OTEL

获取 service 地址

创建一个 Trace Provider, Trace ProviderEndPoint 设置为 otel-collector 部署在 k8sservice 的地址。

查看 otel-collectorservice 地址:

kubectl get svc -n otel

显示如下:

opentelemetry-collector-0-1682785137          ClusterIP   10.96.215.170   <none>        6831/UDP,14250/TCP,14268/TCP,4317/TCP,4318/TCP,9411/TCP   23d
opentelemetry-operator-0-1682784940           ClusterIP   10.96.110.41    <none>        8443/TCP,8080/TCP                                         23d
opentelemetry-operator-0-1682784940-webhook   ClusterIP   10.96.81.101    <none>        443/TCP                                                   23d

创建 goTrace Provider


// NewTrace 实例化 Trace
func NewTrace() (*sdktrace.TracerProvider, error) {

    ctx := context.Background()
    traceClient := otlptracegrpc.NewClient(
        otlptracegrpc.WithInsecure(),
        otlptracegrpc.WithEndpoint("opentelemetry-collector-0-1682785137.otel:4317"),
        otlptracegrpc.WithDialOption(grpc.WithBlock()),
    )
    traceExp, err := otlptrace.New(ctx, traceClient)
    if err != nil {
        return nil, err
    }

    res, err := resource.New(ctx,
        resource.WithFromEnv(),
        resource.WithProcess(),
        resource.WithTelemetrySDK(),
        resource.WithHost(),
        resource.WithAttributes(semconv.ServiceNameKey.String("test-service")))
    if err != nil {
        return nil, err
    }

    bsp := sdktrace.NewBatchSpanProcessor(traceExp)

    tracerProvider := sdktrace.NewTracerProvider(
        sdktrace.WithSampler(sdktrace.AlwaysSample()),
        sdktrace.WithResource(res),
        sdktrace.WithSpanProcessor(bsp),
    )

    otel.SetTextMapPropagator(
        propagation.NewCompositeTextMapPropagator(propagation.TraceContext{},
            propagation.Baggage{}),
    )
    otel.SetTracerProvider(tracerProvider)

    return tracerProvider, nil

}

grpc-server 添加链路追踪

grpcServer := grpc.NewServer(
    grpc.ChainStreamInterceptor(
        // otel 链路追踪
        otelgrpc.StreamServerInterceptor(),
    ),
    grpc.ChainUnaryInterceptor(
        // otel 链路追踪
        otelgrpc.UnaryServerInterceptor(),
    ),
)

grpc-client 添加链路追踪

// some code ...

conn, err := grpc.DialContext(
    ctx, serverAddress,
    grpc.WithTransportCredentials(insecure.NewCredentials()),
    grpc.WithUnaryInterceptor(otelgrpc.UnaryClientInterceptor()),
    grpc.WithStreamInterceptor(otelgrpc.StreamClientInterceptor()),
)

// some code ...

main.go 添加 Trace Provider 以及上报链路

tp , err := NewTrace()

if err != nil {
    panic("new trace provider failed.")
}

// 汇总链路数据以及上报数据到 ES 以及 Jaeger
defer func() {
    if err = tp.Shutdown(context.Background()); err != nil {
        fmt.Println("shutdown trace provider failed.")
    }
}()

// 在需要上报 span 链路的地方添加以下代码即可上报链路数据

tracer := tp.Tracer("test-service-rpc")
    ctx, span := tracer.Start(ctx, "test-service.rpc.UserInfo")
    defer span.End()

Jaeger 以及 ELK 的链路展示截图如下:

Jaeger 截图

https://cdn.janrs.com/wp-content/uploads/2023/04/otel-jaeger.png

ELK 截图

https://cdn.janrs.com/wp-content/uploads/2023/04/otel-elk.png

转载请注明来源:https://janrs.com/1wqi

如果你有任何问题,欢迎在底部留言。或者点击加入微信技术交流群 | 我的GitHub
没有标签
首页      Go      K8s/Rancher 部署 Open-Telemetry 以及对接 ELK 和 Jaeger

码仔

文章作者

Janrs.com

发表回复

textsms
account_circle
email

Janrs.com | 杨建勇

K8s/Rancher 部署 Open-Telemetry 以及对接 ELK 和 Jaeger
基于 k8s 管理工具 Rancher UI 部署 OTEL 以及 Jaeger,有状态的 ELK 采用单独的服务器部署,不放在 k8s。 转载请注明来源:https://janrs.com/1wqi 部署 ELK 以及安装 APM 参考博文…
扫描二维码继续阅读
2023-05-13