要求 Proxy 記錄

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

存取記錄檔

啟用存取記錄

請按照下列步驟啟用存取記錄:

叢集內

請按照操作說明啟用叢集內 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"
    

流量記錄檔

啟用流量記錄檔

根據預設,系統會啟用流量記錄檔,除非 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 上啟用流量記錄。

查看流量記錄

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

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

  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"
    

在 Cloud Service Mesh 頁面中查看流量記錄

如要在指定時間範圍內,查看服務的 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"
}

解讀 Cloud Service Mesh 記錄檔

以下各節將說明如何查看網狀結構的狀態,並檢查各種記錄,其中包含有助於排解問題的詳細資訊。

解讀控制層指標

使用叢集內控制層安裝 Cloud Service Mesh 時,istiod 預設會將指標匯出至 Google Cloud Observability 進行監控。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. 在指標中存取 convergencelocalhost:15014grep

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

解讀 Google Cloud 作業套件的存取記錄

以下說明如何使用 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 秒」等查詢。
  • 建立記錄指標。
  • 排解 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 代理程式記錄),針對連線兩端之間的流量顯示資訊,以利排除問題。

存取記錄可用於診斷下列問題:

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

根據預設,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 設定存取記錄政策,請按照下列步驟操作:

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

  2. 使用 --custom_overlay 選項將這個檔案傳遞至 asmcli,以便更新叢集內控制層設定。如要瞭解如何搭配自訂疊加檔案執行 asmcli install,請參閱「安裝選用功能」。

查看服務或工作負載專屬資訊

如果您遇到的是特定服務或工作負載的問題,而非網格全域的問題,請檢查個別 Envoy 代理程式,並從中收集相關資訊。如要收集特定工作負載及其 Proxy 的相關資訊,您可以使用 pilot-agent

kubectl exec POD_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 代理程式通訊端的狀態。

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

    kubectl exec POD_NAME -c istio-proxy -- ss -anopim
  2. 顯示 Socket 統計資料摘要:

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

詳情請參閱「ss 指令簡介」。

istio-proxyistio-init 記錄

此外,請擷取 istio-proxy 記錄並查看內容,找出可能導致問題的錯誤:

kubectl logs POD_NAME -c istio-proxy

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

kubectl logs POD_NAME -c istio-init

後續步驟