virtual-environment icon indicating copy to clipboard operation
virtual-environment copied to clipboard

在services中修改annotations:kt-virtual-environment/rule: 后不会更新vs,需要重新删除svc重新创建。

Open SJFCS opened this issue 3 years ago • 3 comments

在services中修改annotations:kt-virtual-environment/rule: 后不会更新vs,需要重新删除svc重新创建。

测试过修改svc中Prefix字段或allowOrigin字段

kt-virtual-environment/rule: '{"Match":[{"Uri":{"Prefix":"/"}}],"corsPolicy":{"allowOrigin":["*"],"allowCredentials":true,"allowHeaders":["app-key","xxx"],"allowMethods":["GET","POST","PUT","DELETE","PATCH","OPTIONS"]}}'

之后 virtual-env-operator 多出如下日志

[Info] 2022-02-18 11:04:27 Adding Service gateway
[Info] 2022-02-18 11:04:27 Trigger reconcile VirtualEnvironment
[Info] 2022-02-18 11:04:32 Send reconcile signal
[Info] 2022-02-18 11:04:32 Receive reconcile request with name: virtualenv
[Info] 2022-02-18 11:04:32 Unmarshal route rule successful

但vs中配置并未更新

删除svc重建后vs更新,virtual-env-operator 日志如下

[Info] 2022-02-18 11:09:09 Removing Service gateway
[Info] 2022-02-18 11:09:09 VirtualService deleted gateway
[Info] 2022-02-18 11:09:09 Push reconcile request to trigger virtualenv
[Info] 2022-02-18 11:09:09 Trigger reconcile VirtualEnvironment
[Info] 2022-02-18 11:09:09 DestinationRule deleted gateway
[Info] 2022-02-18 11:09:09 Push reconcile request to trigger virtualenv
[Info] 2022-02-18 11:09:12 Adding Service gateway
[Info] 2022-02-18 11:09:19 Send reconcile signal
[Info] 2022-02-18 11:09:19 Receive reconcile request with name: virtualenv
[Info] 2022-02-18 11:09:19 Unmarshal route rule successful
[Info] 2022-02-18 11:09:19 Push reconcile request to trigger virtualenv
[Info] 2022-02-18 11:09:19 VirtualService gateway created
[Info] 2022-02-18 11:09:19 Push reconcile request to trigger virtualenv
[Info] 2022-02-18 11:09:19 DestinationRule gateway created

SJFCS avatar Feb 18 '22 11:02 SJFCS

遇到了同样的问题,此外,还有一个相关问题:

当一个service只关联了一个版本的Pod,没有子集pod时,不会为这个service创建virtualservice,这就导致service上配置的kt-virtual-environment/rule就失效了,如url重写之类的规则。

建议为service创建一个托底的virtualservice,无论该service下有没有子集pod

362475097 avatar Aug 12 '22 03:08 362475097

遇到了同样的问题,此外,还有一个相关问题:

当一个service只关联了一个版本的Pod,没有子集pod时,不会为这个service创建virtualservice,这就导致service上配置的kt-virtual-environment/rule就失效了,如url重写之类的规则。

建议为service创建一个托底的virtualservice,无论该service下有没有子集pod

362475097 avatar Aug 12 '22 03:08 362475097

看了源码,发现没有对自定义VirtualService规则做判断,可以在位于virtual_service_generator.go里的isRouteEqual方法中最上面插入以下代码,然后编译打包

        if route.Redirect != target.Redirect {
		return false
	}

	if route.Rewrite != target.Rewrite {
		return false
	}

	if route.WebsocketUpgrade != target.WebsocketUpgrade {
		return false
	}

	if route.Timeout != target.Timeout {
		return false
	}

	if route.Retries != target.Retries {
		return false
	}

	if !reflect.DeepEqual(route.Fault, target.Fault) {
		return false
	}

	if !reflect.DeepEqual(route.Mirror, target.Mirror) {
		return false
	}

	if !reflect.DeepEqual(route.DeprecatedAppendHeaders, target.DeprecatedAppendHeaders) {
		return false
	}

	if !reflect.DeepEqual(route.Headers, target.Headers) {
		return false
	}

	if !reflect.DeepEqual(route.RemoveResponseHeaders, target.RemoveResponseHeaders) {
		return false
	}

	if !reflect.DeepEqual(route.CorsPolicy, target.CorsPolicy) {
		return false
	}

至于我说的另外问题,可以参考提交记录,把加上的判断再去掉就好了

362475097 avatar Aug 13 '22 07:08 362475097