网关规则定义一组逻辑网关,包括公开的端口、使用的协议类型、负载均衡器的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版本。 |