Sidecar CRD描述被附加到工作負載上的Sidecar代理的配置,由Sidecar代理去調制工作負載的入站和出站通信。本文介紹Sidecar的功能、注意事項、配置示例和字段說明。
Sidecar介紹
Sidecar CRD定義Sidecar代理的配置,該代理中介了與其連接的工作負載實例的入站和出站通信。默認情況下,Istio將使用必要的配置對網格中的所有Sidecar代理進行編程,使其可以訪問到網格中的每個工作負載實例,并在與工作負載關聯的所有端口上接收流量。Sidecar配置提供了一種微調方式,去控制代理在從工作負載接收流量和將流量轉發到工作負載時支持的端口和協議。此外,Sidecar還可以限制代理在轉發來自工作負載的出站流量時可以訪問的服務集合。
服務網格使用命名空間來管理服務和配置。命名空間中的Sidecar配置將使用workloadSelector字段進行選擇,以應用到同一命名空間中的工作負載實例。如果沒有workloadSelector字段,Sidecar將應用到同一命名空間中的所有工作負載實例。在確定要應用于工作負載實例的Sidecar資源時,將優先選擇選中此工作負載的具有workloadSelector的Sidecar資源,而不是沒有workloadSelector的Sidecar資源(沒有workloadSelector字段的Sidecar中的配置將會被忽略而不會發生配置合并)。
注意事項
每個命名空間只能存在一個沒有指定workloadSelector的Sidecar配置。該配置指定此命名空間中所有Pod的默認值。建議將命名空間范圍的Sidecar命名為default。
如果在給定命名空間中存在兩個及以上不帶選擇器的Sidecar配置,則系統的行為未定義。
如果兩個及以上具有工作負載選擇器的Sidecar配置選擇相同的工作負載實例,則系統的行為未定義。
MeshConfig根命名空間中的Sidecar配置將默認應用于所有沒有Sidecar配置的命名空間。此全局默認Sidecar配置不應具有任何工作負載選擇器。
Sidecar不適用于網關,即使網關是Istio代理。
配置示例
示例一:全局默認的Sidecar配置
以下示例在根名稱空間istio-config
中聲明了一個全局默認的Sidecar配置。該配置將所有命名空間中的Sidecar配置為僅允許出口流量發往同一命名空間中的其他工作負載或者istio-system
命名空間中的服務。
apiVersion: networking.istio.io/v1beta1
kind: Sidecar
metadata:
name: default
namespace: istio-config
spec:
egress:
- hosts:
- "./*"
- "istio-system/*"
示例二:在prod-us1
命名空間中聲明Sidecar配置,覆蓋全局默認配置
以下示例在prod-us1
命名空間中聲明了一個Sidecar配置,覆蓋示例一定義的全局默認配置,并將所在命名空間中的Sidecar配置為允許出口流量發往prod-us1
、prod-apis
和istio-system
命名空間中的服務。
apiVersion: networking.istio.io/v1beta1
kind: Sidecar
metadata:
name: default
namespace: prod-us1
spec:
egress:
- hosts:
- "prod-us1/*"
- "prod-apis/*"
- "istio-system/*"
示例三:為標簽為app: ratings
的所有Pod聲明Sidecar配置
以下示例在prod-us1
命名空間中為標簽為app: ratings
的所有Pod聲明了一個Sidecar配置,這些Pod屬于ratings.prod-us1
服務。該工作負載在端口9080上接收入站HTTP流量,然后將流量轉發到偵聽Unix域套接字的工作負載實例。在出口方向上,除了istio-system
命名空間外,Sidecar代理僅代理發往到prod-us1
命名空間中端口9080的HTTP流量。
apiVersion: networking.istio.io/v1beta1
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/*"
示例四:為命名空間中包含app:productpage
標簽的所有productpage.prod-us1
服務的Pod聲明Sidecar配置
如果工作負載在部署時沒有使用基于IPTables的流量捕獲,則配置工作負載代理的端口的唯一方法是Sidecar配置。
以下示例為prod-us1
命名空間中包含標簽app:productpage
的所有productpage.prod-us1
服務的Pod聲明了Sidecar配置。假設這些Pod沒有使用IPtables規則(即istio-init容器),并且代理元數據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/v1beta1
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"
該YAML用于路由到mysql.foo.com:3306
。
apiVersion: networking.istio.io/v1beta1
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
字段說明
Sidecar
Sidecar描述被附加到工作負載上的Sidecar代理的配置,由Sidecar代理去調制工作負載的入站和出站通信。
字段 | 類型 | 是否必選 | 說明 |
workloadSelector | 否 | 用于選擇哪些Pod適用于此Sidecar配置的條件。如果省略,Sidecar配置將應用于同一命名空間中的所有工作負載實例。 | |
ingress | 否 | 用于指定代理處理其關聯的工作負載入站流量時的配置。
| |
egress | 否 | 用于指定代理處理其關聯的工作負載出站流量時的配置。如果未指定,則繼承系統從命名空間范圍或全局范圍檢測到的默認Sidecar。 | |
outboundTrafficPolicy | 否 | 外部流量策略配置。如果您的應用程序使用了一個或多個未注冊的外部服務,則將策略設置為ALLOW_ANY會導致Sidecar將應用程序發起的任何未知流量路由到其請求的目標。如果未指定,則繼承系統從命名空間范圍或全局范圍檢測到的默認Sidecar。 |
IstioIngressListener
IstioIngressListener指定附加到工作負載實例的Sidecar代理上的入站流量監聽器的屬性。
字段 | 類型 | 是否必選 | 說明 |
port | 是 | 與監聽器關聯的端口。 | |
bind | string | 否 | 監聽器應綁定的IP地址(IPv4或IPv6)。在入口監聽器的綁定字段中不允許使用Unix域套接字地址。如果省略,服務網格將根據導入的服務和應用此配置的工作負載自動配置默認值。 |
captureMode | 否 | 指定如何捕獲(或不捕獲)到監聽器的流量。 | |
defaultEndpoint | string | 是 | 流量應轉發到的IP端點或Unix域套接字。此配置可用于將到達Sidecar上
|
tls | 否 | 一組與TLS相關的選項。這些選項將啟用Sidecar對于來自網格外部的請求的TLS終止。僅支持SIMPLE和MUTUAL TLS模式。 |
IstioEgressListener
IstioEgressListener指定附加到工作負載實例的Sidecar代理上的出站流量監聽器的屬性。
字段 | 類型 | 是否必選 | 說明 |
port | 否 | 與監聽器關聯的端口。如果使用Unix域套接字,請使用0作為端口號,并使用有效協議。如果指定了端口,將使用該端口作為導入主機關聯的默認目標端口。如果省略端口,Istio將根據導入的主機推斷監聽器端口。 當指定多個出口監聽器,其中存在監聽器具有特定端口,而其他監聽器沒有端口時,暴露在監聽器端口上的主機將基于具有最具體端口的監聽器。 | |
bind | string | 否 | 監聽器應綁定的IP地址(IPv4或IPv6)。如果bind不為空,則必須指定port字段。格式如下:
如果省略,Istio將根據導入的服務、應用此配置的工作負載實例和captureMode自動配置默認值。如果captureMode為NONE,則bind將默認為 |
captureMode | 否 | 當綁定地址是IP時,captureMode選項指定如何捕獲(或不捕獲)到監聽器的流量。對于Unix域套接字綁定,captureMode必須為DEFAULT或NONE。 | |
hosts | string[] | 是 | 監聽器暴露的服務主機,格式為
示例如下:
只能引用導出到Sidecar命名空間(例如exportTo值為 |
WorkloadSelector
WorkloadSelector指定是否能將Gateway、Sidecar、EnvoyFilter、ServiceEntry或DestinationRule配置應用于代理的條件。匹配條件包括與代理相關的元數據、工作負載實例信息(例如附加到Pod的標簽)或代理在初始握手期間向Istio提供的任何其他信息。如果指定了多個條件,則所有條件都需要匹配才能選擇工作負載實例。僅支持基于標簽的選擇機制。
字段 | 類型 | 是否必選 | 說明 |
labels | map<string, string> | 是 | 一個或多個標簽,指示應在其上應用配置的一組特定Pod。標簽搜索的范圍僅限于資源所在的命名空間。 |
OutboundTrafficPolicy
OutboundTrafficPolicy設置Sidecar代理處理應用程序的出站流量的默認行為。如果應用程序使用了未注冊的外部服務,則將策略設置為ALLOW_ANY會導致Sidecar將應用程序發起的任何未知流量路由到其請求的目標。建議您使用ServiceEntry配置顯式聲明任何外部依賴項,而不使用ALLOW_ANY,以便可以監控對這些服務的流量。
字段 | 類型 | 是否必選 | 說明 |
mode | string | 否 | 對外部服務的訪問策略。取值說明如下:
|
CaptureMode
CaptureMode描述如何捕獲傳入監聽器的流量。僅當監聽器綁定到IP時適用。
字段 | 說明 |
DEFAULT | 環境定義的默認捕獲模式。 |
IPTABLES | 使用IPtables重定向捕獲流量。 |
NONE | 不捕獲流量。在出口監聽器中使用時,應用程序必須明確與監聽器端口或Unix域套接字通信。在入口監聽器中使用時,需確保主機上沒有其他進程使用監聽器端口。 |