網關規則
更新時間 2024-09-09 19:52:26
最近更新時間: 2024-09-09 19:52:26
分享文章
本章節介紹網關規則相關操作
概述
網關規則定義和配置應用服務網格中的入口或出口網關,控制著外部流量如何進入網格以及網格內訪問外部,本文介紹網關相關操作。
使用yaml創建網關規則
- 登錄應用網格控制臺,單擊應用網格實例列表中的網格名稱。
- 在左側導航欄中,選擇網關>網關規則。

- 選擇對應的命名空間后,點擊創建網關規則按鈕。
- 在創建頁面選擇場景模板,然后在yaml文本框中按需修改網關規則的配置。

- 最后點擊創建按鈕,完成創建。
網關規則操作
網關規則創建完成后,可在網關規則頁面查看選中命名空間內的網關規則列表,并進行以下操作。
- 查看或修改yaml:單擊所需查看的網關規則所在行右側的管理按鈕,可在yaml文本框中查看并修改網關規則的yaml。完成yaml修改后,點擊確定按鈕即可提交修改。
- 刪除網關規則:單擊所需刪除的網關規則所在行右側的刪除按鈕,然后在確認對話框中,單擊確認按鈕。
網關規則CRD說明
Gateway 描述了在網格邊緣操作的L4-L6 負載均衡器,接收傳入或傳出的 HTTP/TCP 連接。規范描述了一組應該暴露的端口、要使用的協議類型、用于負載均衡器的 SNI 配置等。可以將 VirtualService 綁定到網關,以控制到達特定主機或網關端口的流量轉發。
配置示例
以下 Gateway 配置設置了一個代理作為負載均衡器,暴露端口 80 和9080(http)、443(https)、9443(https)以及端口 2379(TCP)用于入口。該網關規則將應用于具有標簽 app: my-gateway-controller 的 pod 上。
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: my-gateway
namespace: some-config-namespace
spec:
selector:
app: my-gateway-controller
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- uk.ctyun.com
- eu.ctyun.com
tls:
httpsRedirect: true
- port:
number: 443
name: https-443
protocol: HTTPS
hosts:
- uk.ctyun.com
- eu.ctyun.com
tls:
mode: SIMPLE
serverCertificate: /etc/certs/servercert.pem
privateKey: /etc/certs/privatekey.pem
- port:
number: 9443
name: https-9443
protocol: HTTPS
hosts:
- "bookinfo-namespace/*.ctyun.com"
tls:
mode: SIMPLE
credentialName: bookinfo-secret
- port:
number: 9080
name: http-wildcard
protocol: HTTP
hosts:
- "*"
字段說明
Gateway
Gateway 描述了在網格邊緣操作的負載均衡器,用于接收傳入或傳出的 HTTP/TCP 連接。
| 字段 | 類型 | 說明 | 是否必選 |
|---|---|---|---|
| servers | Server[] | 服務規格列表。 | 是 |
| selector | map<string, string> | 一個或多個標簽,指示應該將此網關配置應用于哪些特定的pod/VM; 默認情況下,根據標簽選擇器,在所有命名空間中搜索工作負載,這意味著命名空間“foo”中的網關資源可以基于標簽選擇器選擇命名空間“bar”中的 pod; 如果標簽選擇器為空,網關規則將應用于所有工作負載。 |
是 |
Server
Server描述了在給定負載均衡器端口上的代理的屬性
| 字段 | 類型 | 說明 | 是否必選 |
|---|---|---|---|
| port | Port | 代理應監聽傳入連接的端口。 | 是 |
| bind | string | 監聽器應綁定到的IP 地址或 Unix 域套接字。格式為:x.x.x.x 或 unix:///path/to/uds 或 unix://@foobar(Linux 抽象命名空間)。 1,當使用 Unix 域套接字時,端口號應為 0。這可用于將此服務器的可達性限制為僅為網關內部。 2,當網關需要與另一個網格服務通信時(例如,發布指標),通常會使用此功能。在這種情況下,使用指定綁定創建的服務器將對外部網關客戶端不可用。 |
否 |
| hosts | string[] | 此網關暴露的一個或多個主機。雖然通常適用于HTTP 服務,但也可以用于使用 SNI 的 TLS TCP 服務。 1. 主機被指定為帶有可選的 namespace/ 前綴的 dnsName。 2. dnsName 應使用 FQDN 格式指定,左側組件中可以包含通配符字符(例如,prod/.ctyun.com),將 dnsName 設置為 * 可以選擇指定命名空間中的所有 VirtualService 主機(例如,prod/)。 3. 命名空間可以設置為* 或 .,分別表示任何命名空間或當前命名空間,例如,*/foo.ctyun.com 從任何可用命名空間選擇服務,而 ./foo.ctyun.com 僅從 sidecar 的命名空間選擇服務。 4. 如果未指定namespace/,則默認為 */,即從任何命名空間選擇服務,選定命名空間中的任何相關 DestinationRule 也將被使用。 5. VirtualService 必須綁定到網關,并且必須具有一個或多個與服務器中指定的主機匹配的主機,匹配可以是精確匹配或服務器主機的后綴匹配。 例如,如果服務器的主機指定為 *.ctyun.com,則具有主機 dev.ctyun.com 或 prod.ctyun.com 的 VirtualService 將匹配, 但是,具有主機ctyun.com的 VirtualService 將不匹配,只有導出到網關命名空間的虛擬服務才能被引用,服務導出范圍由export to字段控制, 有關詳細信息,請參閱 VirtualService、DestinationRule 和 ServiceEntry 配置中的 exportTo 設置。 |
是 |
| tls | ServerTLSSettings | TLS 相關選項集,用于控制服務器的行為。 使用這些選項可以控制是否應將所有 HTTP 請求重定向到 HTTPS,以及要使用的 TLS 模式。 |
否 |
| name | string | 可選的服務器名稱,設置時必須在所有服務器中唯一。 此名稱將用于各種用途,例如添加前綴到使用此名稱生成的統計信息等。 |
否 |
Port
端口描述了服務的特定端口的屬性。
| 字段 | 類型 | 說明 | 是否必須 |
|---|---|---|---|
| number | uint32 | 一個有效的非負整數端口號。 | 是 |
| protocol | string | 端口上暴露的協議,必須是HTTP、HTTPS、GRPC、GRPC-WEB、HTTP2、MONGO、TCP、TLS 中的一個; TLS 可以用于在特定端口上終止非基于 HTTP 的連接,也可以根據 SNI 頭將流量路由到目標,而無需終止 TLS 連接。 |
是 |
| name | string | 分配給端口的標簽。 | 是 |
ServerTLSSettings
| 字段 | 類型 | 說明 | 是否必須 |
|---|---|---|---|
| httpsRedirect | bool | 如果設置為true,則負載均衡器將對所有 HTTP 連接發送 301 重定向,要求客戶端使用 HTTPS。 | 否 |
| mode | TLSmode | 可選:指示是否應使用TLS 對此端口的連接進行安全保護。該字段的值確定了如何執行 TLS。 | 否 |
| serverCertificate | string | 如果模式為SIMPLE 或 MUTUAL,則為必填項。服務器端 TLS 證書的文件路徑。 | 否 |
| privateKey | string | 如果模式是SIMPLE 或 MUTUAL,則為必填項。保存服務器私鑰的文件路徑。 | 否 |
| caCertificates | string | 如果模式為MUTUAL 或 OPTIONAL_MUTUAL,則為必填項,用于驗證提供的客戶端證書的證書頒發機構證書的文件路徑。 | 否 |
| credentialName | string | 1.對于在Kubernetes 上運行的網關,持有 TLS 證書(包括 CA 證書)的密鑰的名稱,僅適用于 Kubernetes。一個 Opaque 密鑰應包含以下鍵和值:tls.key: 2.對于雙向TLS,cacert: 3.還支持具有用于指定OCSP 粘貼信息的 tls.ocsp-staple 鍵、用于 CA 證書的 ca.crt 鍵和用于證書吊銷列表的 ca.crl 的服務器證書的 TLS 密鑰。只能指定服務器證書和 CA 證書或 credentialName 中的一個。 |
否 |
| subjectAltNames | string[] | 用于驗證客戶端提供的證書中主體身份的備用名稱列表。 | 否 |
| verifyCertificateSpki | string[] | 可選的授權客戶端證書的SPKI 的 Base64 編碼的 SHA-256 散列列表,當同時指定verify_certificate_hash 和 verify_certificate_spki 時,匹配任一值的哈希將導致接受該證書。 | 否 |
| verifyCertificateHash | string[] | 一個可選的十六進制編碼的SHA-256 哈希列表,用于授權客戶端證書,簡單格式和冒號分隔格式都可以接受。當同時指定verify_certificate_hash 和 verify_certificate_spki 時,匹配任一值的哈希將導致接受該證書。 | 否 |
| minProtocolVersion | TLSProtocol | 可選:最低的TLS 協議版本,默認情況下為 TLSV1_2,TLS 協議版本低于 TLSV1_2 需要設置兼容的密碼套件(cipherSuites 設置)因為它們不再包含兼容的密碼套件。 使用低于TLSV1_2 的 TLS 協議版本存在嚴重的安全風險。 |
否 |
| maxProtocolVersion | TLSProtocol | 可選:最大的TLS 協議版本。 | 否 |
| cipherSuites | string[] | 如果指定,則僅支持指定的密碼套件列表,否則,默認使用Envoy 支持的默認密碼套件列表。 | 否 |
TLSMode
| 字段 | 說明 |
|---|---|
| PASSTHROUGH | 客戶端呈現的SNI 字符串將用作 VirtualService 中 TLS 路由的匹配條件,以確定服務注冊表中的目標服務。 |
| SIMPLE | 具有標準TLS 語義的安全連接,在此模式下,握手期間不會請求客戶端證書。 |
| MUTUAL | 使用雙向TLS 對下游進行安全連接,通過提供服務器證書進行身份驗證,在握手期間還將請求客戶端證書,并且客戶端需要發送至少一個有效證書。 |
| AUTO_PASSTHROUGH | 類似于透明傳輸模式,但具有此TLS 模式的服務器不需要關聯的 VirtualService 將 SNI 值映射到注冊表中的服務,目標詳細信息,如服務/子集/端口,被編碼在 SNI 值中,代理將轉發到由 SNI 值指定的上游(Envoy)集群(一組端點),此服務器通常用于在不同的 L3 網絡中提供服務之間的連通性,否則這些服務之間的端點之間沒有直接連通性,使用此模式假定源和目標均使用 Istio mTLS 來保護流量。 |
| ISTIO_MUTUAL | 通過提供服務器證書進行身份驗證,從下游使用雙向TLS 進行安全連接,與 Mutual 模式相比,此模式使用由 Istio 自動為 mTLS 認證生成的證書,代表網關工作負載的身份,當使用此模式時,TLSOptions 中的所有其他字段都應為空。 |
| OPTIONAL_MUTUAL | 類似于MUTUAL 模式,但客戶端證書是可選的,與 SIMPLE 模式不同,握手期間仍會明確請求客戶端證書,但客戶端不需要發送證書,如果提供了客戶端證書,則將對其進行驗證。應指定 ca_certificates 以驗證客戶端證書。 |