Sidecar
Sidecar
描述 sidecar 代理程式的組態,該代理程式仲裁與其連接的工作負載實例的入站和出站通訊。預設情況下,Istio 將使用必要的組態來程式化網格中的所有 sidecar 代理程式,這些組態是到達網格中的每個工作負載實例所必需的,並接受與工作負載關聯的所有連接埠上的流量。Sidecar
設定提供了一種微調代理程式在轉發進出工作負載的流量時將接受的連接埠和通訊協定集的方法。此外,還可以限制代理程式在從工作負載實例轉發出站流量時可以到達的服務集。
網格中的服務和配置會組織成一個或多個命名空間(例如,Kubernetes 命名空間或 CF 組織/空間)。在命名空間中的 Sidecar
配置將套用到同一個命名空間中,使用 workloadSelector
欄位選取的一個或多個工作負載實例。如果沒有 workloadSelector
,則將套用到同一個命名空間中的所有工作負載實例。當決定要套用到工作負載實例的 Sidecar
配置時,會優先使用具有可選取此工作負載實例的 workloadSelector
的資源,而不是沒有任何 workloadSelector
的 Sidecar
配置。
注意 1:每個命名空間只能有一個沒有任何 workloadSelector
的 Sidecar
配置,該配置會指定該命名空間中所有 Pod 的預設值。建議使用名稱 default
作為命名空間範圍的 Sidecar。如果在給定的命名空間中存在多個無選取器的 Sidecar
配置,則系統的行為是未定義的。如果兩個或多個具有 workloadSelector
的 Sidecar
配置選取相同的工作負載實例,則系統的行為是未定義的。
注意 2:在 MeshConfig
根命名空間 中的 Sidecar
配置,預設將套用到所有沒有 Sidecar
配置的命名空間。這個全域預設 Sidecar
配置不應具有任何 workloadSelector
。
注意 3:Sidecar
不適用於閘道,即使閘道是 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-us1
、prod-apis
和 istio-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
中繼資料應包含 REDIRECT
或 TPROXY
作為其值,這表示基於 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 會協調其所連接的工作負載實例的傳入和傳出通訊。
IstioIngressListener
IstioIngressListener
指定附加到工作負載實例的 Sidecar Proxy 上傳入流量接聽程式的屬性。
IstioEgressListener
IstioEgressListener
指定附加到工作負載實例的 Sidecar Proxy 上傳出流量接聽程式的屬性。
WorkloadSelector
WorkloadSelector
指定用於判斷是否可將 Gateway
、Sidecar
、EnvoyFilter
、ServiceEntry
或 DestinationRule
組態套用至代理程式的條件。比對條件包括與代理程式相關聯的中繼資料、工作負載實例資訊(例如附加到 pod/VM 的標籤),或代理程式在初始交握期間提供給 Istio 的任何其他資訊。如果指定了多個條件,則所有條件都需要符合才能選取工作負載實例。目前僅支援基於標籤的選取機制。
OutboundTrafficPolicy
OutboundTrafficPolicy
設定 sidecar 處理應用程式發出未知對外流量的預設行為。
SidecarPort
Port 描述服務特定埠的屬性。
OutboundTrafficPolicy.Mode
Name | 描述 |
---|---|
REGISTRY_ONLY | 在 注意:Istio 不提供對外流量安全策略。此選項不作為此策略或任何形式的對外防火牆。相反,此選項主要用於讓使用者透過明確失敗來偵測遺失的 |
ALLOW_ANY | 在 |
CaptureMode
CaptureMode
描述預期如何捕獲流向監聽器的流量。僅當監聽器繫結到 IP 時才適用。
Name | 描述 |
---|---|
DEFAULT | 環境定義的預設捕獲模式。 |
IPTABLES | 使用 IPtables 重定向捕獲流量。 |
NONE | 不捕獲流量。在出口監聽器中使用時,應用程式應明確與監聽器埠或 Unix 網域插槽進行通訊。在入口監聽器中使用時,需要小心確保監聽器埠未被主機上的其他程序使用。 |