我们正在运行一个通过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的一个分支(合并请求)。这样,我可以定位部署的“审阅”版本而无需更改主机名。
例如:
如果我要针对特定版本的ms10(审阅),则需要更改ms11的代码,然后将我的网格划分为-确实-网格。因此,当我使用标头并通过所有请求发送此标头时,可以使用Istio定位特定的发行版。在这种情况下,Gitlab的环境还不够。