概述
网关规则定义和配置应用服务网格中的入口或出口网关,控制着外部流量如何进入网格以及网格内访问外部,本文介绍网关相关操作。
使用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 以验证客户端证书。 |