在Istio中,到底怎麼獲取 Envoy 存取紀錄檔?

2023-06-12 09:00:17

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必讀技術書籍