最近在研究observabilty在K8S环境的onboard,查阅了一些资料,发现现在网上Prometheus/Metrics相关的资源,是比较全面的,而Trace相关的部分不是很全面,所以写下这篇博文,以做备忘和分享。
组件介绍
- 这里选择使用jaeger-operator,Github主页为:GitHub - jaegertracing/jaeger-operator: Jaeger Operator for Kubernetes simplifies deploying and running Jaeger on Kubernetes.因为这里只是demo的需要所以采用了all-in-one的方式部署,生产环境建议朋友们采用可靠的持久化部署方式。
- 为什么没有选择jaeger-kubernetes呢?因为它是有些过时的,从其主页上我们可以看到GitHub - jaegertracing/jaeger-kubernetes: Support for deploying Jaeger into Kubernetes
此项目处于已经归档且久未更新的状态。
部署jaeger-operator
我们可以参考jeager的官方网站Operator for Kubernetes --- Jaeger documentation
请注意,可能官方网站的最新版本,和Github的最新版本是不一样的,如本人在起草文章的时候,Github的最新版是1.57,而官网的最新版是1.59,因此需要下载Github资源的时候请留意。
创建命名空间observability
bash
kubectl create namespace observability
资源创建
bash
kubectl create -f https://github.com/jaegertracing/jaeger-operator/releases/download/v1.59.0/jaeger-operator.yaml -n observability
或者
bash
wget https://github.com/jaegertracing/jaeger-operator/releases/download/v1.57.0/jaeger-operator.yaml
kubectl apply -f jaeger-operator.yaml -n observability
这个yaml很长,而且是官网下载未编辑,就不贴给大家看了。
我们可以检查是否部署成功
bash
$ kubectl get deployment jaeger-operator -n observability
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
jaeger-operator 1 1 1 1 48s
创建Jaeger实例
我们创建部署文件Jaeger-example.yaml
bash
apiVersion: jaegertracing.io/v1
kind: Jaeger
metadata:
name: all-in-one
spec:
strategy: allinone
agent:
strategy: DaemonSet
ingress:
hosts:
- xxx
imagePullSecrets:
- name: xxx
其中ingress和imagePullSecrets部分可以省略或按需要配置,imagePullSecrets是因为docker.io限制了拉取次数,可能需要配置包括注册信息的Secret。
bash
kubectl -f jaeger-example.yaml -o observability
然后我们查看是否完成创建
bash
k get svc -n observability | grep all-in-one
部署hotrod
资源创建
创建配置文件hotrod.yaml
bash
metadata:
name: hotrod
spec:
rules:
- host: hotrod.jaeger.k8s.local
http:
paths:
- backend:
service:
name: hotrod
port:
number: 8080
path: /
pathType: Prefix
---
apiVersion: v1
kind: Service
metadata:
name: hotrod
labels:
app: hotrod
spec:
ports:
- port: 8080
protocol: TCP
selector:
app: hotrod
---
apiVersion: v1
kind: Pod
metadata:
name: hotrod
labels:
app: hotrod
spec:
containers:
- name: hotrod
image: jaegertracing/example-hotrod
imagePullPolicy: IfNotPresent
args:
- all
- --jaeger-ui=http://jaeger.k8s.local
env:
- name: JAEGER_AGENT_HOST
value: xxxx
- name: OTEL_EXPORTER_OTLP_ENDPOINT
value: http://xxx:4318
imagePullSecrets:
- name: xx
OTEL_EXPORTER_OTLP_ENDPOINT这个环境变量,是为了导出trace数据到Jaeger,它的默认值是localhost:4318,可以参考jaeger-operator部署出来的all-in-one-query服务;
JAEGER_AGENT_HOST我也不清楚有什么用,可能是参考的配置文件版本有点老。。
接下来我们部署资源。
bash
kubectl apply -f hotrod.yaml -o observability
检查部署情况
bash
kubectl get svc -n observability | grep hot
从UI检验
方便起见可以将service以Nodeport启动
Hotrod: http://node_IP:node_port
我们可以点击UI产生一些trace;
Jaeger:http://node_IP:node_port (all-in-one-query服务,http-query对应的port)