使用遥测 API 配置访问日志
遥测 API 已经成为 Istio 中的一流 API 很长时间了。以前,用户必须在 Istio 配置的 MeshConfig
部分配置遥测。
开始之前
按照 安装指南 中的说明设置 Istio。
部署curl 示例应用,用作发送请求的测试源。如果您已启用自动 sidecar 注射,请运行以下命令部署示例应用
$ kubectl apply -f @samples/curl/curl.yaml@
否则,在使用以下命令部署
curl
应用之前,请手动注入 sidecar$ kubectl apply -f <(istioctl kube-inject -f @samples/curl/curl.yaml@)
将
SOURCE_POD
环境变量设置为源 Pod 的名称$ export SOURCE_POD=$(kubectl get pod -l app=curl -o jsonpath={.items..metadata.name})
启动httpbin 示例。
如果您已启用自动 sidecar 注射,请部署
httpbin
服务$ kubectl apply -f @samples/httpbin/httpbin.yaml@
否则,您需要在部署
httpbin
应用之前手动注入 sidecar$ kubectl apply -f <(istioctl kube-inject -f @samples/httpbin/httpbin.yaml@)
安装
在本例中,我们将日志发送到Grafana Loki,因此请确保已安装。
$ istioctl install -f @samples/open-telemetry/loki/iop.yaml@ --skip-confirmation
$ kubectl apply -f @samples/addons/loki.yaml@ -n istio-system
$ kubectl apply -f @samples/open-telemetry/loki/otel.yaml@ -n istio-system
使用遥测 API 入门
启用访问日志
$ cat <<EOF | kubectl apply -n istio-system -f - apiVersion: telemetry.istio.io/v1 kind: Telemetry metadata: name: mesh-logging-default spec: accessLogging: - providers: - name: otel EOF
上面的示例使用内置的
envoy
访问日志提供程序,我们没有配置任何内容,除了默认设置之外。禁用特定工作负载的访问日志
您可以使用以下配置禁用
curl
服务的访问日志$ cat <<EOF | kubectl apply -n default -f - apiVersion: telemetry.istio.io/v1 kind: Telemetry metadata: name: disable-curl-logging namespace: default spec: selector: matchLabels: app: curl accessLogging: - providers: - name: otel disabled: true EOF
使用工作负载模式筛选访问日志
您可以使用以下配置禁用
httpbin
服务的入站访问日志$ cat <<EOF | kubectl apply -n default -f - apiVersion: telemetry.istio.io/v1 kind: Telemetry metadata: name: disable-httpbin-logging spec: selector: matchLabels: app: httpbin accessLogging: - providers: - name: otel match: mode: SERVER disabled: true EOF
使用 CEL 表达式筛选访问日志
以下配置仅在响应代码大于或等于 500 时显示访问日志
$ cat <<EOF | kubectl apply -n default -f - apiVersion: telemetry.istio.io/v1alpha1 kind: Telemetry metadata: name: filter-curl-logging spec: selector: matchLabels: app: curl accessLogging: - providers: - name: otel filter: expression: response.code >= 500 EOF
使用 CEL 表达式设置默认筛选访问日志
以下配置仅在响应代码大于或等于 400 或请求发送到 BlackHoleCluster 或 PassthroughCluster 时显示访问日志:注意:
xds.cluster_name
仅在 Istio 1.16.2 及更高版本中可用$ cat <<EOF | kubectl apply -f - apiVersion: telemetry.istio.io/v1alpha1 kind: Telemetry metadata: name: default-exception-logging namespace: istio-system spec: accessLogging: - providers: - name: otel filter: expression: "response.code >= 400 || xds.cluster_name == 'BlackHoleCluster' || xds.cluster_name == 'PassthroughCluster' " EOF
使用 CEL 表达式筛选健康检查访问日志
以下配置仅在日志不是由 Amazon Route 53 健康检查服务生成时显示访问日志。注意:
request.useragent
特定于 HTTP 流量,因此为了避免破坏 TCP 流量,我们需要检查该字段是否存在。有关更多信息,请参见CEL 类型检查$ cat <<EOF | kubectl apply -f - apiVersion: telemetry.istio.io/v1alpha1 kind: Telemetry metadata: name: filter-health-check-logging spec: accessLogging: - providers: - name: otel filter: expression: "!has(request.useragent) || !(request.useragent.startsWith("Amazon-Route53-Health-Check-Service"))" EOF
有关更多信息,请参见使用表达式作为值
使用 OpenTelemetry 提供程序
Istio 支持使用OpenTelemetry 协议发送访问日志,如此处所述。
清理
删除所有遥测 API
$ kubectl delete telemetry --all -A
删除
loki
$ kubectl delete -f @samples/addons/loki.yaml@ -n istio-system $ kubectl delete -f @samples/open-telemetry/loki/otel.yaml@ -n istio-system
从集群中卸载 Istio
$ istioctl uninstall --purge --skip-confirmation