如何在启用Anthos Service Mesh的GKE上禁用Istio服务间请求日志?
如何禁用Anthos Service Mesh上Istio服务间通信的请求日志
问题描述
搭建启用Anthos Service Mesh(ASM)的GKE集群后,服务间所有通信记录都会被自动上报到GCP日志摄入系统,可在Logs Dashboard中查看,日志样例如下:
这类日志无实际使用价值,还会产生日志摄入相关费用,需要找到关闭方式。
解决方案
你看到的这类日志是ASM默认启用的Envoy Sidecar访问日志,默认输出到标准输出后由GKE节点的日志采集代理自动上报到Cloud Logging,可根据需求选择以下三种方式关闭:
1. 全网格全局关闭访问日志
适用于完全不需要服务网格访问日志的场景,修改控制平面配置即可生效:
- 若使用GCP托管式ASM,执行命令编辑控制平面ConfigMap:
kubectl edit configmap istio-asm-managed -n istio-system - 若使用自行部署的非托管ASM,执行命令编辑对应ConfigMap:
kubectl edit configmap istio -n istio-system - 在
data.mesh配置段中找到accessLogFile字段,默认值为/dev/stdout,将该字段值改为空字符串,或直接注释掉该配置项后保存退出。 - 配置下发后新创建的Pod会自动应用配置,存量业务Pod需要滚动重启后才会停止输出访问日志。
2. 按命名空间/工作负载粒度关闭访问日志
如果需要保留部分业务的访问日志,仅关闭特定范围的日志上报,可使用Istio官方推荐的Telemetry CRD配置,无需重启Pod即可热生效:
- 关闭指定命名空间下所有工作负载的访问日志,在目标命名空间部署以下资源:
apiVersion: telemetry.istio.io/v1alpha1 kind: Telemetry metadata: name: disable-accesslog namespace: <替换为目标命名空间名称> spec: accessLogging: - disabled: true providers: - name: envoy
- 仅关闭指定工作负载的访问日志,添加
selector字段匹配工作负载标签即可,示例:
apiVersion: telemetry.istio.io/v1alpha1 kind: Telemetry metadata: name: disable-accesslog namespace: <目标工作负载所在命名空间> spec: selector: matchLabels: app: <替换为目标工作负载的app标签值> accessLogging: - disabled: true providers: - name: envoy
执行kubectl apply -f <上述yaml文件路径>后,等待1-2分钟配置即可生效。
3. GCP日志路由侧丢弃日志(不修改ASM配置)
如果不想改动服务网格的任何配置,可直接在Cloud Logging侧配置排除规则,拦截这类日志写入存储,同样不会产生日志摄入费用:
- 进入GCP控制台日志路由器页面,找到GKE集群关联的
_Default日志接收器,选择编辑排除过滤器 - 添加如下过滤规则匹配ASM服务间通信日志:
logName=~"projects/.*/logs/stdout" jsonPayload.destination_service != "" jsonPayload.source_app != "" resource.type="k8s_container"
保存规则后,匹配到的日志会被直接丢弃,不会产生存储和摄入费用。
注意:该方式下Envoy Sidecar仍会在节点本地输出访问日志,会占用少量节点本地磁盘空间,优先推荐前两种ASM侧的配置方案。
生效验证
配置完成后等待3-5分钟,在Logs Dashboard中检索对应日志,若无新的服务间通信日志产生,说明配置已生效,后续不会再产生该部分日志的相关费用。
内容的提问来源于stack exchange,提问作者Mauricio
相关产品推荐
相关产品推荐

