网关规则(Gateway)CRD说明

网关规则定义一组逻辑网关,包括公开的端口、使用的协议类型、负载均衡器的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.Xunix:///path/to/udsorunix://@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.comprod.example.com;但虚拟服务中的主机example.comnewexample.com不能匹配到*.example.com范围内的主机。

说明

该字段只能引用导出到网关命名空间的虚拟服务。如果没有导出到网关命名空间,则此处配置无效。服务导出范围由exportTo字段控制。更多信息,请参见Virtual ServiceDestination RuleService 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模式为SIMPLEMUTUAL,需要填写该字段。

说明

建议使用credentialName字段配置。

privateKey

string

指定服务器侧存储私钥的文件路径。如果模式为SIMPLEMUTUAL,需要填写该字段。

说明

建议使用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中挂载卷的方式,使用serverCertificateprivateKeycaCertificates三个字段配置。

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

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

subjectAltNames

string[]

用于验证客户端提供的证书中的主体身份的备用名称列表。

verifyCertificateSpki

string[]

授权客户端证书SPKI的SHA-256哈希的可选列表,需要使用Base64编码。

说明

当同时指定verify_certificate_hashverify_certificate_spki时,匹配任一值的散列将导致证书被接受。

verifyCertificateHash

string[]

授权客户端证书的SHA-256哈希的可选列表,需要使用十六进制编码。支持不分隔或半角冒号(:)分隔格式。

说明

当同时指定verify_certificate_hashverify_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版本。