要求 Proxy 記錄
Cloud Service Mesh 頁面提供 Cloud Logging 中兩種不同類型的記錄檔連結:存取記錄 (也稱為 Envoy 記錄) 和流量記錄 (也稱為 Google Cloud 觀測功能存取記錄)。
存取記錄檔
啟用存取記錄
啟用存取記錄所需的步驟取決於 Cloud Service Mesh 類型 (受管理或叢集內):
代管
請按照操作說明啟用受管理的 Cloud Service Mesh 中的存取記錄。
叢集內
請按照操作說明啟用叢集內 Cloud Service Mesh 的存取記錄。
查看存取記錄檔
如要在記錄檔探索工具中查看存取記錄,請按照下列步驟操作:
前往「Logs Explorer」(記錄檔探索工具):
選取適當的 Google Cloud 專案。
執行以下查詢:
resource.type="k8s_container" \ resource.labels.container_name="istio-proxy" resource.labels.cluster_name="CLUSTER_NAME" \ resource.labels.namespace_name="NAMESPACE_NAME" \ resource.labels.pod_name="POD_NAME"
流量記錄檔
啟用流量記錄檔
根據預設,系統會啟用流量記錄檔,除非 Cloud Service Mesh 已安裝在Google Distributed Cloud 搭配 Istio CA (舊稱 Citadel) 上。
如要在 Google Distributed Cloud 上啟用流量記錄,並使用 Istio CA,請在安裝叢集內 Cloud Service Mesh 時使用 --option stackdriver
標記。或者,您也可以在安裝叢集內 Cloud Service Mesh後,使用 Istio CA 在 Google Distributed Cloud 上啟用流量記錄。
查看流量記錄
在記錄檔探索工具中查看流量記錄
如要在 記錄檔探索工具中查看流量記錄,請按照下列步驟操作:
前往「Logs Explorer」(記錄檔探索工具):
選取適當的 Google Cloud 專案。
視您要查看用戶端還是伺服器存取記錄而定,執行下列查詢:
伺服器紀錄
resource.labels.cluster_name="CLUSTER_NAME" logName="projects/PROJECT_NAME/logs/server-accesslog-stackdriver"
用戶端記錄
resource.labels.cluster_name="CLUSTER_NAME" logName="projects/PROJECT_NAME/logs/client-accesslog-stackdriver"
在 Anthos 服務網格頁面中查看流量記錄
如要在指定時間範圍內,查看服務的 Cloud Service Mesh 頁面中的流量記錄,請按照下列步驟操作:
前往 Google Cloud 控制台的「Cloud Service Mesh」頁面。
在「服務」下方,選取要檢查的服務名稱。
前往「指標」頁面。
從「時間範圍」下拉式選單指定時間範圍,或使用時間軸設定自訂範圍。
按一下「查看流量記錄」。
流量記錄檔的名稱為 server-accesslog-stackdriver,並附加至服務使用的對應監控資源 (k8s_container 或 gce_instance)。流量記錄包含下列資訊:
HTTP 要求屬性,例如 ID、網址、大小、延遲時間和常見標頭。
來源和目的地工作負載資訊,例如名稱、命名空間、身分和常見標籤。
如果啟用追蹤功能,則會顯示追蹤資訊,例如取樣、追蹤 ID 和跨度 ID。
記錄項目範例如下:
{ insertId: "1awb4hug5pos2qi" httpRequest: { requestMethod: "GET" requestUrl: "YOUR-INGRESS/productpage" requestSize: "952" status: 200 responseSize: "5875" remoteIp: "10.8.0.44:0" serverIp: "10.56.4.25:9080" latency: "1.587232023s" protocol: "http" } resource: { type: "k8s_container" labels: { location: "us-central1-a" project_id: "YOUR-PROJECT" pod_name: "productpage-v1-76589d9fdc-ptnt9" cluster_name: "YOUR-CLUSTER-NAME" container_name: "productpage" namespace_name: "default" } } timestamp: "2020-04-28T19:55:21.056759Z" severity: "INFO" labels: { destination_principal: "spiffe://cluster.local/ns/default/sa/bookinfo-productpage" response_flag: "-" destination_service_host: "productpage.default.svc.cluster.local" source_app: "istio-ingressgateway" service_authentication_policy: "MUTUAL_TLS" source_name: "istio-ingressgateway-5ff85d8dd8-mwplb" mesh_uid: "YOUR-MESH-UID" request_id: "021ce752-9001-4ac6-b6d6-3b15f5d3632" destination_namespace: "default" source_principal: "spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account" destination_workload: "productpage-v1" destination_version: "v1" source_namespace: "istio-system" source_workload: "istio-ingressgateway" destination_name: "productpage-v1-76589d9fdc-ptnt9" destination_app: "productpage" } trace: "projects/YOUR-PROJECT/traces/d4197f59b7a43e3aeff3571bac99d536" receiveTimestamp: "2020-04-29T03:07:14.362416217Z" spanId: "43226343ca2bb2b1" traceSampled: true logName: "projects/YOUR-PROJECT/logs/server-accesslog-stackdriver" receiveTimestamp: "2020-04-28T19:55:32.185229100Z" }
解讀 Anthos 服務網格遙測資料
以下各節將說明如何查看網格狀態,並檢查各種遙測資料,其中包含有助於排除問題的詳細資訊。
解讀控制層指標
使用叢集內控制層安裝 Cloud Service Mesh 時,istiod
預設會將指標匯出至 Google Cloud Observability 進行監控。istiod
會在這些指標前方加上 istio.io/control
,並提供控制平面狀態的深入分析資訊,例如與每個控制平面執行個體連線的 Proxy 數量、設定事件、推送和驗證。
請按照下列步驟觀察或排解控制平面問題。
載入範例資訊主頁:
git clone https://github.com/GoogleCloudPlatform/monitoring-dashboard-samples && cd monitoring-dashboard-samples/dashboards && git checkout servicemesh
安裝 Cloud Service Mesh 資訊主頁:
gcloud monitoring dashboards create --config-from-file=dashboards/servicemesh/anthos-service-mesh-control-plane-monitoring.json
在清單中找出名為
Istio Control Plane Dashboard
的資訊主頁。詳情請參閱「查看已安裝的資訊主頁」。
如需可用指標的完整清單,請參閱「匯出的指標」。
診斷設定延遲問題
下列步驟說明如何使用 pilot_proxy_convergence_time
指標,診斷設定變更與所有 Proxy 收斂之間的延遲。
在 Pod 中執行殼層指令:
kubectl exec -it $(kubectl get pod -l app=pilot -o jsonpath='{.items[0].metadata.name}' -n istio-system) -n istio-system -c istio-proxy -- curl -s
在指標中存取
convergence
的localhost:15014
和grep
:curl http://localhost:15014/metrics | grep convergence
解讀 Google Cloud Observability 存取記錄
以下說明如何使用 Google Cloud 觀測功能存取記錄來排解連線問題。根據預設,Google Cloud 觀測功能的存取/流量記錄會啟用。
Cloud Service Mesh 會將資料匯出至 Google Cloud 可觀測性存取記錄,協助您偵錯下列類型的問題:
- 流量流向和失敗
- 端對端要求轉送
根據預設,Google Kubernetes Engine 上的 Cloud Service Mesh 安裝作業會啟用 Google Cloud 觀測功能存取記錄。您可以重新執行 asmcli install
,啟用 Google Cloud Observability 存取記錄。使用與原先安裝相同的選項,但省略停用 Stackdriver 的自訂疊加層。
存取記錄分為兩種類型:
伺服器存取記錄可提供伺服器端的請求檢視畫面。這些指令碼位於
server-accesslog-stackdriver
下方,並附加至k8s_container
監控的資源。請使用下列網址語法,顯示伺服器端存取記錄:https://console.cloud.google.com/logs/viewer?advancedFilter=logName="projects/PROJECT_ID/logs/server-accesslog-stackdriver"&project=PROJECT_ID
用戶端存取記錄會提供要求的用戶端端檢視畫面。這些檔案位於
client-accesslog-stackdriver
下方,並附加至k8s_pod
受控資源。使用下列網址語法,即可顯示用戶端存取記錄:https://console.cloud.google.com/logs/viewer?advancedFilter=logName="projects/PROJECT_ID/logs/client-accesslog-stackdriver"&project=PROJECT_ID
存取記錄包含下列資訊:
- HTTP 要求屬性,例如 ID、網址、大小、延遲時間和常見標頭。
- 來源和目的地工作負載資訊,例如名稱、命名空間、身分和常見標籤。
- 來源和目的地的標準服務和修訂版本資訊。
- 如果啟用追蹤功能,記錄會包含追蹤資訊,例如取樣、追蹤 ID 和時距 ID。
在 Google Cloud Observability 存取記錄中顯示的資訊,源自於您在 Istio 設定中啟用的 Envoy 存取記錄。這些檔案包含下列標頭:
route_name
upstream_cluster
X-Envoy-Original-Path
X-Envoy-Original-Host
以下是記錄項目範例:
{ "insertId": "1j84zg8g68vb62z", "httpRequest": { "requestMethod": "GET", "requestUrl": "http://35.235.89.201:80/productpage", "requestSize": "795", "status": 200, "responseSize": "7005", "remoteIp": "10.168.0.26:0", "serverIp": "10.36.3.153:9080", "latency": "0.229384205s", "protocol": "http" }, "resource": { "type": "k8s_container", "labels": { "cluster_name": "istio-e2e22", "namespace_name": "istio-bookinfo-1-68819", "container_name": "productpage", "project_id": "***", "location": "us-west2-a", "pod_name": "productpage-v1-64794f5db4-8xbtf" } }, "timestamp": "2020-08-13T21:37:42.963881Z", "severity": "INFO", "labels": { "protocol": "http", "upstream_host": "127.0.0.1:9080", "source_canonical_service": "istio-ingressgateway", "source_namespace": "istio-system", "x-envoy-original-path": "", "source_canonical_revision": "latest", "connection_id": "32", "upstream_cluster": "inbound|9080|http|productpage.istio-bookinfo-1-68819.svc.cluster.local", "requested_server_name": "outbound_.9080_._.productpage.istio-bookinfo-1-68819.svc.cluster.local", "destination_version": "v1", "destination_workload": "productpage-v1", "source_workload": "istio-ingressgateway", "destination_canonical_revision": "v1", "mesh_uid": "cluster.local", "source_principal": "spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account", "x-envoy-original-dst-host": "", "service_authentication_policy": "MUTUAL_TLS", "destination_principal": "spiffe://cluster.local/ns/istio-bookinfo-1-68819/sa/bookinfo-productpage", "response_flag": "-", "log_sampled": "false", "destination_service_host": "productpage.istio-bookinfo-1-68819.svc.cluster.local", "destination_name": "productpage-v1-64794f5db4-8xbtf", "destination_canonical_service": "productpage", "destination_namespace": "istio-bookinfo-1-68819", "source_name": "istio-ingressgateway-6845f6d664-lnfvp", "source_app": "istio-ingressgateway", "destination_app": "productpage", "request_id": "39013650-4e62-9be2-9d25-78682dd27ea4", "route_name": "default" }, "logName": "projects/***/logs/server-accesslog-stackdriver", "trace": "projects/***t/traces/466d77d15753cb4d7749ba5413b5f70f", "receiveTimestamp": "2020-08-13T21:37:48.758673203Z", "spanId": "633831cb1fda4fd5", "traceSampled": true }
您可以透過多種方式使用這份記錄:
- 整合 Cloud Trace,這是 Cloud Service Mesh 中的選用功能。
- 將流量記錄匯出至 BigQuery,以便執行「選取所有要求超過 5 秒」等查詢。
- 建立記錄指標。
- 排解
404
和503
錯誤
排解 404
和 503
錯誤
以下範例說明如何在要求失敗並顯示 404
或 503
回應碼時,使用這份記錄來排解問題。
在用戶端存取記錄中搜尋類似下列的項目:
httpRequest: { requestMethod: "GET" requestUrl: "://IP_ADDRESS/src/Util/PHP/eval-stdin.php" requestSize: "2088" status: 404 responseSize: "75" remoteIp: "10.168.0.26:34165" serverIp: "10.36.3.149:8080" latency: "0.000371440s" protocol: "http" }
前往存取記錄項目中的標籤。找出如下所示的
response_flag
欄位:response_flag: "NR"
NR
值是NoRoute
的縮寫,表示找不到目的地路徑,或沒有相符的下游連線篩選器鏈結。同樣地,您也可以使用response_flag
標籤來排解503
錯誤。如果您在用戶端和伺服器存取記錄中都看到
503
錯誤,請確認為每項服務設定的通訊埠名稱,與兩者之間使用的通訊協定名稱相符。舉例來說,如果 golang 二進位檔用戶端使用 HTTP 連線至 golang 伺服器,但通訊埠名稱為http2
,則通訊協定不會正確自動協商。
詳情請參閱回應標記。
解讀存取記錄檔
下列步驟說明如何使用存取記錄 (也稱為 Envoy 代理程式記錄),針對連線兩端之間的流量顯示資訊,以利排除問題。
存取記錄可用於診斷下列問題:
- 流量流向和失敗
- 端對端要求轉送
根據預設,Cloud Service Mesh 不會啟用存取記錄,且只能在整個網格中啟用。
您可以在應用程式中產生可觸發 HTTP 要求的活動,然後在來源或目的地記錄中檢查相關要求,藉此排解連線/要求失敗問題。
如果您觸發要求,並且該要求出現在來源 Proxy 記錄中,表示 iptables
流量重新導向功能運作正常,且 Envoy Proxy 正在處理流量。如果您在記錄中看到錯誤,請產生 Envoy 設定傾印,並檢查 Envoy 叢集設定,確保設定正確無誤。如果您看到要求,但記錄中沒有錯誤,請改為檢查目的地 Proxy 記錄。
如果要求出現在目的地 Proxy 記錄中,表示網格本身運作正常。如果您看到錯誤,請執行 Envoy 設定傾印,並驗證在事件監聽器設定中設定的流量通訊埠的正確值。
如果在執行上述步驟後問題仍未解決,Envoy 可能無法自動協商 sidecar 與其應用程式 Pod 之間的通訊協定。請確認 Kubernetes 服務通訊埠名稱 (例如 http-80
) 與應用程式使用的通訊協定相符。
使用記錄檔探索工具查詢記錄檔
您可以使用記錄檔探索工具介面查詢特定存取記錄。舉例來說,如要查詢已啟用 MULTUAL_TLS
且使用 grpc
通訊協定的所有要求,請在伺服器存取記錄查詢中附加以下內容:
labels.protocol="grpc" labels.service_authentication_policy="MULTUAL_TLS"
設定存取記錄政策
如要為受管理的 Cloud Service Mesh 設定 Proxy 記錄,請參閱 Envoy 存取記錄。
如要使用叢集內控制層為 Cloud Service Mesh 設定存取記錄政策,請按照下列步驟操作:
建立
IstioOperator
自訂疊加檔案,其中包含適用於您情境的AccessLogPolicyConfig
值。使用
--custom_overlay
選項將這個檔案傳遞至asmcli
,以便更新叢集內控制層設定。如要瞭解如何搭配自訂疊加檔案執行asmcli install
,請參閱「安裝選用功能」。
查看服務或工作負載專屬資訊
如果您遇到的是特定服務或工作負載的問題,而非網格全域的問題,請檢查個別 Envoy 代理程式,並從中收集相關資訊。如要收集特定工作負載及其 Proxy 的相關資訊,您可以使用 pilot-agent
:
kubectl exec POD_NAME -n NAMESPACE_NAME -c istio-proxy -- pilot-agent request GET SCOPE
在這個範例中,SCOPE 是下列其中一種:
certs
- Envoy 例項中的憑證clusters
:已設定 Envoy 的叢集config_dump
:轉儲 Envoy 設定listeners
- 已設定 Envoy 的事件監聽器logging
- 查看及變更記錄設定stats
- Envoy 統計資料stats/prometheus
- Envoy 統計資料做為 Prometheus 記錄
查看 Proxy 通訊端口狀態
您可以使用下列程序,直接檢查 Envoy 代理程式通訊端的狀態。
顯示已建立的通訊端口清單,包括
TIME_WAIT
狀態中的通訊端口,如果數量過多,可能會對可擴充性造成負面影響:kubectl exec POD_NAME -n NAMESPACE_NAME -c istio-proxy -- ss -anopim
顯示 Socket 統計資料摘要:
kubectl exec POD_NAME -n NAMESPACE_NAME -c istio-proxy -- ss -s
詳情請參閱「ss 指令簡介」。
istio-proxy
和 istio-init
記錄
此外,請擷取 istio-proxy
記錄並查看內容,找出可能導致問題的錯誤:
kubectl logs POD_NAME -n NAMESPACE_NAME -c istio-proxy
您也可以對 init
容器執行相同操作:
kubectl logs POD_NAME -n NAMESPACE_NAME -c istio-init
後續步驟
與 Cloud Trace 整合。Cloud Trace 是 Cloud Service Mesh 中的選用功能。