要求 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 的存取記錄功能」。

流量記錄檔

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

查看存取記錄

Envoy 存取記錄

指令列

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

kubectl logs POD_NAME -n NAMESPACE_NAME -c istio-proxy

記錄檔探索工具

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

  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"

流量記錄檔

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

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

  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 時,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 的資訊主頁。詳情請參閱「查看已安裝的資訊主頁」。

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

診斷設定延遲問題

代管 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. 在指標中存取 convergencelocalhost:15014grep

    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

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

叢集內

如要使用叢集內控制層為 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 debug --image istio/base --target istio-proxy -it POD_NAME -n NAMESPACE_NAME -- ss -anopim
  2. 顯示 Socket 統計資料摘要:

    kubectl debug --image istio/base --target istio-proxy -it POD_NAME -n NAMESPACE_NAME -- 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

後續步驟