【K8s教程】Nginx Ingress 控制器通過 OpenTracing 專案進行分散式跟蹤說明
參考:
https://kubernetes.github.io/ingress-nginx/user-guide/third-party-addons/opentracing/
啟用 NGINX 服務的請求,通過 OpenTracing 專案進行分散式跟蹤。
使用第三方模組 opentracing-contrib/nginx-opentracing(https://github.com/opentracing-contrib/nginx-opentracing) ,NGINX 入口控制器可以配置 NGINX 以啟用 OpenTracing(http://opentracing.io/) 檢測。 預設情況下,此功能處於禁用狀態。
用法
要啟用檢測,我們必須在配置 ConfigMap 中啟用 OpenTracing:
data:
enable-opentracing: "true"
要為單個 Ingress 啟用或禁用檢測,請使用 enable-opentracing註解:
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/enable-opentracing: "true"
我們還必須設定上傳跟蹤時使用的主機:
zipkin-collector-host: zipkin.default.svc.cluster.local jaeger-collector-host: jaeger-agent.default.svc.cluster.local datadog-collector-host: datadog-agent.default.svc.cluster.local
注意:雖然該選項被呼叫 jaeger-collector-host,你需要把它指向一個 jaeger-agent,而不是 jaeger-collector成分。 或者,您可以設定 jaeger-endpoint並指定用於上傳跟蹤的完整端點。 這將使用 TCP 並且應該用於收集器而不是代理。
接下來,您需要部署一個使用 OpenTracing 的分散式跟蹤系統。 Zipkin 和 Jaeger 以及 Datadog 已經過測試。
其他可選配置選項:
# specifies the name to use for the server span opentracing-operation-name # specifies specifies the name to use for the location span opentracing-location-operation-name # specifies the port to use when uploading traces, Default: 9411 zipkin-collector-port # specifies the service name to use for any traces created, Default: nginx zipkin-service-name # specifies sample rate for any traces created, Default: 1.0 zipkin-sample-rate # specifies the port to use when uploading traces, Default: 6831 jaeger-collector-port # specifies the endpoint to use when uploading traces to a collector instead of an agent jaeger-endpoint # specifies the service name to use for any traces created, Default: nginx jaeger-service-name # specifies the traceparent/tracestate propagation format jaeger-propagation-format # specifies the sampler to be used when sampling traces. # The available samplers are: const, probabilistic, ratelimiting, remote, Default: const jaeger-sampler-type # specifies the argument to be passed to the sampler constructor, Default: 1 jaeger-sampler-param # Specifies the custom remote sampler host to be passed to the sampler constructor. Must be a valid URL. # Default: http://127.0.0.1 jaeger-sampler-host # Specifies the custom remote sampler port to be passed to the sampler constructor. Must be a number. Default: 5778 jaeger-sampler-port # Specifies the header name used for passing trace context. Must be a string. Default: uber-trace-id jaeger-trace-context-header-name # Specifies the header name used for force sampling. Must be a string. Default: jaeger-debug-id jaeger-debug-header # Specifies the header name used to submit baggage if there is no root span. Must be a string. Default: jaeger-baggage jaeger-baggage-header # Specifies the header prefix used to propagate baggage. Must be a string. Default: uberctx- jaeger-tracer-baggage-header-prefix # specifies the port to use when uploading traces, Default 8126 datadog-collector-port # specifies the service name to use for any traces created, Default: nginx datadog-service-name # specifies the environment this trace belongs to, Default: prod datadog-environment # specifies the operation name to use for any traces collected, Default: nginx.handle datadog-operation-name-override # Specifies to use client-side sampling for distributed priority sampling and ignore sample rate, Default: true datadog-priority-sampling # specifies sample rate for any traces created, Default: 1.0 datadog-sample-rate
所有這些選項(包括主機)都允許環境變數,例如 $HOSTNAME或者 $HOST_IP. 在 Jaeger 的情況下,如果您在叢集中的每臺機器上執行一個 Jaeger 代理,您可以使用類似 $HOST_IP(它可以與 status.hostIPfieldPath會,如所描述 這裡 ),以確保跟蹤會被髮送到本地代理。
例子
以下示例展示瞭如何部署和測試不同的分散式跟蹤系統。 這些示例可以使用 Minikube 執行。
Zipkin
在 rnburn/zipkin-date-server(https://github.com/rnburn/zipkin-date-server) GitHub 儲存庫中是 dockerized 日期服務的示例。 要安裝示例和 Zipkin 收集器,請執行:
kubectl create -f https://raw.githubusercontent.com/rnburn/zipkin-date-server/master/kubernetes/zipkin.yaml
kubectl create -f https://raw.githubusercontent.com/rnburn/zipkin-date-server/master/kubernetes/deployment.yaml
我們還需要使用所需的值配置 NGINX 控制器 ConfigMap:
$ echo '
apiVersion: v1
kind: ConfigMap
data:
enable-opentracing: "true"
zipkin-collector-host: zipkin.default.svc.cluster.local
metadata:
name: ingress-nginx-controller
namespace: kube-system
' | kubectl replace -f -
在Zipkin介面我們可以看到詳細資訊:
Jaeger
在 Minikube 中啟用 Ingress 外掛:
$ minikube addons enable ingress
將 Minikube IP 新增到 /etc/hosts:
$ echo "$(minikube ip) example.com" | sudo tee -a /etc/hosts
應用基本服務和入口資源:
# Create Echoheaders Deployment
$ kubectl run echoheaders --image=k8s.gcr.io/echoserver:1.4 --replicas=1 --port=8080
# Expose as a Cluster-IP
$ kubectl expose deployment echoheaders --port=80 --target-port=8080 --name=echoheaders-x
# Apply the Ingress Resource
$ echo '
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: echo-ingress
spec:
rules:
- host: example.com
http:
paths:
- backend:
serviceName: echoheaders-x
servicePort: 80
path: /echo
' | kubectl apply -f -
啟用 OpenTracing 並設定 jaeger-collector-host:
$ echo '
apiVersion: v1
kind: ConfigMap
data:
enable-opentracing: "true"
jaeger-collector-host: jaeger-agent.default.svc.cluster.local
metadata:
name: ingress-nginx-controller
namespace: kube-system
' | kubectl replace -f -
應用 Jaeger 多合一模板:
$ kubectl apply -f https://raw.githubusercontent.com/jaegertracing/jaeger-kubernetes/master/all-in-one/jaeger-all-in-one-template.yml
向服務提出一些請求:
$ curl example.com/echo -d "meow"
CLIENT VALUES:
client_address=172.17.0.5
command=POST
real path=/echo
query=nil
request_version=1.1
request_uri=http://example.com:8080/echo
SERVER VALUES:
server_version=nginx: 1.10.0 - lua: 10001
HEADERS RECEIVED:
accept=*/*
connection=close
content-length=4
content-type=application/x-www-form-urlencoded
host=example.com
user-agent=curl/7.54.0
x-forwarded-for=192.168.99.1
x-forwarded-host=example.com
x-forwarded-port=80
x-forwarded-proto=http
x-original-uri=/echo
x-real-ip=192.168.99.1
x-scheme=http
BODY:
meow
檢視 Jaeger 使用者介面:
$ minikube service jaeger-query --url
http://192.168.99.100:30183
在Jaeger介面我們可以看到詳細資訊: