1. 程式人生 > 其它 >【K8s教程】Nginx Ingress 控制器通過 OpenTracing 專案進行分散式跟蹤說明

【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介面我們可以看到詳細資訊:

作者:Varden 出處:http://www.cnblogs.com/varden/ 本文內容如有雷同,請聯絡作者! 本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利。