Skip to main content

Open-telemetry Jaeger Tracing in Rook

Ceph Version Support​

Jaeger distributed tracing support was officially introduced in Ceph Pacific (version 16.x) and continues to be supported in your current Ceph Squid (v19.2.3) deployment. I used Squid(v19.2.0+) for this article. The tracing functionality is available for both RGW and OSD components in Rook-managed Kubernetes deployments.

Rook Kubernetes Compatibility​

Opentelemetry(Jaeger tracing) is supported in Ceph deployments using method of sidecar injection for now for Rook.

Here’s a step by step guide on how to configure Opentelemetry(Jaegertracing) using sidecar injection for Rook-Ceph.

In an existing Rook Ceph Kubernetes cluster we will be deploying cert-manager, for the validation of Jaeger-operator.

$ kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.11.0/cert-manager.yaml

Deploy Jaeger operator:

$ kubectl create namespace observability
$ kubectl apply -f https://github.com/jaegertracing/jaeger-operator/releases/download/v1.42.0/jaeger-operator.yaml -n observability

• For Production cluster please refer to: https://www.jaegertracing.io/docs/1.21/operator/

  • We deploy simplest (agent, collector, query, ingestor, Jaeger UI) in a single pod, using in-memory storage by default
$ cat << EOF | kubectl apply -f -
apiVersion: jaegertracing.io/v1
kind: Jaeger
metadata:
name: simplest
namespace: observability
EOF

Expose Query API:

$ cat << EOF | kubectl apply -f -
apiVersion: v1
kind: Service
metadata:
name: simplest-query-external
namespace: observability
labels:
app: jaeger
app.kubernetes.io/component: service-query
app.kubernetes.io/instance: simplest
app.kubernetes.io/managed-by: jaeger-operator
app.kubernetes.io/name: simplest-query
app.kubernetes.io/part-of: jaeger
spec:
ports:
- name: http-query
port: 16686
protocol: TCP
targetPort: 16686
selector:
app.kubernetes.io/component: all-in-one
app.kubernetes.io/instance: simplest
app.kubernetes.io/managed-by: jaeger-operator
app.kubernetes.io/name: simplest
app.kubernetes.io/part-of: jaeger
app: jaeger
sessionAffinity: None
type: NodePort
EOF

add jaeger configuration to cluster-test ConfigMap under [global] settings

jaeger_tracing_enable = true
jaeger_agent_port = 6831

optionally you can add debug_trace to see any debug logs based on tracing for the cluster.

  cephConfig:
global:
jaeger_tracing_enable: true
jaeger_agent_port: "6831"
debug_trace: "20"

Jaeger requires a sidecar agent for the instrumented code to collect traces from, for that we need to inject Jaeger as a sidecar on OSDs and RGW

add annotations to the cluster. so that jaeger will inject an agent side-car to OSD pods:

spec:
annotations:
osd:
sidecar.jaegertracing.io/inject: "true"
$ kubectl create -f cluster-test.yaml

add annotations to the cluster. so that jaeger will inject an agent side-car to RGW object store object-test.yaml:

gateway:
annotations:
sidecar.jaegertracing.io/inject: "true"
$ kubectl create -f object-test.yaml
  • fetch the URL that allow access to the RGW service from the host running the minikube VM:
$ export AWS_URL=$(minikube service --url rook-ceph-rgw-my-store-external -n rook-ceph)
  • user credentials and bucket name:
$ export AWS_ACCESS_KEY_ID=$(kubectl -n default get secret ceph-delete-bucket -o jsonpath='{.data.AWS_ACCESS_KEY_ID}' | base64 --decode)
$ export AWS_SECRET_ACCESS_KEY=$(kubectl -n default get secret ceph-delete-bucket -o jsonpath='{.data.AWS_SECRET_ACCESS_KEY}' | base64 --decode)
$ export BUCKET_NAME=$(kubectl get objectbucketclaim ceph-delete-bucket -o jsonpath='{.spec.bucketName}')
  • now use them to upload an object:
$ echo "hello world" > hello.txt
$ aws --endpoint-url "$AWS_URL" s3 cp hello.txt s3://"$BUCKET_NAME"
  • fetch the URL that allow access to the jaeger query service from the host running the minikube VM:
$ export JAEGER_URL=$(minikube service --url simplest-query-external -n observability)
  • query traces:
$ curl "$JAEGER_URL/api/traces?service=rgw&limit=20&lookback=1h" | jq