Gateway

Gateway

Gateway 描述了在网格边缘运行的负载均衡器,接收传入或传出的 HTTP/TCP 连接。其中描述了一组应该公开的端口、要使用的协议类型、负载均衡器的 SNI 配置等。

下面的示例中,Gateway 设置了一个代理作为负载均衡器,以暴露端口 80 和 9080(http)、443(https)、9443(https)、2379(TCP)方便外部访问。该网关将被应用于在带有标签 app: my-gateway-controllerPod 上运行的代理。

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,以控制到达特定主机或网关端口的流量的转发。

下面的示例中,VirtualServicehttps://uk.bookinfo.com/reviewshttps://eu.bookinfo.com/reviewshttp://uk.bookinfo.com:9080/reviewshttp://eu.bookinfo.com:9080/reviews 的流量分到两个版本(prodqa)的 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 来限制绑定到 GatewayVirtualService。下面的示例中,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 连接。

字段类型描述是否必需
serversServer[]server 参数列表
selectormap<string, string>一个或多个标签,指定在其上应用该网关配置的一组特定的 Pod/VM。标签搜索的范围仅限于存在资源的配置命名空间,即网关必须与网关工作负载实例位于相同的名称空间中

Port

Port 描述了服务特定端口的属性。

字段类型描述是否必需
numberuint32有效的非负整数端口号
protocolstring端口上公开的协议,必须是 HTTP | HTTPS | GRPC | HTTP2 | MONGO | TCP | TLS 中的一种。TLS 意味着连接将基于 SNI 报头路由到目的地,而不会终止 TLS 连接
namestring端口的标签

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
字段类型描述是否必需
portPort代理侦听传入连接的端口
hostsstring[]此网关暴露的一个或多个主机。虽然它通常适用于 HTTP 服务,但也可以将其与 TLS 和 SNI 一起用于 TCP 服务。主机指定为带有可选 namespace/ 前缀的 dnsNamednsName 应该使用 FQDN 格式指定,可以在最左边的部分中包含一个通配符(如 prod/*.example.com)。dnsName 设置为 * 从指定的命名空间(如 prod/*)中选择所有的 VirtualService 主机。namespace 可以设置为 *.,分别表示任一或当前的命名空间。例如,*/foo.example.com 从任何可用的命名空间中选择服务,而 ./foo.example.com 仅从 sidecar 的命名空间中选择服务。如果未指定 namespace/,则默认值为 */,即从任何命名空间中选择服务。所选命名空间中任何关联的 DestinationRule 也将被使用。VirtualService 必须绑定到网关,并且必须具有一个或多个与服务器中指定的主机匹配的主机。匹配可以是完全匹配,也可以是与服务器主机的后缀匹配。例如,如果服务器的主机指定 *.example.com,则带有主机 dev.example.comprod.example.comVirtualService 将会匹配。但是,带有主机 example.comnewexample.comVirtualService 将不匹配。注意:仅可以引用暴露到网关命名空间的 VirtualService(如 exportTo 值为 *),私有配置(如 exportTo 设置为 .)将不可用
tlsTLSOptions用于控制服务器行为的 TLS 相关的选项集。使用这些选项可以控制是否应将所有 http 请求都重定向到 https,以及要使用的 TLS 模式
defaultEndpointstring默认情况下,应将流量转发到的 loopback ip endpointUnix Domain Socket。格式应为 127.0.0.1:portunix:///path/to/socketunix://@foobar(Linux抽象命名空间)

Server.TLSOptions

字段类型描述是否必需
httpsRedirectbool如果设置为 true,负载平衡器将为所有 HTTP 连接发送301重定向,要求客户端使用 HTTPS
modeTLSmode(可选)表示是否使用 TLS 保护与该端口的连接。此字段的值确定如何启用 TLS
serverCertificatestring要求 modeSIMPLEMUTUAL。存放要使用的服务器端 TLS 证书文件的路径
privateKeystring要求 modeSIMPLEMUTUAL。存放服务器私钥文件的路径
caCertificatesstring要求 modeMUTUAL。存放用于验证提供的客户端证书的根证书文件的路径
credentialNamestringcredentialName 表示可用于标识 serverCertificateprivateKey 的唯一标识符。带有后缀 -cacertcredentialName 用于标识与此服务器关联的 CaCertificates。能够从远程证书存储库(如 Kubernetes secrets)中获取证书的网关工作负载将被配置为使用 credentialName 来检索 serverCertificateprivateKey,而不是使用上面指定的文件系统路径。如果使用双向 TLS,则网关工作负载实例将使用 credentialName-cacert 检索 CaCertificatescredentialName 的语义取决于平台。在 Kubernetes 中,默认 Istio 提供的证书服务器期望 credentialName 与 保存服务器证书、私钥 和 CA 证书(如果使用双向 TLS)的 Kubernetes secrets 的名称匹配。在网关的代理中设置 ISTIO_META_USER_SDS 元数据变量,以启用动态证书获取功能
subjectAltNamesstring[]用于验证客户端提供的证书中的主题身份的备用名称列表
verifyCertificateSpkistring[]授权客户端证书的 SKPI 的 base64 编码的 SHA-256 哈希值的可选列表。注意:如果同时指定了 verifyCertificateHashverifyCertificateSpki,则与其中任何一个值匹配的哈希都将导致证书被接受
verifyCertificateHashstring[]授权客户端证书的十六进制编码 SHA-256 哈希值的可选列表。简单格式和冒号分隔格式都是可以的。注意:如果同时指定了 verifyCertificateHashverifyCertificateSpki,则与其中任何一个值匹配的哈希都将导致证书被接受
minProtocolVersionTLSProtocol(可选)最低 TLS 协议版本
maxProtocolVersionTLSProtocol(可选)最高 TLS 协议版本
cipherSuitesstring[](可选)如果指定,则仅支持指定的密码列表。否则,默认为 Envoy 支持的默认密码列表

Server.TLSOptions.TLSProtocol

TLS 协议版本。

名称描述
TLS_AUTO自动选择最佳的 TLS 版本
TLSV1_0TLS 1.0 版本
TLSV1_1TLS 1.1 版本
TLSV1_2TLS 1.2 版本
TLSV1_3TLS 1.3 版本

Server.TLSOptions.TLSmode

代理启用的 TLS 模式。

名称描述
PASSTHROUGH客户端提供的 SNI 字符串将用作 VirtualService TLS 路由中的匹配条件,以从服务注册表中确定目标服务
SIMPLE使用标准 TLS 保护连接
MUTUAL通过提供服务器证书进行身份验证,使用双向 TLS 来保护到下游的连接
AUTO_PASSTHROUGHPASSTHROUGH 模式相似,不同的是,使用此 TLS 模式的服务器不需要关联的 VirtualService 将 SNI 值映射到注册表中的服务。目的地详细信息(如 service/subset/port)被编码在 SNI 值中,代理将转发到SNI值指定的上游(Envoy)集群(一组 endpoints)。该服务器通常用于在不同的 L3 网络中提供服务之间的连接,否则它们各自的 endpoints 之间没有直接连接。使用此模式假定源和目标都使用 Istio mTLS 来保护流量
ISTIO_MUTUAL通过提供服务器证书进行身份验证,使用双向 TLS 保护来自下游的连接。与 MUTUAL 模式相比,此模式使用 Istio 自动生成的证书(代表网关工作负载身份)进行 mTLS 认证。使用此模式时,TLSOptions 中的所有其他字段均应为空

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值