Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Importante
此功能在 API 管理的“高级”和“开发人员”层中可用。
本文详细介绍如何为 Kubernetes 群集上部署的自承载网关配置本地指标和日志。 若要配置云指标和日志,请参阅本文。
自承载网关支持 StatsD,它已成为指标收集和聚合的统一协议。 本部分介绍将 StatsD 部署到 Kubernetes 的完整步骤,包含配置网关以通过 StatsD 发出指标,以及使用 Prometheus 监视指标。
下面的示例 YAML 配置用于将 StatsD 和 Prometheus 部署到已部署了自承载网关的 Kubernetes 群集。 它还会为每个群集创建一个服务。 然后,自承载网关将指标发布到 StatsD 服务。 我们将通过 Prometheus 的服务访问其仪表板。
Nota
以下示例从 Docker Hub 拉取公共容器映像。 建议设置一个拉取密钥,以使用 Docker Hub 帐户进行身份验证,而不是发出匿名拉取请求。 若要在使用公共内容时提高可靠性,请在专用 Azure 容器注册表中导入和管理映像。 详细了解如何使用公共映像。
apiVersion: v1
kind: ConfigMap
metadata:
name: sputnik-metrics-config
data:
statsd.yaml: ""
prometheus.yaml: |
global:
scrape_interval: 3s
evaluation_interval: 3s
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'test_metrics'
static_configs:
- targets: ['localhost:9102']
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: sputnik-metrics
spec:
replicas: 1
selector:
matchLabels:
app: sputnik-metrics
template:
metadata:
labels:
app: sputnik-metrics
spec:
containers:
- name: sputnik-metrics-statsd
image: prom/statsd-exporter
ports:
- name: tcp
containerPort: 9102
- name: udp
containerPort: 8125
protocol: UDP
args:
- --statsd.mapping-config=/tmp/statsd.yaml
- --statsd.listen-udp=:8125
- --web.listen-address=:9102
volumeMounts:
- mountPath: /tmp
name: sputnik-metrics-config-files
- name: sputnik-metrics-prometheus
image: prom/prometheus
ports:
- name: tcp
containerPort: 9090
args:
- --config.file=/tmp/prometheus.yaml
volumeMounts:
- mountPath: /tmp
name: sputnik-metrics-config-files
volumes:
- name: sputnik-metrics-config-files
configMap:
name: sputnik-metrics-config
---
apiVersion: v1
kind: Service
metadata:
name: sputnik-metrics-statsd
spec:
type: NodePort
ports:
- name: udp
port: 8125
targetPort: 8125
protocol: UDP
selector:
app: sputnik-metrics
---
apiVersion: v1
kind: Service
metadata:
name: sputnik-metrics-prometheus
spec:
type: LoadBalancer
ports:
- name: http
port: 9090
targetPort: 9090
selector:
app: sputnik-metrics
将配置保存到名为 metrics.yaml
的文件。 使用以下命令将所有项部署到群集:
kubectl apply -f metrics.yaml
部署完成后,运行以下命令来检查 Pod 是否正在运行。 Pod 名称将有所不同。
kubectl get pods
NAME READY STATUS RESTARTS AGE
sputnik-metrics-f6d97548f-4xnb7 2/2 Running 0 1m
运行以下命令来检查 services
是否正在运行。 记下 StatsD 服务的 CLUSTER-IP
和 PORT
,稍后需要使用它们。 可以使用 Prometheus 的 EXTERNAL-IP
和 PORT
访问其仪表板。
kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
sputnik-metrics-prometheus LoadBalancer 10.0.252.72 13.89.141.90 9090:32663/TCP 18h
sputnik-metrics-statsd NodePort 10.0.41.179 <none> 8125:32733/UDP 18h
部署了 StatsD 和 Prometheus 后,便可以更新自承载网关的配置,以开始通过 StatsD 发出指标。 可以通过其他选项使用自承载网关部署的 ConfigMap 中的 telemetry.metrics.local
密钥来启用或禁用此功能。 下面是可用的选项:
字段 | 默认 | 说明 |
---|---|---|
telemetry.metrics.local | none |
通过 StatsD 启用日志记录。 值可以是 none 、statsd 。 |
telemetry.metrics.local.statsd.endpoint | 不适用 | 指定 StatsD 终结点。 |
telemetry.metrics.local.statsd.sampling | 不适用 | 指定指标采样率。 值可以介于 0 和 1。 示例: 0.5 |
telemetry.metrics.local.statsd.tag-format | 不适用 | StatsD 导出程序标记格式。 值可以是 none 、librato 、dogStatsD 、influxDB 。 |
下面是一个示例配置:
apiVersion: v1
kind: ConfigMap
metadata:
name: contoso-gateway-environment
data:
config.service.endpoint: "<self-hosted-gateway-management-endpoint>"
telemetry.metrics.local: "statsd"
telemetry.metrics.local.statsd.endpoint: "10.0.41.179:8125"
telemetry.metrics.local.statsd.sampling: "1"
telemetry.metrics.local.statsd.tag-format: "dogStatsD"
通过上述配置更新自承载网关部署的 YAML 文件,并使用以下命令应用更改:
kubectl apply -f <file-name>.yaml
若要选取最新的配置更改,请使用以下命令重启网关部署:
kubectl rollout restart deployment/<deployment-name>
现在,我们已部署并配置了所有内容,自承载网关应通过 StatsD 报告指标。 然后,Prometheus 从 StatsD 中选取指标。 使用 Prometheus 服务的 EXTERNAL-IP
和 PORT
转到 Prometheus 仪表板。
通过自承载网关进行一些 API 调用,如果所有内容都已正确配置,则应该能够查看以下指标:
指标 | 说明 |
---|---|
requests_total | 期间内的 API 请求数 |
request_duration_seconds | 从网关收到请求到响应全部发送出去经过的时间(毫秒) |
request_backend_duration_seconds | 花在整个后端 IO(连接、发送和接收字节)上的时间(毫秒) |
request_client_duration_seconds | 花在整个客户端 IO(连接、发送和接收字节)上的时间(毫秒) |
默认情况下,自承载网关会将日志输出到 stdout
和 stderr
。 可以使用以下命令轻松查看日志:
kubectl logs <pod-name>
如果自承载网关部署在 Azure Kubernetes 服务中,则可以启用适用于容器的 Azure Monitor,以便从工作负载收集 stdout
和 stderr
并查看 Log Analytics 中的日志。
自承载网关还支持许多协议,包括 localsyslog
、rfc5424
和 journal
。 下表汇总了所有支持的选项。
字段 | 默认 | 说明 |
---|---|---|
telemetry.logs.std | text |
启用到标准流的日志记录。 值可以是 none 、text 、json |
telemetry.logs.local | auto |
启用本地日志记录。 值可以是 none 、auto 、localsyslog 、rfc5424 、journal 、json |
telemetry.logs.local.localsyslog.endpoint | 不适用 | 指定本地 syslog 终结点。 有关详细信息,请参阅使用本地 syslog 日志。 |
telemetry.logs.local.localsyslog.facility | 不适用 | 指定 localsyslog 设备代码。 例如,7 |
telemetry.logs.local.rfc5424.endpoint | 不适用 | 指定 rfc5424 终结点。 |
telemetry.logs.local.rfc5424.facility | 不适用 | 指定每个 rfc5424 的设备代码。 示例: 7 |
telemetry.logs.local.journal.endpoint | 不适用 | 指定日志终结点。 |
telemetry.logs.local.json.endpoint | 127.0.0.1:8888 | 指定接受 JSON 数据的 UDP 终结点:文件路径、IP:端口或主机名:端口。 |
下面是本地日志记录的示例配置:
apiVersion: v1
kind: ConfigMap
metadata:
name: contoso-gateway-environment
data:
config.service.endpoint: "<self-hosted-gateway-management-endpoint>"
telemetry.logs.std: "text"
telemetry.logs.local.localsyslog.endpoint: "/dev/log"
telemetry.logs.local.localsyslog.facility: "7"
- 对于本地诊断,我们最多只支持 3072 字节的请求/响应有效负载。 超过此限制可能会因分块而破坏 JSON 格式。
将本地 syslog 用作日志的目标时,运行时需要允许将日志流式传输到目标。 对于 Kubernetes,需要装载与目标匹配的卷。
假设使用以下配置:
apiVersion: v1
kind: ConfigMap
metadata:
name: contoso-gateway-environment
data:
config.service.endpoint: "<self-hosted-gateway-management-endpoint>"
telemetry.logs.local: localsyslog
telemetry.logs.local.localsyslog.endpoint: /dev/log
可以轻松地开始将日志流式传输到该本地 syslog 终结点:
apiVersion: apps/v1
kind: Deployment
metadata:
name: contoso-deployment
labels:
app: contoso
spec:
replicas: 1
selector:
matchLabels:
app: contoso
template:
metadata:
labels:
app: contoso
spec:
containers:
name: azure-api-management-gateway
image: mcr.microsoft.com/azure-api-management/gateway:2.5.0
imagePullPolicy: IfNotPresent
envFrom:
- configMapRef:
name: contoso-gateway-environment
# ... redacted ...
+ volumeMounts:
+ - mountPath: /dev/log
+ name: logs
+ volumes:
+ - hostPath:
+ path: /dev/log
+ type: Socket
+ name: logs
当配置为在 Azure Kubernetes 服务上使用本地 syslog 时,可以选择两种方法来浏览日志:
- 连接和浏览工作器节点上的日志
可以通过获取对工作器节点的访问权限来轻松使用它们:
- 创建与节点的 SSH 连接(文档)
- 可在
host/var/log/syslog
下找到日志
例如,可以将所有 syslog 筛选为仅保留来自自承载网关的 syslog:
$ cat host/var/log/syslog | grep "apimuser"
May 15 05:54:20 aks-agentpool-43853532-vmss000000 apimuser[8]: Timestamp=2023-05-15T05:54:20.0445178Z, isRequestSuccess=True, totalTime=290, category=GatewayLogs, callerIpAddress=141.134.132.243, timeGenerated=2023-05-15T05:54:20.0445178Z, region=Repro, correlationId=b28565ec-73e0-41e6-9312-efcdd6841846, method=GET, url="http://20.126.242.200/echo/resource?param1\=sample", backendResponseCode=200, responseCode=200, responseSize=628, cache=none, backendTime=287, apiId=echo-api, operationId=retrieve-resource, apimSubscriptionId=master, clientProtocol=HTTP/1.1, backendProtocol=HTTP/1.1, apiRevision=1, backendMethod=GET, backendUrl="http://echoapi.chinacloudapp.cn/api/resource?param1\=sample"
May 15 05:54:21 aks-agentpool-43853532-vmss000000 apimuser[8]: Timestamp=2023-05-15T05:54:21.1189171Z, isRequestSuccess=True, totalTime=150, category=GatewayLogs, callerIpAddress=141.134.132.243, timeGenerated=2023-05-15T05:54:21.1189171Z, region=Repro, correlationId=ab4d7464-acee-40ae-af95-a521cc57c759, method=GET, url="http://20.126.242.200/echo/resource?param1\=sample", backendResponseCode=200, responseCode=200, responseSize=628, cache=none, backendTime=148, apiId=echo-api, operationId=retrieve-resource, apimSubscriptionId=master, clientProtocol=HTTP/1.1, backendProtocol=HTTP/1.1, apiRevision=1, backendMethod=GET, backendUrl="http://echoapi.chinacloudapp.cn/api/resource?param1\=sample"
Nota
如果使用 chroot
更改了根(例如 chroot /host
),则上述路径需要反映该更改。
- 了解 Azure API 管理网关的可观测性功能。
- 详细了解 Azure API 管理自承载网关。
- 了解如何在云中配置和保存日志。