使用 Telemetry API 配置访问日志
Telemetry API 如今在 Istio 中作为核心 API 已经有一段时间了。 之前用户必须在 Istio 的 MeshConfig
中配置 Telemetry。
开始之前
按照安装指南中的说明安装 Istio。
如果您安装
demo
的安装配置, 则将启用 Egress Gateway 和访问日志。将 sleep 示例应用程序部署为发送请求的测试源。 如果您启用了自动 Sidecar 注入, 运行以下命令部署示例应用程序:
$ kubectl apply -f @samples/sleep/sleep.yaml@
否则,在使用以下命令部署
sleep
应用程序之前,手动注入 Sidecar:$ kubectl apply -f <(istioctl kube-inject -f @samples/sleep/sleep.yaml@)
您可以使用任何安装了
curl
的 Pod 作为测试源。为了发送请求,您需要创建
SOURCE_POD
环境变量来存储源 Pod 的名称:$ export SOURCE_POD=$(kubectl get pod -l app=sleep -o jsonpath={.items..metadata.name})
启动 Httpbin 样例程序。
如果您启用了 Sidecar 自动注入,通过以下命令部署
httpbin
服务:$ kubectl apply -f @samples/httpbin/httpbin.yaml@
否则,您必须在部署
httpbin
应用程序前进行手动注入,部署命令如下:$ 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
Telemetry 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
访问日志提供程序,我们除了默认设置外没有进行任何其他配置。禁用特定工作负载的访问日志
您可以使用以下配置禁用
sleep
服务的访问日志:$ cat <<EOF | kubectl apply -n default -f -
apiVersion: telemetry.istio.io/v1
kind: Telemetry
metadata:
name: disable-sleep-logging
namespace: default
spec:
selector:
matchLabels:
app: sleep
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-sleep-logging
spec:
selector:
matchLabels:
app: sleep
accessLogging:
- providers:
- name: otel
filter:
expression: response.code >= 500
EOF
当连接失败时没有
response.code
属性。 在这种情况下,您应该使用 CEL 表达式!has(response.code) || response.code >= 500
。通过 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 协议发送访问日志, 如此处所述。