Istio Ingress Gateway
Istio 服務網格中的網關
使用網關為網格來管理入站和出站流量,可以讓用戶指定要進入或離開網格的流量。
使用網關為網格來管理入站和出站流量,可以讓用戶指定要進入或離開網格的流量。
網關配置被用於運行在網格內獨立 Envoy 代理中,而不是服務工作負載的應用 Sidecar 代理。
Gateway
用於為 HTTP / TCP 流量配置負載均衡器,並不管該負載均衡器將在哪里運行。網格中可以存在任意數量的 Gateway
,並且多個不同的 Gateway
實現可以共存。實際上,通過在配置中指定一組工作負載(Pod)標簽,可以將 Gateway 配置綁定到特定的工作負載,從而允許用戶通過編寫簡單的 Gateway Controller 來重用現成的網絡設備。
Gateway
只用於配置 L4-L6 功能(例如,對外公開的端口,TLS 配置),所有主流的 L7 代理均以統一的方式實現了這些功能。然后,通過在 Gateway
上綁定 VirtualService
的方式,可以使用標准的 Istio 規則來控制進入 Gateway
的 HTTP 和 TCP 流量。
例如,下面這個簡單的 Gateway
配置了一個 Load Balancer,以允許訪問 host bookinfo.com
的 https 外部流量進入網格中:
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: bookinfo-gateway
spec:
selector:
app: my-ingress-gateway
servers:
- port:
number: 443
name: https
protocol: HTTPS
hosts:
- bookinfo.com
tls:
mode: SIMPLE
serverCertificate: /tmp/tls.crt
privateKey: /tmp/tls.key
要為進入上面的 Gateway 的流量配置相應的路由,必須為同一個 host 定義一個 VirtualService
(在下一節中描述),並使用配置中的 gateways
字段綁定到前面定義的 Gateway
上:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: bookinfo
spec:
hosts:
- bookinfo.com
gateways:
- bookinfo-gateway # <---- bind to gateway
http:
- match:
- uri:
prefix: /reviews
route:
...
然后就可以為出口流量配置帶有路由規則的虛擬服務。
Gateway
配置信息
Field | Type | Description | Required |
---|---|---|---|
servers | Server[] | 開放的服務列表 | 是 |
selector | map | 通過這個Label來找到執行 Gateway 規則的 Envoy | 是 |
Server
配置信息
Field | Type | Description | Required |
---|---|---|---|
port | Port | 服務對外監聽的端口 | 是 |
hosts | string[] | Gateway 發布的服務地址,是一個 FQDN 域名,可以支持左側通配符來進行模糊查詢 | 是 |
tls | TLSOptions | TLS安全配置 | 否 |
defaultEndpoint | string | 默認情況下,應將流量轉發到的環回IP端點或Unix域套接字 | 否 |
Port
配置信息
Field | Type | Description | Required |
---|---|---|---|
number | uint32 | 一個有效的端口號 | 是 |
protocol | string | 所使用的協議,支持HTTP|HTTPS|GRPC|HTTP2|MONGO|TCP|TLS. | 是 |
name | string | 給端口分配一個名稱 | 否 |
Server.TLSOptions
配置信息
Field | Type | Description | Required |
---|---|---|---|
httpsRedirect | bool | 是否要做 HTTP 重定向 | 否 |
mode | TLSmode | 在配置的外部端口上使用 TLS 服務時,可以取 PASSTHROUGH、SIMPLE、MUTUAL、AUTO_PASSTHROUGH 這 4 種模式 | 否 |
serverCertificate | string | 服務端證書的路徑。當模式是 SIMPLE 和 MUTUAL 時必須指定 | 否 |
privateKey | string | 服務端密鑰的路徑。當模式是 SIMPLE 和 MUTUAL 時必須指定 | 否 |
caCertificates | string | CA 證書路徑。當模式是 MUTUAL 時指定 | 否 |
credentialName | string | 用於唯一標識服務端證書和秘鑰。Gateway 使用 credentialName從遠端的憑證存儲中獲取證書和秘鑰,而不是使用 Mount 的文件 | 否 |
subjectAltNames | string[] | SAN 列表,SubjectAltName 允許一個證書指定多個域名 | 否 |
verifyCertificateSpki | string[] | 授權客戶端證書的SKPI的base64編碼的SHA-256哈希值的可選列表 | 否 |
verifyCertificateHash | string[] | 授權客戶端證書的十六進制編碼SHA-256哈希值的可選列表 | 否 |
minProtocolVersion | TLSProtocol | TLS 協議的最小版本 | 否 |
maxProtocolVersion | TLSProtocol | TLS 協議的最大版本 | 否 |
cipherSuites | string[] | 指定的加密套件,默認使用 Envoy 支持的加密套件 | 否 |
Server.TLSOptions.TLSmode
配置信息
Name | Description |
---|---|
PASSTHROUGH | 客戶端提供的SNI字符串將用作VirtualService TLS路由中的匹配條件,以根據服務注冊表確定目標服務 |
SIMPLE | 使用標准TLS語義的安全連接 |
MUTUAL | 通過提供服務器證書進行身份驗證,使用雙邊TLS來保護與下游的連接 |
AUTO_PASSTHROUGH | 與直通模式相似,不同之處在於具有此TLS模式的服務器不需要關聯的VirtualService即可從SNI值映射到注冊表中的服務。目標詳細信息(例如服務/子集/端口)被編碼在SNI值中。代理將轉發到SNI值指定的上游(Envoy)群集(一組端點)。 |
ISTIO_MUTUAL | 通過提供用於身份驗證的服務器證書,使用相互TLS使用來自下游的安全連接 |
Server.TLSOptions.TLSProtocol
配置信息
Name | Description |
---|---|
TLS_AUTO | 自動選擇DLS版本 |
TLSV1_0 | TLS 1.0 |
TLSV1_1 | TLS 1.1 |
TLSV1_2 | TLS 1.2 |
TLSV1_3 | TLS 1.3 |
參考文獻
https://preliminary.istio.io/zh/docs/concepts/traffic-management/#gateways
https://preliminary.istio.io/zh//blog/2018/v1alpha3-routing/
https://preliminary.istio.io/zh/docs/reference/config/networking/gateway/#Gateway