如何在不知道值的情况下附加DestinationRules?

时间:2018-07-10 08:01:12

标签: kubernetes kubernetes-helm istio

我们正在运行一个通过Istio划分为微服务的应用程序,该应用程序在k8s上运行,并带有头盔并在GitLab CI / CD环境中构建。 我想做的是实现GitLab提供的“评论应用”功能。这个想法是整个服务不会被触及,只有可审阅的服务会添加到网格中,并且可以通过在原始请求x-request-version:[git sha]中添加标头(或其他内容)来调用(例如)。

现在我偶然发现的问题是我无法在同一主机上启动额外的VirtualService。我知道我可以为此使用Match-directive和DestinationRules。但是从CI / CD的角度来看,我不知道哪些规则已经生效。应该可以同时在线拥有多个评论应用程序,因为有多个开发人员同时在从事相同的服务。

所以我想知道是否有一种方法可以动态地(不知道当前应用的规则)附加(和删除)Istio VirtualServices和DestinationRules?

谢谢!


也许一个代码示例将以某种方式澄清一些问题:

主要VirtualService

kind: VirtualService
metadata:
  name: catalog
spec:
  gateways:
  - staging-gateway
  hosts:
  - catalog
  - "catalog.staging.services.example.com"
  http:
  - route:
    - destination:
        host: catalog
        subset: e3b0c442
    retries:
      attempts: 3
      perTryTimeout: 2s
  ## REVIEW 01 ##
  - match:                     # <---- Dynamic (Review 01)
    - headers:                 # <---- Dynamic (Review 01)
        x-request-version:     # <---- Dynamic (Review 01)
          exact: 9489bcb3      # <---- Dynamic (Review 01)
      route:                   # <---- Dynamic (Review 01)
      - destination:           # <---- Dynamic (Review 01)
          host: catalog        # <---- Dynamic (Review 01)
          subset: 9489bcb3     # <---- Dynamic (Review 01)
      retries:                 # <---- Dynamic (Review 01)
        attempts: 3            # <---- Dynamic (Review 01)
        perTryTimeout: 2s      # <---- Dynamic (Review 01)

目的地规则

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: catalog
spec:
  host: catalog
  subsets:
  - name: e3b0c442      # <---- main service
    labels:             # <---- main service
      sha: e3b0c442     # <---- main service
      app: catalog      # <---- main service

  - name: 9489bcb3      # <---- Dynamic (Review 01)
    labels:             # <---- Dynamic (Review 01)
      sha: 9489bcb3     # <---- Dynamic (Review 01)
      app: catalog      # <---- Dynamic (Review 01)

2天后添加

我试图可视化设置。 如您所见,在这种情况下,只有两个部署是边缘服务,可以从外部访问。其他服务(MS)只能由其他服务访问。 如果设置了适当的标头,则两个黄色部署是MS10的一个分支(合并请求)。这样,我可以定位部署的“审阅”版本而无需更改主机名。

例如:

  1. 我请求:https://ms1.services.example.com
  2. MS1将请求:MS6-> MS11-> MS10(按主机名:http://ms6http://ms11http://ms10

如果我要针对特定​​版本的ms10(审阅),则需要更改ms11的代码,然后将我的网格划分为-确实-网格。因此,当我使用标头并通过所有请求发送此标头时,可以使用Istio定位特定的发行版。在这种情况下,Gitlab的环境还不够。

Service Mesh Example

0 个答案:

没有答案
相关问题