Sidecar

Sidecar 描述 sidecar 代理程式的組態,該代理程式仲裁與其連接的工作負載實例的入站和出站通訊。預設情況下,Istio 將使用必要的組態來程式化網格中的所有 sidecar 代理程式,這些組態是到達網格中的每個工作負載實例所必需的,並接受與工作負載關聯的所有連接埠上的流量。Sidecar 設定提供了一種微調代理程式在轉發進出工作負載的流量時將接受的連接埠和通訊協定集的方法。此外,還可以限制代理程式在從工作負載實例轉發出站流量時可以到達的服務集。

網格中的服務和配置會組織成一個或多個命名空間(例如,Kubernetes 命名空間或 CF 組織/空間)。在命名空間中的 Sidecar 配置將套用到同一個命名空間中,使用 workloadSelector 欄位選取的一個或多個工作負載實例。如果沒有 workloadSelector,則將套用到同一個命名空間中的所有工作負載實例。當決定要套用到工作負載實例的 Sidecar 配置時,會優先使用具有可選取此工作負載實例的 workloadSelector 的資源,而不是沒有任何 workloadSelectorSidecar 配置。

注意 1每個命名空間只能有一個沒有任何 workloadSelectorSidecar 配置,該配置會指定該命名空間中所有 Pod 的預設值。建議使用名稱 default 作為命名空間範圍的 Sidecar。如果在給定的命名空間中存在多個無選取器的 Sidecar 配置,則系統的行為是未定義的。如果兩個或多個具有 workloadSelectorSidecar 配置選取相同的工作負載實例,則系統的行為是未定義的。

注意 2MeshConfig 根命名空間 中的 Sidecar 配置,預設將套用到所有沒有 Sidecar 配置的命名空間。這個全域預設 Sidecar 配置不應具有任何 workloadSelector

注意 3Sidecar 不適用於閘道,即使閘道是 istio-proxy

下面的範例在名為 istio-config 的根命名空間中宣告全域預設 Sidecar 配置,該配置會將所有命名空間中的 Sidecar 配置為僅允許到與其相同命名空間中的其他工作負載,以及到 istio-system 命名空間中服務的出口流量。

apiVersion: networking.istio.io/v1
kind: Sidecar
metadata:
  name: default
  namespace: istio-config
spec:
  egress:
  - hosts:
    - "./*"
    - "istio-system/*"

下面的範例在 prod-us1 命名空間中宣告一個 Sidecar 配置,該配置會覆寫上面定義的全域預設值,並將命名空間中的 Sidecar 配置為允許出口流量到 prod-us1prod-apisistio-system 命名空間中的公用服務。

apiVersion: networking.istio.io/v1
kind: Sidecar
metadata:
  name: default
  namespace: prod-us1
spec:
  egress:
  - hosts:
    - "prod-us1/*"
    - "prod-apis/*"
    - "istio-system/*"

下面的範例在 prod-us1 命名空間中,為屬於 ratings.prod-us1 服務,且具有標籤 app: ratings 的所有 Pod 宣告一個 Sidecar 配置。該工作負載在 9080 連接埠上接受傳入的 HTTP 流量。然後,該流量會轉送到在 Unix 網域插槽上監聽的已連接工作負載實例。在出口方向中,除了 istio-system 命名空間之外,Sidecar 僅代理傳送到 prod-us1 命名空間中服務的 9080 連接埠的 HTTP 流量。

apiVersion: networking.istio.io/v1
kind: Sidecar
metadata:
  name: ratings
  namespace: prod-us1
spec:
  workloadSelector:
    labels:
      app: ratings
  ingress:
  - port:
      number: 9080
      protocol: HTTP
      name: somename
    defaultEndpoint: unix:///var/run/someuds.sock
  egress:
  - port:
      number: 9080
      protocol: HTTP
      name: egresshttp
    hosts:
    - "prod-us1/*"
  - hosts:
    - "istio-system/*"

如果工作負載在沒有基於 IPTables 的流量擷取的情況下部署,則 Sidecar 配置是配置連接到工作負載實例的 Proxy 連接埠的唯一方法。下面的範例在 prod-us1 命名空間中,為屬於 productpage.prod-us1 服務,且具有標籤 app: productpage 的所有 Pod 宣告一個 Sidecar 配置。假設這些 Pod 在沒有 IPtable 規則(即 istio-init 容器)的情況下部署,且 Proxy 中繼資料 ISTIO_META_INTERCEPTION_MODE 設定為 NONE,則下面的規格允許這些 Pod 在 9080 連接埠上接收 HTTP 流量(封裝在 Istio 相互 TLS 內),並將其轉送到在 127.0.0.1:8080 上監聽的應用程式。它也允許應用程式與在 127.0.0.1:3306 上的後端 MySQL 資料庫進行通訊,然後該資料庫會代理到在 mysql.foo.com:3306 的外部託管 MySQL 服務。

apiVersion: networking.istio.io/v1
kind: Sidecar
metadata:
  name: no-ip-tables
  namespace: prod-us1
spec:
  workloadSelector:
    labels:
      app: productpage
  ingress:
  - port:
      number: 9080 # binds to proxy_instance_ip:9080 (0.0.0.0:9080, if no unicast IP is available for the instance)
      protocol: HTTP
      name: somename
    defaultEndpoint: 127.0.0.1:8080
    captureMode: NONE # not needed if metadata is set for entire proxy
  egress:
  - port:
      number: 3306
      protocol: MYSQL
      name: egressmysql
    captureMode: NONE # not needed if metadata is set for entire proxy
    bind: 127.0.0.1
    hosts:
    - "*/mysql.foo.com"

以及用於路由到 mysql.foo.com:3306 的相關服務項目

apiVersion: networking.istio.io/v1
kind: ServiceEntry
metadata:
  name: external-svc-mysql
  namespace: ns1
spec:
  hosts:
  - mysql.foo.com
  ports:
  - number: 3306
    name: mysql
    protocol: MYSQL
  location: MESH_EXTERNAL
  resolution: DNS

也可以在單個 Proxy 中混合和匹配流量擷取模式。例如,考慮在 192.168.0.0/16 子網路上的內部服務的設定。因此,在 VM 上設定 IP 表以擷取 192.168.0.0/16 子網路上的所有輸出流量。假設 VM 在 172.16.0.0/16 子網路上具有另一個網路介面以接收傳入流量。以下 Sidecar 配置允許 VM 在 172.16.1.32:80(VM 的 IP)上公開一個接聽程式,以接收來自 172.16.0.0/16 子網路的流量。

注意:VM 中 Proxy 上的 ISTIO_META_INTERCEPTION_MODE 中繼資料應包含 REDIRECTTPROXY 作為其值,這表示基於 IP 表的流量擷取處於活動狀態。

apiVersion: networking.istio.io/v1
kind: Sidecar
metadata:
  name: partial-ip-tables
  namespace: prod-us1
spec:
  workloadSelector:
    labels:
      app: productpage
  ingress:
  - bind: 172.16.1.32
    port:
      number: 80 # binds to 172.16.1.32:80
      protocol: HTTP
      name: somename
    defaultEndpoint: 127.0.0.1:8080
    captureMode: NONE
  egress:
    # use the system detected defaults
    # sets up configuration to handle outbound traffic to services
    # in 192.168.0.0/16 subnet, based on information provided by the
    # service registry
  - captureMode: IPTABLES
    hosts:
    - "*/*"

下面的範例在 prod-us1 命名空間中,為屬於 ratings.prod-us1 服務,且具有標籤 app: ratings 的所有 Pod 宣告一個 Sidecar 配置。該服務在 8443 連接埠上接受傳入的 HTTPS 流量,並且 Sidecar Proxy 會使用給定的伺服器憑證終止單向 TLS。然後,該流量會轉送到在 Unix 網域插槽上監聽的已連接工作負載實例。預期會配置 PeerAuthentication 原則,以便在特定連接埠上將 mTLS 模式設定為「DISABLE」。在本範例中,mTLS 模式在連接埠 80 上停用。此功能目前為實驗性功能。

apiVersion: networking.istio.io/v1
kind: Sidecar
metadata:
  name: ratings
  namespace: prod-us1
spec:
  workloadSelector:
    labels:
      app: ratings
  ingress:
  - port:
      number: 80
      protocol: HTTPS
      name: somename
    defaultEndpoint: unix:///var/run/someuds.sock
    tls:
      mode: SIMPLE
      privateKey: "/etc/certs/privatekey.pem"
      serverCertificate: "/etc/certs/servercert.pem"
---
apiVersion: v1
kind: Service
metadata:
  name: ratings
  labels:
    app: ratings
    service: ratings
spec:
  ports:
  - port: 8443
    name: https
    targetPort: 80
  selector:
    app: ratings
---
apiVersion: security.istio.io/v1
kind: PeerAuthentication
metadata:
  name: ratings-peer-auth
  namespace: prod-us1
spec:
  selector:
    matchLabels:
      app: ratings
  mtls:
    mode: STRICT
  portLevelMtls:
    80:
      mode: DISABLE

除了配置流量擷取以及流量如何轉送到應用程式之外,還可以控制傳入連線集區設定。依預設,Istio 會將 DestinationRules 中的連線集區設定推送給用戶端(用於傳出到服務的連線)和伺服器(用於傳入到服務實例的連線)。使用 Sidecar 中的 InboundConnectionPool 和每個連接埠的 ConnectionPool 設定,您可以控制伺服器的連線集區,使其與推送給所有用戶端的設定不同。

apiVersion: networking.istio.io/v1
kind: Sidecar
metadata:
  name: connection-pool-settings
  namespace: prod-us1
spec:
  workloadSelector:
    labels:
      app: productpage
  inboundConnectionPool:
      http:
        http1MaxPendingRequests: 1024
        http2MaxRequests: 1024
        maxRequestsPerConnection: 1024
        maxRetries: 100
  ingress:
  - port:
      number: 80
      protocol: HTTP
      name: somename
    connectionPool:
      http:
        http1MaxPendingRequests: 1024
        http2MaxRequests: 1024
        maxRequestsPerConnection: 1024
        maxRetries: 100
      tcp:
        maxConnections: 100

Sidecar

Sidecar 描述 Sidecar Proxy 的配置,該 Sidecar Proxy 會協調其所連接的工作負載實例的傳入和傳出通訊。

欄位類型描述必要
workloadSelectorWorkloadSelector

用於選取應套用此 Sidecar 配置的特定 Pod/VM 集合的條件。如果省略,Sidecar 配置將套用到相同命名空間中的所有工作負載實例。

ingressIstioIngressListener[]

Ingress 指定 Sidecar 的配置,以處理傳入到所連接工作負載實例的流量。如果省略,Istio 將根據從協調平台取得的工作負載資訊(例如,公開的連接埠、服務等)自動配置 Sidecar。如果指定,則僅當工作負載實例與服務關聯時,才會配置傳入的連接埠。

egressIstioEgressListener[]

Egress 指定 Sidecar 的配置,以處理從所連接工作負載實例到網格中其他服務的傳出流量。如果未指定,則會繼承命名空間範圍或全域預設 Sidecar 的系統偵測預設值。

inboundConnectionPoolConnectionPoolSettings

設定控制 Envoy 將從網路接受的連線量。此預設值將套用於所有傳入的接聽程式,並且可以在 Ingress 欄位中覆寫每個連接埠的值。此配置會鏡像 DestinationRuleconnectionPool 欄位。

依預設,Istio 會將服務的 DestinationRule 套用到導向該服務的傳出流量的用戶端 Sidecar,這是配置 DestinationRule 時,人們通常會想到的情況,同時也會套用到伺服器的傳入 Sidecar。Sidecar 的連線集區會直接配置伺服器的傳入 Sidecar,因此其設定可能與用戶端的不同。例如,當您有許多用戶端呼叫少數伺服器時,這會很有價值:DestinationRule 可以限制任何單個用戶端的並行性,而 Sidecar 允許您在伺服器端配置更高的並行性。

伺服器傳入 Sidecar 的連線集區設定會以下列優先順序配置,從最高到最低

  • 來自 Sidecar 的每個連接埠 ConnectionPool
  • 來自 Sidecar 的最上層 InboundConnectionPool
  • 來自 DestinationRule 的每個連接埠 TrafficPolicy.ConnectionPool
  • 來自 DestinationRule 的最上層 TrafficPolicy.ConnectionPool
  • 預設連線集區設定(基本上無限制)

在任何情況下,連線集區設定都會被覆寫,而不是合併。

outboundTrafficPolicyOutboundTrafficPolicy

設定 Sidecar 用於處理來自應用程式的傳出流量的預設行為。

預設模式為 ALLOW_ANY,這表示將允許傳出到未知目的地的流量。

IstioIngressListener

IstioIngressListener 指定附加到工作負載實例的 Sidecar Proxy 上傳入流量接聽程式的屬性。

欄位類型描述必要
portSidecarPort

與接聽程式相關聯的連接埠。

bindstring

接聽程式應繫結的 IP(IPv4 或 IPv6)。傳入接聽程式的繫結欄位中不允許使用 Unix 網域插槽位址。如果省略,Istio 將根據匯入的服務和此配置所套用的工作負載實例自動配置預設值。

captureModeCaptureMode

captureMode 選項會指示預期如何擷取(或不擷取)傳送到接聽程式的流量。

defaultEndpointstring

應將流量轉送到其中的 IP 端點或 Unix 網域插槽。此配置可用於將到達 Sidecar 上繫結 IP:Port 的流量重新導向到應用程式工作負載實例監聽連線的 localhost:port 或 Unix 網域插槽。不支援任意 IP。格式應為 127.0.0.1:PORT[::1]:PORT(轉送到 localhost)、0.0.0.0:PORT[::]:PORT(轉送到實例 IP)或 unix:///path/to/socket(轉送到 Unix 網域插槽)之一。

tlsServerTLSSettings

一組 TLS 相關選項,會在 Sidecar 上啟用 TLS 終止,以處理來自網格外部的請求。目前僅支援 SIMPLE 和 MUTUAL TLS 模式。

connectionPoolConnectionPoolSettings

設定控制 Envoy 將從網路接受的連線量。此設定會覆寫最上層預設 inboundConnectionPool,以設定此連接埠的特定設定。此配置會鏡像 DestinationRulePortTrafficPolicy.connectionPool 欄位。此連接埠層級連線集區在配置中具有最高優先順序,會覆寫 Sidecar 最上層的 InboundConnectionPool 以及 DestinationRule 中的任何連線集區設定。

IstioEgressListener

IstioEgressListener 指定附加到工作負載實例的 Sidecar Proxy 上傳出流量接聽程式的屬性。

欄位類型描述必要
portSidecarPort

與接聽程式相關聯的連接埠。如果使用 Unix 網域插槽,則使用 0 作為連接埠號碼,並使用有效的通訊協定。如果指定連接埠,則將其用作與匯入主機相關聯的預設目的地連接埠。如果省略連接埠,Istio 將根據匯入的主機推斷接聽程式連接埠。請注意,當指定多個出口接聽程式時,如果一個或多個接聽程式具有特定連接埠,而其他接聽程式沒有連接埠,則接聽程式連接埠上公開的主機將基於具有最特定連接埠的接聽程式。

bindstring

接聽程式應繫結到的 IP(IPv4 或 IPv6)或 Unix 網域插槽。如果繫結不為空,則必須指定連接埠。格式:IPv4 或 IPv6 位址格式,或 unix:///path/to/udsunix://@foobar(Linux 抽象命名空間)。如果省略,Istio 將根據匯入的服務、此配置所套用的工作負載實例和 captureMode 自動配置預設值。如果 captureMode 為 NONE,則繫結預設為 127.0.0.1。

captureModeCaptureMode

當繫結位址為 IP 時,captureMode 選項會指示預期如何擷取(或不擷取)傳送到接聽程式的流量。對於 Unix 網域插槽繫結,captureMode 必須為 DEFAULT 或 NONE

hostsstring[]

接聽程式以 namespace/dnsName 格式公開的一個或多個服務主機。將公開指定命名空間中與 dnsName 相符的服務。對應的服務可以是服務登錄中的服務(例如,Kubernetes 或 Cloud Foundry 服務),或使用 ServiceEntryVirtualService 配置指定的服務。也會使用相同命名空間中的任何關聯 DestinationRule

dnsName 應使用 FQDN 格式指定,可選擇在最左邊的組成部分包含萬用字元(例如,prod/*.example.com)。將 dnsName 設定為 * 可以選取指定命名空間中的所有服務(例如,prod/*)。

namespace 可以設定為 *.~,分別代表任何、目前或沒有命名空間。例如,*/foo.example.com 會選取來自任何可用命名空間的服務,而 ./foo.example.com 只會選取來自 sidecar 命名空間的服務。如果主機設定為 */*,Istio 會設定 sidecar 以使其能夠連線到網格中匯出到 sidecar 命名空間的每個服務。值 ~/* 可用於完全修剪那些僅接收流量並回應,但不進行任何對外連線的 sidecar 的設定。

注意:僅能參考匯出到 sidecar 命名空間的服務和組態成品(例如,exportTo 值為 *)。私有組態(例如,exportTo 設定為 .)將不可用。有關詳細資訊,請參閱 VirtualServiceDestinationRuleServiceEntry 組態中的 exportTo 設定。

WorkloadSelector

WorkloadSelector 指定用於判斷是否可將 GatewaySidecarEnvoyFilterServiceEntryDestinationRule 組態套用至代理程式的條件。比對條件包括與代理程式相關聯的中繼資料、工作負載實例資訊(例如附加到 pod/VM 的標籤),或代理程式在初始交握期間提供給 Istio 的任何其他資訊。如果指定了多個條件,則所有條件都需要符合才能選取工作負載實例。目前僅支援基於標籤的選取機制。

欄位類型描述必要
labelsmap<string, string>

一個或多個標籤,指示應套用組態的特定 pod/VM 集合。標籤搜尋的範圍僅限於資源所在的組態命名空間。

OutboundTrafficPolicy

OutboundTrafficPolicy 設定 sidecar 處理應用程式發出未知對外流量的預設行為。

欄位類型描述必要
modeMode

SidecarPort

Port 描述服務特定埠的屬性。

欄位類型描述必要
numberuint32

有效的非負整數埠號。

protocolstring

埠上公開的協定。必須是 HTTP|HTTPS|GRPC|HTTP2|MONGO|TCP|TLS 之一。TLS 可用於終止特定埠上非 HTTP 連線,或根據 SNI 標頭將流量路由到目的地,而不終止 TLS 連線。

namestring

指派給埠的標籤。

OutboundTrafficPolicy.Mode

Name描述
REGISTRY_ONLY

REGISTRY_ONLY 模式下,未知的對外流量將被丟棄。流量目的地必須透過 ServiceEntry 組態明確宣告到服務註冊表中。

注意:Istio 不提供對外流量安全策略。此選項不作為此策略或任何形式的對外防火牆。相反,此選項主要用於讓使用者透過明確失敗來偵測遺失的 ServiceEntry 組態。

ALLOW_ANY

ALLOW_ANY 模式下,將允許任何流向未知目的地的流量。但是,未知目的地流量的功能有限,例如降低可觀察性。此模式允許未透過 ServiceEntry 組態註冊所有可能出口目的地的使用者,仍然可以連線到任意目的地。

CaptureMode

CaptureMode 描述預期如何捕獲流向監聽器的流量。僅當監聽器繫結到 IP 時才適用。

Name描述
DEFAULT

環境定義的預設捕獲模式。

IPTABLES

使用 IPtables 重定向捕獲流量。

NONE

不捕獲流量。在出口監聽器中使用時,應用程式應明確與監聽器埠或 Unix 網域插槽進行通訊。在入口監聽器中使用時,需要小心確保監聽器埠未被主機上的其他程序使用。

這個資訊有用嗎?
您有任何改進建議嗎?

感謝您的回饋!