要求 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"
    

在 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 時,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 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 秒」等查詢。
  • 建立記錄指標。
  • 排解 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 設定 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:轉儲 Envoy 設定
  • listeners - 已設定 Envoy 的事件監聽器
  • logging - 查看及變更記錄設定
  • stats - Envoy 統計資料
  • stats/prometheus - Envoy 統計資料做為 Prometheus 記錄

查看 Proxy 通訊端口狀態

您可以使用下列程序,直接檢查 Envoy 代理程式通訊端的狀態。

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

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

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

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

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

後續步驟