网关规则(Gateway)CRD说明

更新时间:
复制 MD 格式

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

Server[]

是

逻辑网关列表。

selector

map<string, string>

是

一个或多个标签,可指定应用该网关规则的一组特定ASM网关的Pod。默认情况下,网关规则会根据标签选择器在所有命名空间中搜索工作负载。例如,foo命名空间中的网关规则可以根据标签选择bar命名空间中的Pod。如果选择器为空,网关规则将应用于所有工作负载。

Server

Server描述给定负载均衡器端口上代理的属性。

字段

类型

是否必选

说明

port

Port

是

Server监听的端口。

bind

string

否

侦听器应绑定的IP或Unix域套接字。格式为X.X.X.X、unix:///path/to/udsor或unix://@foobar(Linux抽象命名空间)。

使用Unix域套接字时,端口号应为0。该配置可用于将此服务器的可达性限制为仅网关内部,常用于网关与另一个网格服务通信,例如发布指标。该场景下,外部客户端不能访问使用指定Bind创建的服务器。

hosts

string[]

是

公开的一台或多台主机,可用于HTTP服务或带SNI的TLS的TCP服务。

该字段可以包含多个DNS名称,并且可以带有可选Namespace或前缀。DNS名称使用FQDN格式指定,可选择在最左侧包含通配符(例如prod/*.example.com)。设置DNS名称为*可以选择来自指定命名空间的全部主机(例如prod/*)。

命名空间可以被设置为*或者.来选择所有命名空间或者当前命名空间。例如*/foo.example.com表示接受来自所有命名空间访问该主机,./foo.example.com表示仅接受当前命名空间的服务访问该主机。命名空间如果没有指定,默认是*/,即从任意命名空间中选择服务。选中的命名空间中的DestinationRule在这个过程中依然生效。

网关规则必须有对应的虚拟服务,并且虚拟服务必须具有一个或多个与服务器中指定的主机相匹配的Host。匹配可以是与服务器主机的完全匹配或后缀匹配。例如,如果服务器的主机指定*.example.com,则VirtualService中可以配置dev.example.com或prod.example.com;但虚拟服务中的主机example.com或newexample.com不能匹配到*.example.com范围内的主机。

说明

该字段只能引用导出到网关命名空间的虚拟服务。如果没有导出到网关命名空间,则此处配置无效。服务导出范围由exportTo字段控制。更多信息,请参见Virtual Service、Destination Rule和Service Entry的配置。

tls

ServerTLSSettings

否

一组管理服务器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

TLSmode

否

是否使用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类型)应包含以下键和值:

  • Key: <privateKey>

  • Cert: <serverCert>

对于mTLS还可以设置Cacert: <CACertificate>,也可以在名为<secret>-cacert的Secret中单独指定。

同时支持TLS类型的Secret,您可以在Secret中配置ca.cert字段来指定CA证书。

说明
  • 您可以通过以下两种方式挂载证书,建议使用credentialName字段配置。

    • 方式一:通过在Pod中挂载卷的方式,使用serverCertificate、privateKey、caCertificates三个字段配置。

    • 方式二:直接引用Secret资源,使用credentialName字段配置。

  • ASM实例版本为1.17及以上,支持填写全局证书管理(ASMCredential)中的证书名称。更多信息,请参见ASMCredential CRD说明。

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

TLSProtocol

否

最低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

TLSProtocol

否

最大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版本。