要求 Proxy 記錄

Cloud Service Mesh 頁面提供 Cloud Logging 中兩種不同類型記錄的連結:存取記錄 (也稱為 Envoy 記錄) 和流量記錄 (也稱為 Google Cloud Observability 存取記錄)。

存取記錄檔

啟用存取記錄

啟用存取記錄的必要步驟取決於 Cloud Service Mesh 類型 (代管或叢集內):

查看存取記錄

如要在記錄檔探索工具中查看存取記錄,請按照下列步驟操作:

  1. 前往 Logs Explorer:

    前往 Logs Explorer

  2. 選取適當的 Google Cloud 專案。

  3. 執行以下查詢:

    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"
    

流量記錄

啟用流量記錄檔

除非您在 Google Distributed Cloud 上安裝 Cloud Service Mesh,並使用 Istio CA (先前稱為 Citadel),否則系統預設會啟用流量記錄檔

如要使用 Istio CA 在 Google Distributed Cloud 上啟用流量記錄,請安裝叢集內 Cloud Service Mesh使用 --option stackdriver 旗標。或者,您也可以在安裝叢集內 Cloud Service Mesh 後,使用 Istio CA 在 Google Distributed Cloud 上啟用流量記錄。

查看流量記錄

在記錄檔探索工具中查看流量記錄

如要在「記錄檔探索工具」中查看流量記錄,請按照下列步驟操作:

  1. 前往 Logs Explorer:

    前往 Logs Explorer

  2. 選取適當的 Google Cloud 專案。

  3. 視您要查看用戶端或伺服器存取記錄而定,執行下列查詢:

    伺服器記錄

    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 頁面流量記錄,請按照下列步驟操作:

  1. 前往 Google Cloud 控制台的「Cloud Service Mesh」頁面。

    前往 Cloud Service Mesh 頁面

  2. 在「服務」下方,選取要檢查的服務名稱。

  3. 前往「指標」頁面。

  4. 從「時間範圍」下拉式選單指定時間範圍,或使用時間軸設定自訂範圍

  5. 按一下「查看流量記錄」

流量記錄的名稱為 server-accesslog-stackdriver,並附加至服務使用的相應受監控資源 (k8s_containergce_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 時,系統預設會將指標匯出至 Google Cloud Observability 進行監控。istiod istiod 會在這些指標加上 istio.io/control 前置字元,並提供控制層狀態的深入分析,例如連線至各控制層執行個體的 Proxy 數量、設定事件、推送和驗證。

請按照下列步驟觀察或排解控制層的問題。

  1. 載入範例資訊主頁:

    git clone https://github.com/GoogleCloudPlatform/monitoring-dashboard-samples && cd monitoring-dashboard-samples/dashboards && git checkout servicemesh
  2. 安裝 Cloud Service Mesh 資訊主頁:

    gcloud monitoring dashboards create --config-from-file=dashboards/servicemesh/anthos-service-mesh-control-plane-monitoring.json
  3. 在清單中找出名為 Istio Control Plane Dashboard 的資訊主頁。詳情請參閱「查看已安裝的資訊主頁」。

如需可用指標的完整清單,請參閱「匯出的指標」。

診斷設定延遲問題

下列步驟說明如何使用 pilot_proxy_convergence_time 指標,診斷設定變更與所有 Proxy 匯聚之間的延遲。

  1. 在 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
  2. 在指標中存取 localhost:15014grep (convergence):

    curl http://localhost:15014/metrics | grep convergence

解讀 Google Cloud Observability 存取記錄

以下資訊說明如何使用 Google Cloud Observability 存取記錄,排解連線問題。Google Cloud Observability 預設會啟用存取/流量記錄。

Cloud Service Mesh 會將資料匯出至 Google Cloud Observability 存取記錄,協助您偵錯下列類型的問題:

  • 流量和失敗
  • 端對端要求轉送

在 Google Kubernetes Engine 上安裝 Cloud Service Mesh 時,系統預設會啟用 Google Cloud Observability 存取記錄。如要啟用 Google Cloud Observability 存取記錄,請重新執行 asmcli install。使用您原本安裝的相同選項,但省略停用 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。

在 Istio 設定中啟用 Envoy 存取記錄後,Google Cloud Observability 存取記錄中顯示的資訊,就是來自 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 秒的要求。
  • 建立記錄指標。
  • 排解 404503 錯誤

排解 404503 錯誤

以下範例說明如何使用這項記錄,在要求失敗並傳回 404503 回應代碼時進行疑難排解。

  1. 在用戶端存取記錄中,搜尋類似下列內容的項目:

    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"
    }
  2. 前往存取記錄項目中的標籤。找出 response_flag 欄位,如下所示:

    response_flag: "NR"

    NR 值是 NoRoute 的縮寫,表示系統找不到目的地路徑,或下游連線沒有相符的篩選器鏈。同樣地,您也可以使用 response_flag 標籤排解 503 錯誤。

  3. 如果用戶端和伺服器存取記錄都顯示 503 錯誤,請確認為各項服務設定的通訊埠名稱,與兩者之間使用的通訊協定名稱相符。舉例來說,如果 golang 二進位用戶端使用 HTTP 連線至 golang 伺服器,但通訊埠命名為 http2,通訊協定就不會自動正確協商。

詳情請參閱回應標記

解讀存取記錄

下列步驟說明如何使用存取記錄 (也稱為 Envoy Proxy 記錄),顯示連線兩端的流量,以利進行疑難排解。

存取記錄有助於診斷下列問題:

  • 流量和失敗
  • 端對端要求轉送

Cloud Service Mesh 預設不會啟用存取記錄,且只能在整個網格中全域啟用。

您可以在應用程式中產生活動,觸發 HTTP 要求,然後檢查來源或目的地記錄中的相關要求,藉此排解連線/要求失敗問題。

如果觸發要求並顯示在來源 Proxy 記錄中,表示 iptables 流量重新導向功能正常運作,且 Envoy Proxy 正在處理流量。如果記錄中顯示錯誤,請產生 Envoy 設定傾印,並檢查 Envoy 叢集設定,確保設定正確。如果看到要求,但記錄中沒有錯誤,請改為檢查目的地 Proxy 記錄。

如果要求顯示在目的地 Proxy 記錄中,表示網格本身運作正常。如果看到錯誤,請執行 Envoy 設定傾印,並驗證接聽器設定中設定的流量通訊埠值是否正確。

如果執行上述步驟後問題仍未解決,可能是 Envoy 無法在 Sidecar 和應用程式 Pod 之間自動協商通訊協定。確認 Kubernetes 服務通訊埠名稱 (例如 http-80) 與應用程式使用的通訊協定相符。

使用 Logs Explorer 查詢記錄

您可以使用 Logs Explorer 介面查詢特定存取記錄。舉例來說,如要查詢已啟用 MULTUAL_TLS 並使用 grpc 通訊協定的所有要求,請在伺服器存取記錄查詢中附加下列內容:

labels.protocol="grpc" labels.service_authentication_policy="MULTUAL_TLS"

設定存取記錄政策

如要為受管理 Cloud Service Mesh 設定 Proxy 記錄,請參閱「Envoy 存取記錄」。

如要使用叢集內控制層設定 Cloud Service Mesh 的存取記錄檔政策,請按照下列步驟操作:

  1. 建立 IstioOperator 自訂疊加層檔案,其中包含適用於您情境的 AccessLogPolicyConfig 值。

  2. 使用 --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 - Dumps the Envoy configuration
  • listeners - 已設定 Envoy 的監聽器
  • logging - 查看及變更記錄設定
  • stats - Envoy 統計資料
  • stats/prometheus - Envoy 統計資料 (Prometheus 記錄)

查看 Proxy Socket 狀態

您可以直接檢查 Envoy 代理程式通訊端的狀態,方法如下:

  1. 顯示已建立的通訊端清單,包括 TIME_WAIT 狀態的通訊端,如果數量過多,可能會對擴充性造成負面影響:

    kubectl exec POD_NAME -n NAMESPACE_NAME -c istio-proxy -- ss -anopim
  2. 顯示通訊端統計資料摘要:

    kubectl exec POD_NAME -n NAMESPACE_NAME -c istio-proxy -- ss -s

詳情請參閱「An Introduction to the ss Command」。

istio-proxyistio-init 記錄

此外,請擷取 istio-proxy 記錄並查看內容,找出可能指出問題原因的任何錯誤:

kubectl logs POD_NAME -n NAMESPACE_NAME -c istio-proxy

您也可以對 init 容器執行同樣操作:

kubectl logs POD_NAME -n NAMESPACE_NAME -c istio-init

後續步驟