网关

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

例如,以下网关配置设置了一个代理,该代理充当负载均衡器,公开端口 80 和 9080 (http)、443 (https)、9443(https) 以及端口 2379 (TCP) 用于入口。网关将应用于在具有标签 app: my-gateway-controller 的 Pod 上运行的代理。虽然 Istio 将配置代理以监听这些端口,但用户有责任确保允许外部流量进入这些端口进入网格。

apiVersion: networking.istio.io/v1
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:
    - "*"

上面的网关规范描述了负载均衡器的 L4-L6 属性。然后可以将 虚拟服务 绑定到网关,以控制到达特定主机或网关端口的流量转发。

例如,以下 VirtualService 将流量从 https://uk.bookinfo.com/reviewshttps://eu.bookinfo.com/reviewshttp://uk.bookinfo.com:9080/reviewshttp://eu.bookinfo.com:9080/reviews 拆分为内部评论服务的两个版本(prod 和 qa),该服务在端口 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/v1
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 的流量转发到内部 Mongo 服务器的端口 5555。此规则不适用于网格内部,因为网关列表省略了保留名称 mesh

apiVersion: networking.istio.io/v1
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

可以使用 hosts 字段中的命名空间/主机名语法限制可以绑定到网关服务器的虚拟服务集。例如,以下网关允许 ns1 命名空间中的任何虚拟服务绑定到它,同时仅限制 ns2 命名空间中具有 foo.bar.com 主机的虚拟服务绑定到它。

apiVersion: networking.istio.io/v1
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"

网关

网关描述一个在网格边缘运行的负载均衡器,接收传入或传出的 HTTP/TCP 连接。

字段类型描述必填
serversServer[]

服务器规范列表。

selectormap<string, string>

一个或多个标签,指示应应用此网关配置的特定一组 Pod/VM。默认情况下,跨所有命名空间搜索工作负载以匹配标签选择器。这意味着“foo”命名空间中的网关资源可以根据标签选择“bar”命名空间中的 Pod。此行为可以通过 istiod 中的 PILOT_SCOPE_GATEWAY_TO_NAMESPACE 环境变量控制。如果将此变量设置为 true,则标签搜索范围将限制为资源所在的配置命名空间。换句话说,网关资源必须与网关工作负载实例位于相同的命名空间。如果 selector 为 nil,则网关将应用于所有工作负载。

服务器

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

apiVersion: networking.istio.io/v1
kind: Gateway
metadata:
  name: my-ingress
spec:
  selector:
    app: my-ingressgateway
  servers:
  - port:
      number: 80
      name: http2
      protocol: HTTP2
    hosts:
    - "*"

另一个示例

apiVersion: networking.istio.io/v1
kind: Gateway
metadata:
  name: my-tcp-ingress
spec:
  selector:
    app: my-tcp-ingressgateway
  servers:
  - port:
      number: 27018
      name: mongo
      protocol: MONGO
    hosts:
    - "*"

以下是端口 443 的 TLS 配置示例

apiVersion: networking.istio.io/v1
kind: Gateway
metadata:
  name: my-tls-ingress
spec:
  selector:
    app: my-tls-ingressgateway
  servers:
  - port:
      number: 443
      name: https
      protocol: HTTPS
    hosts:
    - "*"
    tls:
      mode: SIMPLE
      credentialName: tls-cert
字段类型描述必填
port端口

代理应监听传入连接的端口。

bindstring

监听器应绑定的 IP 或 Unix 域套接字。格式:x.x.x.xunix:///path/to/udsunix://@foobar(Linux 抽象命名空间)。使用 Unix 域套接字时,端口号应为 0。这可以用来限制此服务器的可达性,使其仅限于网关内部。这通常用于网关需要与另一个网格服务通信时,例如发布指标。在这种情况下,使用指定绑定创建的服务器将不可用于外部网关客户端。

hostsstring[]

此网关公开的一个或多个主机。虽然通常适用于 HTTP 服务,但它也可以用于使用带有 SNI 的 TLS 的 TCP 服务。主机指定为 dnsName,可选地带有 namespace/ 前缀。dnsName 应使用 FQDN 格式指定,可选地在最左侧组件中包含通配符(例如,prod/*.example.com)。将 dnsName 设置为 * 以选择来自指定命名空间的所有 VirtualService 主机(例如,prod/*)。

namespace 可以设置为 *.,分别表示任何命名空间或当前命名空间。例如,*/foo.example.com 从任何可用命名空间选择服务,而 ./foo.example.com 仅从边车的命名空间选择服务。默认情况下,如果没有指定 namespace/,则为 */,即从任何命名空间选择服务。所选命名空间中的任何关联 DestinationRule 也将被使用。

VirtualService 必须绑定到网关,并且必须有一个或多个主机与服务器中指定的 host 匹配。匹配可以是完全匹配或服务器 host 的后缀匹配。例如,如果服务器的 host 指定 *.example.com,则 VirtualService 具有 host dev.example.comprod.example.com 将匹配。但是,VirtualService 具有 host example.comnewexample.com 将不匹配。

注意:仅导出到网关命名空间的虚拟服务(例如,exportTo 的值为 *)可以被引用。私有配置(例如,exportTo 设置为 .)将不可用。有关详细信息,请参阅 VirtualServiceDestinationRuleServiceEntry 配置中的 exportTo 设置。

tlsServerTLSSettings

一组 TLS 相关选项,用于控制服务器的行为。使用这些选项控制是否应将所有 http 请求重定向到 https,以及要使用的 TLS 模式。

namestring

服务器的可选名称,如果设置,则在所有服务器中必须是唯一的。这将用于各种目的,例如使用此名称作为前缀生成统计信息等。

端口

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

字段类型描述必填
numberuint32

有效的非负整数端口号。

protocolstring

在端口上公开的协议。必须是 HTTP|HTTPS|GRPC|GRPC-WEB|HTTP2|MONGO|TCP|TLS 之一。TLS 可以用来在特定端口上终止非基于 HTTP 的连接,也可以用来根据 SNI 标头对目标进行路由,而不会终止 TLS 连接。

namestring

分配给端口的标签。

ServerTLSSettings

字段类型描述必填
httpsRedirectbool

如果设置为 true,负载均衡器将为所有 http 连接发送 301 重定向,要求客户端使用 HTTPS。

modeTLSmode

可选:指示是否应使用 TLS 来保护此端口的连接。此字段的值决定如何强制执行 TLS。

serverCertificatestring

如果 mode 为 SIMPLEMUTUAL,则为必填项。包含要使用的服务器端 TLS 证书的文件的路径。

privateKeystring

如果 mode 为 SIMPLEMUTUAL,则为必填项。包含服务器私钥的文件的路径。

caCertificatesstring

如果 mode 为 MUTUALOPTIONAL_MUTUAL,则为必填项。包含用于验证所呈现的客户端证书的证书颁发机构证书的文件的路径。

caCrlstring

可选:包含用于验证所呈现的客户端证书的证书吊销列表 (CRL) 的文件的路径。CRL 是证书颁发机构 (CA) 在其计划到期日期之前吊销的证书列表。如果指定,代理将验证所呈现的证书是否属于已吊销的证书列表。如果省略,代理将不会根据 crl 验证证书。

credentialNamestring

对于在 Kubernetes 上运行的网关,包含 TLS 证书(包括 CA 证书)的秘密的名称。仅适用于 Kubernetes。不透明秘密应包含以下键和值:tls.key: <privateKey>tls.crt: <serverCert>key: <privateKey>cert: <serverCert>。对于双向 TLS,可以在同一个秘密中提供 cacert: <CACertificate>crl: <CertificateRevocationList>,或者在名为 <secret>-cacert 的单独秘密中提供。还支持用于服务器证书的 TLS 秘密,以及用于指定 OCSP 装订信息的附加 tls.ocsp-staple 键、CA 证书的 ca.crt 键和证书吊销列表的 ca.crl。只能指定服务器证书和 CA 证书或 credentialName 之一。

subjectAltNamesstring[]

验证客户端呈现的证书中的主体身份的备用名称列表。

verifyCertificateSpkistring[]

授权客户端证书的 SPKI 的 base64 编码 SHA-256 哈希的可选列表。注意:当同时指定 verify_certificate_hash 和 verify_certificate_spki 时,与任一值匹配的哈希将导致证书被接受。

verifyCertificateHashstring[]

授权客户端证书的十六进制编码 SHA-256 哈希的可选列表。简单格式和冒号分隔格式均可接受。注意:当同时指定 verify_certificate_hash 和 verify_certificate_spki 时,与任一值匹配的哈希将导致证书被接受。

minProtocolVersionTLSProtocol

可选:最低 TLS 协议版本。默认情况下,它为 TLSV1_2。低于 TLSV1_2 的 TLS 协议版本需要使用 cipherSuites 设置来设置兼容的密码,因为它们不再包含兼容的密码。

注意:使用低于 TLSV1_2 的 TLS 协议版本存在严重的安全性风险。

maxProtocolVersionTLSProtocol

可选:最高 TLS 协议版本。

cipherSuitesstring[]

可选:如果指定,则仅支持指定的密码列表。否则,默认使用 Envoy 支持的默认密码列表,如 此处 所指定。支持的密码列表为

  • ECDHE-ECDSA-AES128-GCM-SHA256
  • ECDHE-RSA-AES128-GCM-SHA256
  • ECDHE-ECDSA-AES256-GCM-SHA384
  • ECDHE-RSA-AES256-GCM-SHA384
  • ECDHE-ECDSA-CHACHA20-POLY1305
  • ECDHE-RSA-CHACHA20-POLY1305
  • ECDHE-ECDSA-AES128-SHA
  • ECDHE-RSA-AES128-SHA
  • ECDHE-ECDSA-AES256-SHA
  • ECDHE-RSA-AES256-SHA
  • AES128-GCM-SHA256
  • AES256-GCM-SHA384
  • AES128-SHA
  • AES256-SHA
  • DES-CBC3-SHA

ServerTLSSettings.TLSmode

代理强制执行的 TLS 模式

名称描述
PASSTHROUGH

客户端呈现的 SNI 字符串将用作 VirtualService TLS 路由中的匹配条件,以确定服务注册表中的目标服务。

SIMPLE

使用标准 TLS 语义的保护连接。在此模式下,握手期间不会请求客户端证书。

MUTUAL

通过呈现用于身份验证的服务器证书,与下游建立使用双向 TLS 的安全连接。握手期间还将请求客户端证书,并且客户端必须发送至少一个有效证书。

AUTO_PASSTHROUGH

类似于 passthrough 模式,但具有此 TLS 模式的服务器不需要关联的 VirtualService 来从 SNI 值映射到注册表中的服务。服务/子集/端口等目标详细信息编码在 SNI 值中。代理将转发到由 SNI 值指定的 upstream (Envoy) 集群(一组端点)。此服务器通常用于在彼此之间没有直接连接的独立 L3 网络中的服务之间提供连接。使用此模式假设源和目标都使用 Istio mTLS 来保护流量。

ISTIO_MUTUAL

通过呈现用于身份验证的服务器证书,来自下游的保护连接使用双向 TLS。与 Mutual 模式相比,此模式使用 Istio 自动为 mTLS 身份验证生成的证书,代表网关工作负载身份。使用此模式时,TLSOptions 中的所有其他字段都应为空。

OPTIONAL_MUTUAL

类似于 MUTUAL 模式,只是客户端证书是可选的。与 SIMPLE 模式不同,握手期间仍将明确请求客户端证书,但客户端无需发送证书。如果呈现客户端证书,则将对其进行验证。ca_certificates 应指定用于验证客户端证书。

ServerTLSSettings.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

这些信息是否有用?
您有什么改进建议吗?

感谢您的反馈!