Istio 中的各元件埠及功能詳解

語言: CN / TW / HK

在我的前兩篇部落格中:

我向你詳細介紹了 Istio 資料平面中的流量,但資料平面並不能孤立的存在,本文將向你展示 Istio 中的控制平面和資料平面各元件的埠及其功能,有助於你瞭解這些流量之間的關係及故障排查。

Istio 中的元件及埠示意圖

按照習慣,我們首先展示一個全域性示意圖。下圖展示的是 Istio 資料平面中 sidecar 的組成,以及與其互動的物件。

我們可以使用 nsenter 命令進入Bookinfo 示例的 productpage Pod的網路空間,檢視其內部監聽的埠資訊。

從圖中我們可以看到除了 productpage 應用本身監聽的 9080 埠以外,Sidecar 容器還有監聽大量的其他埠,如 150001500115004150061502115090 等,你可以在 Istio 文件 上了解 Istio 中使用的埠。

我們再進入 productpage Pod 中,使用 lsof -i 命令檢視它開啟的埠,如下圖所示。

我們可以看到其中有 pilot-agentistiod 建立了 TCP 連線,上文中所述的監聽中的埠,還有在 Pod 內部建立的 TCP 連線,這些連線對應了文章開頭的示意圖。

Sidecar 容器( istio-proxy )的根程序是 pilot-agent ,啟動命令如下圖所示:

從圖中我們可以看到,它 pilot-agent 程序的 PID 是 1,是它拉起了 envoy 程序。

istiod 的 Pod 中檢視它開啟的埠,如下圖所示。

我們可以看到其中的監聽的埠、程序間和遠端通訊連線。

Istio 中各埠的功能概述

這些埠在你進行問題排查時可以起著舉足輕重的作用。下面將根據埠所在的元件和功能分類描述。

Istiod 中的埠

Istiod 中的埠相對比較少且功能單一:

istiod
istiod

Sidecar 中的埠

從上文中,我們看到 sidecar 中有眾多埠:

  • 15000:Envoy管理介面,你可以用它來查詢和修改 Envoy 代理的的配置,詳情請參考 Envoy 文件
  • 15001:用於處理出站流量。
  • 15004:除錯埠,將在下文中解釋。
  • 15006:用於處理入站流量。
  • 15020:彙總統計資料,對 Envoy 和 DNS 代理進行健康檢查,除錯 pilot-agent 程序,將在下文中詳細解釋。
  • 15021:用於 sidecar 健康檢查,以判斷已注入 Pod 是否準備好接收流量。我們在該埠的 /healthz/ready 路徑上設定了就緒探針,Istio 把 sidecar 的就緒檢測交給了 kubelet ,最大化利用 Kubernetes 平臺自身的功能。 envoy 程序將健康檢查路由到 pilot-agent 程序的 15020 埠,實際的健康檢查將發生在那裡。
  • 15053:本地 DNS 代理,用於解析 Kubernetes DNS 解析不了的叢集內部域名的場景。
  • 15090:Envoy Prometheus 查詢埠, pilot-agent 將通過此埠收集統計資訊。

以上埠可以分為以下幾類:

  • 負責程序間通訊,例如 15001、15006、15053
  • 負責健康檢查和資訊統計,例如 150021、15090
  • 除錯:15000、15004

下文將對幾個重點埠詳解。

15000 埠

15000 是 Envoy 的 Admin 介面,該介面允許我們修改 Envoy,並獲得一個檢視和查詢指標和配置。

管理介面由一個具有多個端點的 REST API 和一個簡單的使用者介面組成,你可以使用下面的命令開啟 productpage Pod 中的 Envoy 管理介面檢視。

kubectl -n default port-forward deploy/productpage-v1 15000

在瀏覽器中訪問 http://localhost:15000 ,你將看到 Envoy Admin 介面如下圖所示。

15004 埠

通過 pilot-agent 代理 istiod 8080 埠上的除錯端點,你可以進入資料平面 Pod 中訪問 localhost 的 15004 埠查詢網格資訊,其效果與下面的 8080 埠等同。

8080 埠

你還可以在本地轉發 istiod 8080 埠,請執行下面的命令。

kubectl -n istio-system port-forward deploy/istiod 8080

在瀏覽器中訪問 http://localhost:8080/debug ,你將看到除錯端點,如下圖所示。

當然,這只是一種獲取網格資訊和除錯網格的方式,你還可以使用 istioctl 命令或 Kiali 來除錯,那樣將更加高效和直觀。

15020 埠

15020 埠有三大功能:

  1. 彙總統計資料:查詢 15090 埠獲取 envoy 的指標,也可以配置查詢應用程式的指標,將 envoy 、應用程式和自身的指標彙總以供 Prometheus 收集。對應的除錯端點是 /stats/prometheus
  2. 對 Envoy 和 DNS 代理進行健康檢查:對應的除錯端點是 /healthz/ready/app-health
  3. 除錯 pilot-agent 程序:對應的除錯端點是 /quitquitquitdebug/ndsz/debug/pprof

下圖展示的是使用本地埠轉發後,在瀏覽器中開啟 http://localhost:15020/debug/pprof 看到的除錯資訊。

圖中資訊展示的是 pilot-agent 的堆疊資訊。

總結

通過對 Istio 中各元件埠的瞭解,你應該對 Istio 中各元件的關係及其內部流量有了更進一步的認識,熟悉這些埠的功能,有助於對網格的故障排除。