Gateway
Gateway
描述了在网格边缘运行的负载均衡器,接收传入或传出的 HTTP/TCP
连接。其中描述了一组应该公开的端口、要使用的协议类型、负载均衡器的 SNI 配置等。
下面的示例中,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.bookinfo.com
- eu.bookinfo.com
tls:
httpsRedirect: true # sends 301 redirect for http requests
- port:
number: 443
name: https-443
protocol: HTTPS
hosts:
- uk.bookinfo.com
- eu.bookinfo.com
tls:
mode: SIMPLE # enables HTTPS on this port
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 # enables HTTPS on this port
credentialName: bookinfo-secret # fetches certs from Kubernetes secret
- port:
number: 9080
name: http-wildcard
protocol: HTTP
hosts:
- "*"
- port:
number: 2379 # to expose internal service via external port 2379
name: mongo
protocol: MONGO
hosts:
- "*"
上面的 Gateway
描述了 负载均衡器的 L4-L6 属性,VirtualService
可以绑定到 Gateway
,以控制到达特定主机或网关端口的流量的转发。
下面的示例中,VirtualService
将 https://uk.bookinfo.com/reviews
,https://eu.bookinfo.com/reviews
, http://uk.bookinfo.com:9080/reviews
,http://eu.bookinfo.com:9080/reviews
的流量分到两个版本(prod
和 qa
)的 reviews
服务的 9080 端口上。另外,包含 cookie user: dev-123
的请求将在 qa
版本中被发送到特定的端口 7777。同样的规则也适用于网格中的 reviews.prod.svc.cluster.local
服务的请求。此规则适用于端口443、9080。注意,http://uk.bookinfo.com
被重定向到 https://uk.bookinfo.com
(即 80 重定向到 443)。
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: bookinfo-rule
namespace: bookinfo-namespace
spec:
hosts:
- reviews.prod.svc.cluster.local
- uk.bookinfo.com
- eu.bookinfo.com
gateways:
- some-config-namespace/my-gateway
- mesh # applies to all the sidecars in the mesh
http:
- match:
- headers:
cookie:
exact: "user=dev-123"
route:
- destination:
port:
number: 7777
host: reviews.qa.svc.cluster.local
- match:
- uri:
prefix: /reviews/
route:
- destination:
port:
number: 9080 # can be omitted if it's the only port for reviews
host: reviews.prod.svc.cluster.local
weight: 80
- destination:
host: reviews.qa.svc.cluster.local
weight: 20
下面的示例中,VirtualService
将到达外部端口 27017 的流量转发到端口 5555 上的内部 Mongo 服务器。由于网关列表省略了保留名称 mesh
,因此该规则在网格内部不适用。
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: bookinfo-Mongo
namespace: bookinfo-namespace
spec:
hosts:
- mongosvr.prod.svc.cluster.local # name of internal Mongo service
gateways:
- some-config-namespace/my-gateway # can omit the namespace if gateway is in same namespace as virtual service.
tcp:
- match:
- port: 27017
route:
- destination:
host: mongo.prod.svc.cluster.local
port:
number: 5555
Gateway
可以使用 hosts
字段中的 namespace/hostname
来限制绑定到 Gateway
的 VirtualService
。下面的示例中,Gateway
允许 ns1 命名空间中的任何 VirtualService
绑定它,而仅允许 ns2 命名空间中带 foo.bar.com
主机的 VirtualService
绑定到它。
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:
- "ns1/*"
- "ns2/foo.bar.com"
Gateway
Gateway
描述了负载均衡器,该负载均衡器在网格的边缘运行,以接收传入或传出的 HTTP/TCP
连接。
字段 | 类型 | 描述 | 是否必需 |
---|---|---|---|
servers | Server[] | server 参数列表 | 是 |
selector | map<string, string> | 一个或多个标签,指定在其上应用该网关配置的一组特定的 Pod /VM 。标签搜索的范围仅限于存在资源的配置命名空间,即网关必须与网关工作负载实例位于相同的名称空间中 | 是 |
Port
Port
描述了服务特定端口的属性。
字段 | 类型 | 描述 | 是否必需 |
---|---|---|---|
number | uint32 | 有效的非负整数端口号 | 是 |
protocol | string | 端口上公开的协议,必须是 HTTP | HTTPS | GRPC | HTTP2 | MONGO | TCP | TLS 中的一种。TLS 意味着连接将基于 SNI 报头路由到目的地,而不会终止 TLS 连接 | 是 |
name | string | 端口的标签 | 否 |
Server
Server
描述了给定负载均衡器端口上的代理的属性。示例如下:
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: my-ingress
spec:
selector:
app: my-ingress-gateway
servers:
- port:
number: 80
name: http2
protocol: HTTP2
hosts:
- "*"
另一个示例:
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: my-tcp-ingress
spec:
selector:
app: my-tcp-ingress-gateway
servers:
- port:
number: 27018
name: mongo
protocol: MONGO
hosts:
- "*"
443 端口 的 TLS 配置示例:
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: my-tls-ingress
spec:
selector:
app: my-tls-ingress-gateway
servers:
- port:
number: 443
name: https
protocol: HTTPS
hosts:
- "*"
tls:
mode: SIMPLE
serverCertificate: /etc/certs/server.pem
privateKey: /etc/certs/privatekey.pem
字段 | 类型 | 描述 | 是否必需 |
---|---|---|---|
port | Port | 代理侦听传入连接的端口 | 是 |
hosts | string[] | 此网关暴露的一个或多个主机。虽然它通常适用于 HTTP 服务,但也可以将其与 TLS 和 SNI 一起用于 TCP 服务。主机指定为带有可选 namespace/ 前缀的 dnsName 。dnsName 应该使用 FQDN 格式指定,可以在最左边的部分中包含一个通配符(如 prod/*.example.com )。dnsName 设置为 * 从指定的命名空间(如 prod/* )中选择所有的 VirtualService 主机。namespace 可以设置为 * 或. ,分别表示任一或当前的命名空间。例如,*/foo.example.com 从任何可用的命名空间中选择服务,而 ./foo.example.com 仅从 sidecar 的命名空间中选择服务。如果未指定 namespace/ ,则默认值为 */ ,即从任何命名空间中选择服务。所选命名空间中任何关联的 DestinationRule 也将被使用。VirtualService 必须绑定到网关,并且必须具有一个或多个与服务器中指定的主机匹配的主机。匹配可以是完全匹配,也可以是与服务器主机的后缀匹配。例如,如果服务器的主机指定 *.example.com ,则带有主机 dev.example.com 或 prod.example.com 的 VirtualService 将会匹配。但是,带有主机 example.com 或 newexample.com 的 VirtualService 将不匹配。注意:仅可以引用暴露到网关命名空间的 VirtualService (如 exportTo 值为 * ),私有配置(如 exportTo 设置为 . )将不可用 | 是 |
tls | TLSOptions | 用于控制服务器行为的 TLS 相关的选项集。使用这些选项可以控制是否应将所有 http 请求都重定向到 https,以及要使用的 TLS 模式 | 否 |
defaultEndpoint | string | 默认情况下,应将流量转发到的 loopback ip endpoint 或 Unix Domain Socket 。格式应为 127.0.0.1:port 或 unix:///path/to/socket 或 unix://@foobar (Linux抽象命名空间) | 否 |
Server.TLSOptions
字段 | 类型 | 描述 | 是否必需 |
---|---|---|---|
httpsRedirect | bool | 如果设置为 true,负载平衡器将为所有 HTTP 连接发送301重定向,要求客户端使用 HTTPS | 否 |
mode | TLSmode | (可选)表示是否使用 TLS 保护与该端口的连接。此字段的值确定如何启用 TLS | 否 |
serverCertificate | string | 要求 mode 为 SIMPLE 或 MUTUAL 。存放要使用的服务器端 TLS 证书文件的路径 | 否 |
privateKey | string | 要求 mode 为 SIMPLE 或 MUTUAL 。存放服务器私钥文件的路径 | 否 |
caCertificates | string | 要求 mode 为 MUTUAL 。存放用于验证提供的客户端证书的根证书文件的路径 | 否 |
credentialName | string | credentialName 表示可用于标识 serverCertificate 和 privateKey 的唯一标识符。带有后缀 -cacert 的 credentialName 用于标识与此服务器关联的 CaCertificates 。能够从远程证书存储库(如 Kubernetes secrets )中获取证书的网关工作负载将被配置为使用 credentialName 来检索 serverCertificate 和 privateKey ,而不是使用上面指定的文件系统路径。如果使用双向 TLS,则网关工作负载实例将使用 credentialName-cacert 检索 CaCertificates 。credentialName 的语义取决于平台。在 Kubernetes 中,默认 Istio 提供的证书服务器期望 credentialName 与 保存服务器证书、私钥 和 CA 证书(如果使用双向 TLS)的 Kubernetes secrets 的名称匹配。在网关的代理中设置 ISTIO_META_USER_SDS 元数据变量,以启用动态证书获取功能 | 否 |
subjectAltNames | string[] | 用于验证客户端提供的证书中的主题身份的备用名称列表 | 否 |
verifyCertificateSpki | string[] | 授权客户端证书的 SKPI 的 base64 编码的 SHA-256 哈希值的可选列表。注意:如果同时指定了 verifyCertificateHash 和 verifyCertificateSpki ,则与其中任何一个值匹配的哈希都将导致证书被接受 | 否 |
verifyCertificateHash | string[] | 授权客户端证书的十六进制编码 SHA-256 哈希值的可选列表。简单格式和冒号分隔格式都是可以的。注意:如果同时指定了 verifyCertificateHash 和 verifyCertificateSpki ,则与其中任何一个值匹配的哈希都将导致证书被接受 | 否 |
minProtocolVersion | TLSProtocol | (可选)最低 TLS 协议版本 | 否 |
maxProtocolVersion | TLSProtocol | (可选)最高 TLS 协议版本 | 否 |
cipherSuites | string[] | (可选)如果指定,则仅支持指定的密码列表。否则,默认为 Envoy 支持的默认密码列表 | 否 |
Server.TLSOptions.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 版本 |
Server.TLSOptions.TLSmode
代理启用的 TLS 模式。
名称 | 描述 |
---|---|
PASSTHROUGH | 客户端提供的 SNI 字符串将用作 VirtualService TLS 路由中的匹配条件,以从服务注册表中确定目标服务 |
SIMPLE | 使用标准 TLS 保护连接 |
MUTUAL | 通过提供服务器证书进行身份验证,使用双向 TLS 来保护到下游的连接 |
AUTO_PASSTHROUGH | 与 PASSTHROUGH 模式相似,不同的是,使用此 TLS 模式的服务器不需要关联的 VirtualService 将 SNI 值映射到注册表中的服务。目的地详细信息(如 service/subset/port )被编码在 SNI 值中,代理将转发到SNI值指定的上游(Envoy)集群(一组 endpoints )。该服务器通常用于在不同的 L3 网络中提供服务之间的连接,否则它们各自的 endpoints 之间没有直接连接。使用此模式假定源和目标都使用 Istio mTLS 来保护流量 |
ISTIO_MUTUAL | 通过提供服务器证书进行身份验证,使用双向 TLS 保护来自下游的连接。与 MUTUAL 模式相比,此模式使用 Istio 自动生成的证书(代表网关工作负载身份)进行 mTLS 认证。使用此模式时,TLSOptions 中的所有其他字段均应为空 |