使用探索選擇器為您的 Istio 服務網格設定命名空間

了解如何使用探索選擇器以及它們如何與 Sidecar 資源交互。

2021 年 4 月 30 日 | 作者:Lin Sun - Solo.io,Christian Posta - Solo.io,Harvey Xia - Solo.io

當使用者將其服務遷移到 Istio 服務網格中運行時,他們通常會感到驚訝,因為預設情況下,控制平面會監看並處理叢集中所有命名空間的所有 Kubernetes 資源。對於具有大量命名空間和部署的大型叢集,甚至是具有快速變動資源(例如,Spark 作業)的中等規模叢集,這都可能是一個問題。

無論是在社群中還是我們在 Solo.io 的大型客戶,我們都需要一種方法來動態限制屬於網格一部分的命名空間集合,以便 Istio 控制平面僅處理這些命名空間中的資源。限制命名空間的功能使 Istiod 可以監看並推送更少的資源以及相關變更到 Sidecar,從而提高控制平面和資料平面的整體效能。

背景

預設情況下,Istio 會監看叢集中所有命名空間、服務、端點和 Pod。例如,在我的 Kubernetes 叢集中,我在預設命名空間中部署了 sleep 服務,在 ns-x 命名空間中部署了 httpbin 服務。我已將 sleep 服務新增到網格,但我沒有計劃將 httpbin 服務新增到網格,或讓網格中的任何服務與 httpbin 服務互動。

使用 istioctl proxy-config endpoint 命令顯示 sleep 部署的所有端點

Endpoints for Sleep Deployment
Sleep 部署的端點

請注意,ns-x 命名空間中的 httpbin 服務端點在已探索的端點列表中。當您只有幾個服務時,這可能不是問題。但是,當您有數百個不與在 Istio 服務網格中運行的任何服務互動的服務時,您可能不希望 Istio 控制平面監看這些服務並將其資訊發送到網格中服務的 Sidecar。

推出探索選擇器

從 Istio 1.10 開始,我們在 MeshConfig 中引入了新的 discoverySelectors 選項,它是 Kubernetes 選擇器的陣列。確切的類型是 []LabelSelector,如這裡所定義,允許使用簡單選擇器和基於集合的選擇器。這些選擇器適用於命名空間上的標籤。

您可以設定每個標籤選擇器來表達各種使用案例,包括但不限於

注意:discoverySelectors 不是安全邊界。即使您設定了 discoverySelectors,Istiod 仍將有權存取所有命名空間。

實際使用中的探索選擇器

假設您知道要將哪些命名空間包含為服務網格的一部分,作為網格管理員,您可以在安裝時或安裝後,將所需的探索選擇器新增到 Istio 的 MeshConfig 資源中,來設定 discoverySelectors。例如,您可以設定 Istio 僅探索具有標籤 istio-discovery=enabled 的命名空間。

  1. 使用我們之前的範例,讓我們使用標籤 istio-discovery=enabled 來標記 default 命名空間。

    $ kubectl label namespace default istio-discovery=enabled
    
  2. 使用 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
    
  3. 顯示 sleep 部署的端點設定

    Endpoints for Sleep Deployment With Discovery Selectors
    使用探索選擇器的 Sleep 部署的端點

    請注意,這次 ns-x 命名空間中的 httpbin 服務不在已探索的端點列表中,以及許多其他不在預設命名空間中的服務。如果您顯示 sleep 部署的路由(或叢集或監聽器)資訊,您也會注意到返回的設定少得多

    Routes for Sleep Deployment With Discovery Selectors
    使用探索選擇器的 Sleep 部署的路由

您可以使用 matchLabels 來設定具有 AND 語義的多個標籤,或使用 matchLabels 集合來設定多個標籤之間的 OR 語義。無論您是將服務或 Pod 部署到具有不同標籤集的命名空間,還是您組織中的多個應用程式團隊使用不同的標籤慣例,discoverySelectors 都可提供您所需的彈性。此外,您可以依照我們的文件,同時使用 matchLabelsmatchExpressions。有關選擇器語義的更多詳細資訊,請參閱 Kubernetes 選擇器文件

探索選擇器與 Sidecar 資源

discoverySelectors 設定使用戶能夠動態限制屬於網格一部分的命名空間集合。Sidecar 資源也控制 Sidecar 設定的可見性以及推送至 Sidecar 代理的內容。它們之間有什麼區別?

您可以將 discoverySelectors 與 Sidecar 資源一起使用。您可以使用 discoverySelectors 在網格範圍內設定 Istio 控制平面應監看和處理的命名空間。對於 Istio 服務網格中的這些命名空間,您可以全域或按命名空間建立 Sidecar 資源,以進一步控制推送至 Sidecar 代理的內容。讓我們在網格中將 Bookinfo 服務新增到 ns-y 命名空間,如下圖所示。discoverySelectors 使我們能夠定義 defaultns-y 命名空間是網格的一部分。我們如何設定 sleep 服務使其僅看到 default 命名空間?為預設命名空間新增 Sidecar 資源,我們可以有效地設定 sleep Sidecar,使其僅能看到與其目前命名空間以及任何其他所需命名空間相關聯的叢集/路由/監聽器/端點。

Discovery Selectors vs Sidecar Resource
探索選擇器與 Sidecar 資源

總結

探索選擇器是強大的設定,可調整 Istio 控制平面以僅監看和處理特定命名空間。如果您不希望 Kubernetes 叢集中的所有命名空間都成為服務網格的一部分,或者您的 Kubernetes 叢集中有多個 Istio 服務網格,我們強烈建議您探索此設定,並在我們的 Istio Slack 或 GitHub 上與我們聯繫,提供回饋意見。

分享此文章