【问题标题】:How can istio mesh-virtual-service manage traffic from ingress-virtual-service?istio mesh-virtual-service 如何管理来自 ingress-virtual-service 的流量?
【发布时间】:2021-07-12 23:41:19
【问题描述】:

我在 mesh-virtual-service 中定义金丝雀路由,并想知道我是否可以使其也适用于入口流量(使用 ingress-virtual-service)。使用类似下面的东西,但它不起作用(来自入口的所有流量都将转到非金丝雀版本)

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: test-deployment-app
  namespace: test-ns
spec:
  gateways:
  - mesh 
  hosts:
  - test-deployment-app.test-ns.svc.cluster.local
  http:
  - name: canary
    match:
    - headers:
        x-canary:
          exact: "true"
    - port: 8080
    headers:
      response:
        set:
          x-canary: "true"
    route:
    - destination:
        host: test-deployment-app-canary.test-ns.svc.cluster.local
        port:
          number: 8080
      weight: 100
  - name: stable
    route:
    - destination:
        host: test-deployment-app.test-ns.svc.cluster.local
        port:
          number: 8080
      weight: 100
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: test-deployment-app-internal
  namespace: test-ns
spec:
  gateways:
  - istio-system/default-gateway
  hosts:
  - myapp.dev.bla
  http:
  - name: default
    route:
    - destination:
        host: test-deployment-app.test-ns.svc.cluster.local
        port:
          number: 8080
      weight: 100

所以当我调用myapp.dev.bla 时,我期待x-canary:true 响应标头,但我没有看到。

【问题讨论】:

标签: kubernetes istio istio-gateway


【解决方案1】:

答案只是部分在您包含的链接中。我认为在使用 Istio 时要意识到“什么是 Istio 服务网格”。服务网格是每个带有 Istio envoy-proxy sidecar + 所有网关的 pod(网关是独立的 envoy-proxy)。他们都因为 IstioD 而相互了解,所以他们可以合作。

在您的 k8s 集群中,任何没有 Istio sidecar 的 pod(包括入口 pod 或即 kube-system pod)都不了解 Istio 或 Service Mesh。如果此类 pod 想要向 Service Mesh 发送流量(以应用一些流量管理规则,如您所拥有的),则必须通过 Istio Gateway 发送。 Gateway 是创建标准部署 + 服务的对象。部署中的 Pod 包含独立的 envoy-proxy 容器。

Gateway object 是一个与 k8s ingress 非常相似的概念。但它不一定要在 nodePort 上监听。您也可以将其用作“内部”网关。网关充当服务网格的入口点。无论是外部流量还是内部流量。

  1. 如果您使用 Nginx 作为 Ingress 解决方案,您必须重新配置 Ingress 规则以将流量发送到网关之一而不是目标服务。最有可能是您的mesh 网关。 istio-gatewayistio-system 命名空间内的 k8s Service 无非就是
  2. 或者,您可以将 Istio 网关配置为“新”入口。因为我不确定某些默认 Istio 网关是否在 nodePort 上侦听,所以您需要检查它(再次在 istio-gatewayistio-system 命名空间中。或者,您可以仅为您的应用程序创建新网关并将 VirtualService 应用于新网关也一样。

【讨论】:

  • 感谢您的详细说明。如果我做对了,在给定的示例中,只有 pod 到 pod 的流量(网内流量)将由主机 test-deployment-app.test-ns.svc.cluster.local 的虚拟服务配置/管理。我知道为入口流量添加一组额外的匹配器(使用主机myapp.dev.bla)会起作用,但我想检查是否有任何方法可以在集群内虚拟服务中定义匹配规则,并且这也适用于入口。我试图避免入口网关配置中的一些排序问题(多个应用程序使用同一主机并使用金丝雀标头等)
猜你喜欢
  • 1970-01-01
  • 2020-04-23
  • 2020-10-16
  • 2019-11-30
  • 2023-02-25
  • 1970-01-01
  • 2021-08-03
  • 1970-01-01
  • 2019-09-01
相关资源
最近更新 更多