要求 Proxy 記錄

Cloud Service Mesh 在 Cloud Logging 中支援兩種不同的存取記錄:流量記錄 (也稱為 Google Cloud Observability 存取記錄) 和 Envoy 存取記錄。本頁面說明如何啟用、停用、查看及解讀這些記錄。請注意,系統預設會啟用流量記錄。

啟用及停用存取記錄

代管 Cloud Service Mesh

Envoy 存取記錄

執行下列指令,啟用 Envoy 存取記錄並停用流量記錄:

cat <<EOF | kubectl apply -n istio-system -f -
apiVersion: telemetry.istio.io/v1alpha1
kind: Telemetry
metadata:
  name: enable-envoy-disable-sd
  namespace: istio-system
spec:
  accessLogging:
  - providers:
      - name: envoy
  - providers:
      - name: stackdriver
    disabled: true
EOF

請注意,流量記錄的供應商名稱為 stackdriver

流量記錄檔

根據預設,系統會啟用流量記錄,並停用 Envoy 存取記錄。如果您先前已啟用 Envoy 存取記錄檔,並想啟用流量記錄檔,同時停用 Envoy 存取記錄檔,請執行下列指令:

cat <<EOF | kubectl apply -n istio-system -f -
apiVersion: telemetry.istio.io/v1alpha1
kind: Telemetry
metadata:
  name: disable-envoy-enable-sd
  namespace: istio-system
spec:
  accessLogging:
  - providers:
      - name: envoy
    disabled: true
  - providers:
      - name: stackdriver
EOF

兩者並用

  • 如要同時啟用 Envoy 存取記錄和流量記錄,請執行下列指令:

    cat <<EOF | kubectl apply -n istio-system -f -
    apiVersion: telemetry.istio.io/v1alpha1
    kind: Telemetry
    metadata:
      name: enable-envoy-and-sd-access-log
      namespace: istio-system
    spec:
      accessLogging:
      - providers:
          - name: envoy
          - name: stackdriver
    EOF
    
  • 如要同時停用 Envoy 存取記錄和流量記錄,請執行下列指令:

    cat <<EOF | kubectl apply -n istio-system -f -
    apiVersion: telemetry.istio.io/v1alpha1
    kind: Telemetry
    metadata:
      name: disable-envoy-and-sd
      namespace: istio-system
    spec:
      accessLogging:
      - providers:
          - name: envoy
        disabled: true
      - providers:
          - name: stackdriver
        disabled: true
    EOF
    

已管理 istiod

Envoy 存取記錄

執行下列指令,啟用 Envoy 存取記錄:

  1. 執行下列指令來新增 accessLogFile: /dev/stdout

    cat <<EOF | kubectl apply -f -
    apiVersion: v1
    data:
      mesh: |-
        accessLogFile: /dev/stdout
    kind: ConfigMap
    metadata:
      name: istio-release-channel
      namespace: istio-system
    EOF
    

    其中 release-channel發布版本 (asm-managedasm-managed-stableasm-managed-rapid)。

  2. 執行下列指令來查看 configmap:

     kubectl get configmap istio-release-channel -n istio-system -o yaml
    
  3. 如要確認存取記錄功能已啟用,請確認 mesh: 區段中是否顯示 accessLogFile: /dev/stdout 行。

    ...
    apiVersion: v1
    data:
      mesh: |
        ....
        accessLogFile: /dev/stdout
    ...
    

流量記錄檔

流量記錄預設為啟用。

叢集內

Envoy 存取記錄

---
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
  meshConfig:
    accessLogFile: "/dev/stdout"

詳情請參閱「啟用 Envoy 的存取記錄」。

流量記錄檔

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

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

查看存取記錄

Envoy 存取記錄

指令列

如要在 istio-proxy 記錄中查看 Envoy 存取記錄,請執行下列指令:

kubectl logs POD_NAME -n NAMESPACE_NAME -c istio-proxy

記錄檔探索工具

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

  1. 前往記錄檔探索工具:

    前往記錄檔探索工具

  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"

流量記錄檔

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

  1. 前往記錄檔探索工具:

    前往記錄檔探索工具

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

  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

使用代管 Cloud Service Mesh 控制層的 Cloud Service Mesh 不支援控制層指標。

已管理 istiod

採用代管 istiod 控制層的 Cloud Service Mesh 不支援本節中的控制層指標檢查。

叢集內

使用叢集內控制層安裝 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」的資訊主頁。 詳情請參閱「查看已安裝的資訊主頁」。

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

診斷設定延遲問題

代管 Cloud Service Mesh

採用代管 Cloud Service Mesh 控制層的 Cloud Service Mesh 不支援診斷設定延遲。

已管理 istiod

使用代管 istiod 控制層的 Cloud Service Mesh 不支援診斷設定延遲。

叢集內

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

  1. 在 Pod 中執行殼層指令:

    kubectl debug --image istio/base --target istio-proxy -it $(kubectl get pod -l app=pilot -o jsonpath='{.items[0].metadata.name}' -n istio-system) -n istio-system -- curl -s
  2. 在指標中存取「localhost:15014」和「grep」的「convergence」:

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

解讀流量記錄

以下資訊說明如何使用流量記錄檔排解連線問題。流量記錄預設為啟用。

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

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

在 Google Kubernetes Engine 上安裝 Cloud Service Mesh 時,系統預設會啟用流量記錄。如要啟用流量記錄檔,請重新執行 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。

流量記錄可能包含下列標籤:

  • route_name
  • upstream_cluster
  • X-Envoy-Original-Path

記錄項目範例如下:

{
  "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 存取記錄

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

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

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

Cloud Service Mesh 預設不會啟用 Envoy 存取記錄,但您可以為網格中的叢集啟用這項功能。

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

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

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

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

使用記錄檔探索工具查詢記錄

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

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

設定存取記錄政策

代管 Cloud Service Mesh

如要透過代管 Cloud Service Mesh 控制層設定 Cloud Service Mesh 的存取記錄,請參閱「啟用存取記錄」。

已管理 istiod

如要使用代管 istiod 控制層設定 Cloud Service Mesh 的存取記錄,請參閱「啟用存取記錄」。

叢集內

如要使用叢集內控制層為 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 Proxy Socket 的狀態,方法如下:

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

    kubectl debug --image istio/base --target istio-proxy -it POD_NAME -n NAMESPACE_NAME -- ss -anopim
  2. 顯示通訊端統計資料摘要:

    kubectl debug --image istio/base --target istio-proxy -it POD_NAME -n NAMESPACE_NAME -- ss -s

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

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

後續步驟