网关规则定义一组逻辑网关,包括公开的端口、使用的协议类型、负载均衡器的SNI配置等,需要应用在ASM网关上才能实现真正的服务监听。网关规则只用于配置监听,您还需配置一个虚拟服务来指明流量转发规则。本文介绍网关规则CRD的配置示例和字段说明。
配置示例
以下网关规则配置定义如何在网关上暴露80、9080、443和9443端口。该规则将会应用到携带istio: ingressgateway
标签的Pod上。
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: my-gateway
namespace: some-config-namespace
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- test1.com
- test2.com
tls:
httpsRedirect: true
- port:
number: 443
name: https-443
protocol: HTTPS
hosts:
- uk.bookinfo.com
- eu.bookinfo.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/*.bookinfo.com"
tls:
mode: SIMPLE
credentialName: bookinfo-secret
- port:
number: 9080
name: http-wildcard
protocol: HTTP
hosts:
- "*"
字段说明
Gateway
字段 | 类型 | 是否必选 | 说明 |
servers | 是 | 逻辑网关列表。 | |
selector | map<string, string> | 是 | 一个或多个标签,可指定应用该网关规则的一组特定ASM网关的Pod。默认情况下,网关规则会根据标签选择器在所有命名空间中搜索工作负载。例如,foo命名空间中的网关规则可以根据标签选择bar命名空间中的Pod。如果选择器为空,网关规则将应用于所有工作负载。 |
Server
Server描述给定负载均衡器端口上代理的属性。
字段 | 类型 | 是否必选 | 说明 |
port | Port | 是 | Server监听的端口。 |
bind | string | 否 | 侦听器应绑定的IP或Unix域套接字。格式为 使用Unix域套接字时,端口号应为0。该配置可用于将此服务器的可达性限制为仅网关内部,常用于网关与另一个网格服务通信,例如发布指标。该场景下,外部客户端不能访问使用指定Bind创建的服务器。 |
hosts | string[] | 是 | 公开的一台或多台主机,可用于HTTP服务或带SNI的TLS的TCP服务。 该字段可以包含多个DNS名称,并且可以带有可选Namespace或前缀。DNS名称使用FQDN格式指定,可选择在最左侧包含通配符(例如 命名空间可以被设置为 网关规则必须有对应的虚拟服务,并且虚拟服务必须具有一个或多个与服务器中指定的主机相匹配的Host。匹配可以是与服务器主机的完全匹配或后缀匹配。例如,如果服务器的主机指定 说明 该字段只能引用导出到网关命名空间的虚拟服务。如果没有导出到网关命名空间,则此处配置无效。服务导出范围由exportTo字段控制。更多信息,请参见Virtual Service、Destination Rule和Service Entry的配置。 |
tls | 否 | 一组管理服务器TLS相关选项,例如控制是否将HTTP请求重定向到HTTPS、指定使用的TLS模式等。 | |
name | string | 否 | 服务器的可选名称,需在所有服务器中保持唯一,可用于为使用此名称生成的统计数据添加前缀等。 |
Port
Port描述服务的特定端口的属性。
字段 | 类型 | 是否必选 | 说明 |
number | uint32 | 是 | 一个有效的非负整数端口号。 |
protocol | string | 是 | 在端口上公开的协议,取值为HTTP、HTTPS、GRPC、HTTP2、TCP或TLS。TLS可用于终止特定端口上基于非HTTP的连接,或基于SNI标头将流量路由到目的地而不终止TLS连接。 |
name | string | 是 | 分配给端口的标签。 |
ServerTLSSettings
字段 | 类型 | 是否必选 | 说明 |
httpsRedirect | bool | 否 | 设置为true,表示负载均衡器将为所有HTTP连接发送301重定向,要求客户端使用HTTPS。 |
mode | 否 | 是否使用TLS来保护与此端口的连接。该字段的值决定了连接使用的TLS模式。 | |
serverCertificate | string | 否 | 指定服务器侧存储证书的文件路径。如果TLS模式为SIMPLE或MUTUAL,需要填写该字段。 说明 建议使用credentialName字段配置。 |
privateKey | string | 否 | 指定服务器侧存储私钥的文件路径。如果模式为SIMPLE或MUTUAL,需要填写该字段。 说明 建议使用credentialName字段配置。 |
caCertificates | string | 否 | 指定用于验证提供的客户端证书的证书颁发机构证书的文件的路径。如果模式为MUTUAL,需要填写该字段。 说明 建议使用credentialName字段配置。 |
credentialName | string | 否 | 对于在Kubernetes上运行的网关,此处可以直接配置Secret名称(Secret中需要保存TLS证书或CA证书)。仅适用于Kubernetes。 Secret(Generic类型)应包含以下键和值:
对于mTLS还可以设置 同时支持TLS类型的Secret,您可以在Secret中配置ca.cert字段来指定CA证书。 说明
|
subjectAltNames | string[] | 否 | 用于验证客户端提供的证书中的主体身份的备用名称列表。 |
verifyCertificateSpki | string[] | 否 | 授权客户端证书SPKI的SHA-256哈希的可选列表,需要使用Base64编码。 说明 当同时指定verify_certificate_hash和verify_certificate_spki时,匹配任一值的散列将导致证书被接受。 |
verifyCertificateHash | string[] | 否 | 授权客户端证书的SHA-256哈希的可选列表,需要使用十六进制编码。支持不分隔或半角冒号(:)分隔格式。 说明 当同时指定verify_certificate_hash和verify_certificate_spki时,匹配任一值的散列将导致证书被接受。 |
minProtocolVersion | 否 | 最低TLS协议版本。默认为TLSV1_2。 低于TLSV1_2的TLS协议版本不包含兼容的密码,您可以使用cipherSuites设置兼容的密码。 重要 使用低于TLSV1_2的TLS协议版本存在严重的安全风险,建议您使用更高版本。 ASM实例版本为1.14以下,该字段默认为TLSV1_0。从ASM 1.14版本起,默认值变更为TLSV1_2。如果您使用的TLS版本低于TLSV1_2,在升级到1.14版本之前,需要显式地配置该字段为对应的TLS版本,并配置对应的cipherSuites字段。 | |
maxProtocolVersion | 否 | 最大TLS协议版本。 | |
cipherSuites | string[] | 否 | 默认为Envoy支持的默认密码列表。如果指定,仅支持指定的密码列表。 |
TLSmode
代理强制执行的TLS模式。
字段 | 说明 |
PASSTHROUGH | 客户端提供的SNI字符串将用作VirtualService TLS路由中的匹配标准,以确定来自服务注册表的目标服务。 |
SIMPLE | 使用标准TLS语义的安全连接。 |
MUTUAL | 通过提供服务器证书进行身份验证,使用双向TLS保护与下游的连接。 |
AUTO_PASSTHROUGH | 类似于passthrough模式,但是该模式不要求虚拟服务中必须存在能够通过SNI路由到指定服务的配置。服务、子集、端口等目的地详细信息编码在SNI值中。代理将通过SNI将流量转发给指定的上游(Envoy)集群(一组端点)。此服务器通常用于在不同的L3网络中提供服务之间的连接,否则这些网络在它们各自的端点之间没有直接连接。使用此模式假定源和目标都使用Istio mTLS来保护流量。 |
ISTIO_MUTUAL | 通过提供服务器证书进行身份验证,使用双向TLS保护来自下游的连接。与Mutual模式相比,该模式使用可以代表网关身份的证书和客户端通信,该证书由Istio自动生成以进行mTLS身份验证。使用此模式时,所有其他字段相关的TLS配置都应为空。 |
TLSProtocol
TLS协议版本。
名称 | 说明 |
TLS_AUTO | 自动选择最佳TLS版本。 |
TLSV1_0 | TLS 1.0版本。 |
TLSV1_1 | TLS 1.1版本。 |
TLSV1_2 | TLS 1.2版本。 |
TLSV1_3 | TLS 1.3版本。 |