使用探索選擇器為您的 Istio 服務網格設定命名空間
了解如何使用探索選擇器以及它們如何與 Sidecar 資源交互。
當使用者將其服務遷移到 Istio 服務網格中運行時,他們通常會感到驚訝,因為預設情況下,控制平面會監看並處理叢集中所有命名空間的所有 Kubernetes 資源。對於具有大量命名空間和部署的大型叢集,甚至是具有快速變動資源(例如,Spark 作業)的中等規模叢集,這都可能是一個問題。
無論是在社群中還是我們在 Solo.io 的大型客戶,我們都需要一種方法來動態限制屬於網格一部分的命名空間集合,以便 Istio 控制平面僅處理這些命名空間中的資源。限制命名空間的功能使 Istiod 可以監看並推送更少的資源以及相關變更到 Sidecar,從而提高控制平面和資料平面的整體效能。
背景
預設情況下,Istio 會監看叢集中所有命名空間、服務、端點和 Pod。例如,在我的 Kubernetes 叢集中,我在預設命名空間中部署了 sleep
服務,在 ns-x
命名空間中部署了 httpbin
服務。我已將 sleep
服務新增到網格,但我沒有計劃將 httpbin
服務新增到網格,或讓網格中的任何服務與 httpbin
服務互動。
使用 istioctl proxy-config endpoint
命令顯示 sleep
部署的所有端點
請注意,ns-x
命名空間中的 httpbin
服務端點在已探索的端點列表中。當您只有幾個服務時,這可能不是問題。但是,當您有數百個不與在 Istio 服務網格中運行的任何服務互動的服務時,您可能不希望 Istio 控制平面監看這些服務並將其資訊發送到網格中服務的 Sidecar。
推出探索選擇器
從 Istio 1.10 開始,我們在 MeshConfig 中引入了新的 discoverySelectors
選項,它是 Kubernetes 選擇器的陣列。確切的類型是 []LabelSelector
,如這裡所定義,允許使用簡單選擇器和基於集合的選擇器。這些選擇器適用於命名空間上的標籤。
您可以設定每個標籤選擇器來表達各種使用案例,包括但不限於
- 任意標籤名稱/值,例如,所有具有標籤
istio-discovery=enabled
的命名空間 - 使用帶有 OR 語義的基於集合的選擇器的命名空間標籤清單,例如,所有具有標籤
istio-discovery=enabled
或region=us-east1
的命名空間 - 包含和/或排除命名空間,例如,所有具有標籤 istio-discovery=enabled 且標籤鍵
app
等於helloworld
的命名空間
注意:discoverySelectors
不是安全邊界。即使您設定了 discoverySelectors
,Istiod 仍將有權存取所有命名空間。
實際使用中的探索選擇器
假設您知道要將哪些命名空間包含為服務網格的一部分,作為網格管理員,您可以在安裝時或安裝後,將所需的探索選擇器新增到 Istio 的 MeshConfig 資源中,來設定 discoverySelectors
。例如,您可以設定 Istio 僅探索具有標籤 istio-discovery=enabled
的命名空間。
使用我們之前的範例,讓我們使用標籤
istio-discovery=enabled
來標記default
命名空間。$ kubectl label namespace default istio-discovery=enabled
使用
istioctl
套用具有discoverySelectors
的 yaml 來更新您的 Istio 安裝。請注意,為避免對您的穩定環境產生任何影響,我們建議您為您的 Istio 安裝使用不同的修訂版本$ istioctl install --skip-confirmation -f - <<EOF apiVersion: install.istio.io/v1alpha1 kind: IstioOperator metadata: namespace: istio-system spec: # You may override parts of meshconfig by uncommenting the following lines. meshConfig: discoverySelectors: - matchLabels: istio-discovery: enabled EOF
顯示
sleep
部署的端點設定使用探索選擇器的 Sleep 部署的端點 請注意,這次
ns-x
命名空間中的httpbin
服務不在已探索的端點列表中,以及許多其他不在預設命名空間中的服務。如果您顯示sleep
部署的路由(或叢集或監聽器)資訊,您也會注意到返回的設定少得多使用探索選擇器的 Sleep 部署的路由
您可以使用 matchLabels
來設定具有 AND 語義的多個標籤,或使用 matchLabels
集合來設定多個標籤之間的 OR 語義。無論您是將服務或 Pod 部署到具有不同標籤集的命名空間,還是您組織中的多個應用程式團隊使用不同的標籤慣例,discoverySelectors
都可提供您所需的彈性。此外,您可以依照我們的文件,同時使用 matchLabels
和 matchExpressions
。有關選擇器語義的更多詳細資訊,請參閱 Kubernetes 選擇器文件。
探索選擇器與 Sidecar 資源
discoverySelectors
設定使用戶能夠動態限制屬於網格一部分的命名空間集合。Sidecar 資源也控制 Sidecar 設定的可見性以及推送至 Sidecar 代理的內容。它們之間有什麼區別?
discoverySelectors
設定宣告 Istio 控制平面監看和處理的內容。如果沒有discoverySelectors
設定,無論您擁有什麼 Sidecar 資源,Istio 控制平面都會監看和處理叢集中所有命名空間/服務/端點/Pod。discoverySelectors
由網格管理員針對網格進行全域設定。雖然網格管理員也可以在 MeshConfig 根命名空間中為網格全域設定 Sidecar 資源,但它們通常由服務擁有者針對其命名空間進行設定。
您可以將 discoverySelectors
與 Sidecar 資源一起使用。您可以使用 discoverySelectors
在網格範圍內設定 Istio 控制平面應監看和處理的命名空間。對於 Istio 服務網格中的這些命名空間,您可以全域或按命名空間建立 Sidecar 資源,以進一步控制推送至 Sidecar 代理的內容。讓我們在網格中將 Bookinfo
服務新增到 ns-y
命名空間,如下圖所示。discoverySelectors
使我們能夠定義 default
和 ns-y
命名空間是網格的一部分。我們如何設定 sleep
服務使其僅看到 default
命名空間?為預設命名空間新增 Sidecar 資源,我們可以有效地設定 sleep
Sidecar,使其僅能看到與其目前命名空間以及任何其他所需命名空間相關聯的叢集/路由/監聽器/端點。
總結
探索選擇器是強大的設定,可調整 Istio 控制平面以僅監看和處理特定命名空間。如果您不希望 Kubernetes 叢集中的所有命名空間都成為服務網格的一部分,或者您的 Kubernetes 叢集中有多個 Istio 服務網格,我們強烈建議您探索此設定,並在我們的 Istio Slack 或 GitHub 上與我們聯繫,提供回饋意見。