• 在Istio中,到底怎么获取 Envoy 访问日志?


    Envoy 访问日志记录了通过 Envoy 进行请求 / 响应交互的相关记录,可以方便地了解具体通信过程和调试定位问题。

    环境准备

    部署 httpbin 服务:

    kubectl apply -f samples/httpbin/httpbin.yaml
    

    部署 sleep 服务:

    kubectl apply -f samples/sleep/sleep.yaml 
    

    httpbin 服务作为接收请求的服务端, sleep 服务作为发送请求的客户端。

    还需要开启 Envoy 访问日志,执行以下命令修改 istio 配置:

    kubectl -n istio-system edit configmap istio
    

    编辑yaml文件的对应配置:

    data:
      mesh: |-
        accessLogEncoding: JSON
        accessLogFile: /dev/stdout
    

    其中,accessLogEncoding表示 accesslog 输出格式,Istio 预定义了 TEXTJSON 两种日志输出格式。默认使用 TEXT,通常改成 JSON 以提升可读性;accessLogFile:表示 accesslog 输出位置,通常指定到 /dev/stdout (标准输出),以便使用 kubectl logs 来查看日志。

    保证yaml文件后,配置随即生效。

    文章持续更新,微信搜索「万猫学社」第一时间阅读,关注后回复「电子书」,免费获取12本Java必读技术书籍。

    测试访问日志

    sleep 服务中向 httpbin 服务发出请求:

    export SLEEP_POD=$(kubectl get pods -l app=sleep -o 'jsonpath={.items[0].metadata.name}')
    kubectl exec "$SLEEP_POD" -c sleep -- curl -sS http://httpbin:8000/headers
    

    返回结果如下:

    {
      "headers": {
        "Accept": "*/*", 
        "Host": "httpbin:8000", 
        "User-Agent": "curl/7.81.0-DEV", 
        "X-B3-Parentspanid": "ed0178f3e1f48dd1", 
        "X-B3-Sampled": "0", 
        "X-B3-Spanid": "6c38b689ee5ab0c8", 
        "X-B3-Traceid": "f17ce19c174cae85ed0178f3e1f48dd1", 
        "X-Envoy-Attempt-Count": "1", 
        "X-Forwarded-Client-Cert": "......"
      }
    }
    

    执行以下命令,查看sleep 服务的Envoy日志:

    kubectl logs -l app=sleep -c istio-proxy
    

    可以看到sleep服务对httpbin服务的调用的日志:

    {
         "authority": "httpbin:8000",
         "bytes_received": 0,
         "bytes_sent": 533,
         "connection_termination_details": null,
         "downstream_local_address": "172.24.146.239:8000",
         "downstream_remote_address": "172.24.158.25:49350",
         "duration": 3,
         "method": "GET",
         "path": "/headers",
         "protocol": "HTTP/1.1",
         "request_id": "ea40d320-348f-4f58-86d4-da157b0e0cca",
         "requested_server_name": null,
         "response_code": 200,
         "response_code_details": "via_upstream",
         "response_flags": "-",
         "route_name": "default",
         "start_time": "2022-07-04T10:00:09.401Z",
         "upstream_cluster": "outbound|8000||httpbin.istio-demo.svc.cluster.local",
         "upstream_host": "172.24.158.96:80",
         "upstream_local_address": "172.24.158.25:41812",
         "upstream_service_time": "2",
         "upstream_transport_failure_reason": null,
         "user_agent": "curl/7.81.0-DEV",
         "x_forwarded_for": null
    }
    

    执行以下命令,查看httpbin 服务的Envoy日志:

    kubectl logs -l app=httpbin -c istio-proxy
    

    可以看到httpbin服务被sleep服务调用的Envoy日志:

    {
         "authority": "httpbin:8000",
         "bytes_received": 0,
         "bytes_sent": 533,
         "connection_termination_details": null,
         "downstream_local_address": "172.24.158.96:80",
         "downstream_remote_address": "172.24.158.25:41812",
         "duration": 2,
         "method": "GET",
         "path": "/headers",
         "protocol": "HTTP/1.1",
         "request_id": "ea40d320-348f-4f58-86d4-da157b0e0cca",
         "requested_server_name": "outbound_.8000_._.httpbin.istio-demo.svc.cluster.local",
         "response_code": 200,
         "response_code_details": "via_upstream",
         "response_flags": "-",
         "route_name": "default",
         "start_time": "2022-07-04T10:00:09.401Z",
         "upstream_cluster": "inbound|80||",
         "upstream_host": "172.24.158.96:80",
         "upstream_local_address": "127.0.0.6:33665",
         "upstream_service_time": "1",
         "upstream_transport_failure_reason": null,
         "user_agent": "curl/7.81.0-DEV",
         "x_forwarded_for": null
    }
    

    看到这么多参数,是不是有点懵逼?没关系接下来,我们详细看看!

    文章持续更新,微信搜索「万猫学社」第一时间阅读,关注后回复「电子书」,免费获取12本Java必读技术书籍。

    刨析Envoy日志

    名称 HTTP TCP
    authority 请求授权头 未实现(“-”)
    bytes_received 接收到消息体字节数 在连接上从下游接收的字节数
    bytes_sent 发送的包体字节数 在连接上发送给下游的字节数
    connection_termination_details 连接中断详情 连接中断详情
    downstream_local_address 下游连接的本地地址 下游连接的本地地址
    downstream_remote_address 下游连接的远程地址 下游连接的远程地址
    duration 请求从起始时间到最后一个字节发出的持续总时长(以毫秒为单位) 下游连接的持续总时长(以毫秒为单位)
    method HTTP请求方法 未实现(“-”)
    path HTTP请求路径 未实现(“-”)
    protocol 协议,目前不是 HTTP/1.1 就是 HTTP/2 未实现(“-”)
    request_id 由envoy创建的 X-REQUEST-ID 请求头的值 未实现(“-”)
    requested_server_name 设置在 ssl 连接套接字上表示服务器名称指示 (SNI) 的字符值 未实现(“-”)
    response_code HTTP 响应码 未实现(“-”)
    response_code_details TTP 响应状态码详情提供关于响应状态码的附加信息。 未实现(“-”)
    response_flags 响应或者连接的附加详情 响应或者连接的附加详情
    route_name 路由名 路由名
    start_time 请求开始时间(包括毫秒) 下游连接开始时间(包括毫秒)
    upstream_cluster 上游主机所属的上游集群 上游主机所属的上游集群
    upstream_host 上游主机 URL 上游主机 URL
    upstream_local_address 上游连接的本地地址 上游连接的本地地址
    upstream_transport_failure_reason 如果上游因传输套接字而连接失败,从传输套接字中提供失败原因。 未实现(“-”)
    user_agent User-Agent请求头的值 未实现(“-”)
    x_forwarded_for X-Forwarded-For请求头的值 未实现(“-”)

    清理

    删除 httpbinsleep 服务:

    kubectl delete -f samples/httpbin/httpbin.yaml
    kubectl delete -f samples/sleep/sleep.yaml 
    

    微信公众号:万猫学社

    微信扫描二维码

    关注后回复「电子书」

    获取12本Java必读技术书籍

  • 相关阅读:
    Citus 分布式 PostgreSQL 集群 - SQL Reference(查询分布式表 SQL)
    怎么给视频去水印?手把手教你去水印
    Apifox日常使用(一键本地联调)
    Qt5开发及实例V2.0-第九章-Qt文件及磁盘处理
    Qt应用开发(基础篇)——菜单 QMenu
    UNIAPP实战项目笔记38 购物车的添加商品到购物车功能
    公司电脑强制休眠的3种解决方案
    Mybatis-Plus关于MYSQL中JSON字段的操作
    区块链的两个核心概念之一签名, 另一个是共识.
    远程办公中的IT女性:工作量增加3倍,离职率却下降近50%
  • 原文地址:https://www.cnblogs.com/heihaozi/p/17474045.html