如何为暴露多个端口的服务配置 Istio 的虚拟服务?

ena*_*tor 3 kubernetes istio

我有一个暴露多个端口的容器。因此,为部署配置的 kubernetes 服务如下所示:

kind: Service
apiVersion: v1
metadata:
  name: myapp
  labels:
    app: myapp
spec:
  selector:
    name: myapp
  ports:
  - protocol: TCP
    port: 5555
    targetPort: 5555
  - protocol: TCP
    port: 5556
    targetPort: 5556
Run Code Online (Sandbox Code Playgroud)

我使用 Istio 来管理路由并通过 istio 入口网关公开此服务。我们有一个 80 端口的网关,我们是否必须为具有两个不同虚拟服务的同一主机创建两个不同的网关?

我想将 "example.myhost.com" 的 80 路由配置为 5556 和其他一些端口,比如 "example.myhost.com" 的 8088 路由到服务的 5555。

这可以通过一个虚拟服务实现吗?

Nic*_*_Kh 11

假设 Istio网关正在为 TCP 网络连接提供服务,您可能能够Gateway为两个外部端口 80 和 5556组合一种配置:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: myapp-gateway
spec:
  selector:
    istio: ingressgateway # use istio default controller
  servers:
  - port:
      number: 80
      name: port1
      protocol: TCP
    hosts:
    - example.myhost.com
  - port:
      number: 8088
      name: port2
      protocol: TCP
    hosts:
    - example.myhost.com
Run Code Online (Sandbox Code Playgroud)

字段hosts在此处标识必须由 this 公开的目标地址列表Gateway

为了对嵌套的 Pod 进行适当的网络路由,您可以使用端口的匹配集指定VirtualService

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: myapp-virtual-service
spec:
  hosts:
  - example.myhost.com 
  gateways:
  - myapp-gateway
  tcp:
  - match:
    - port: 80
    route:
    - destination:
        host: myapp.prod.svc.cluster.local
        port:
          number: 5556
  - match:
    - port: 8088
    route:
    - destination:
        host: myapp.prod.svc.cluster.local
        port:
          number: 5555
Run Code Online (Sandbox Code Playgroud)

以上VirtualService定义了将来自 80 和 8088 端口的网络流量分别路由example.myhost.commyapp服务端口 5556、5555的规则。

我鼓励您获取有关 Istio TCPRoute功能和更多设备的更多信息。