使用 kubectl 修补 Istio 的 RouteRules 不生效
Patching Istio's RouteRules doesn't take effect using kubectl
我正在尝试通过更改每个版本的服务接收的流量比例来即时修补 Istio 的 RouteRule。现在当我 运行
kubectl describe routerule my-rule
我得到描述:
Name: my-rule
Namespace: default
Labels: <none>
Annotations: kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"config.istio.io/v1alpha2","kind":"RouteRule","metadata":{"annotations":{},"name":"my-rule","namespace":"default"},"spec":...
API Version: config.istio.io/v1alpha2
Kind: RouteRule
Metadata:
Cluster Name:
Creation Timestamp: 2018-05-25T16:21:59Z
Generation: 0
Resource Version: 154906
Self Link: /apis/config.istio.io/v1alpha2/namespaces/default/routerules/my-rule
UID: bfd78178-6037-11e8-8d5c-06f2e5b7e6b2
Spec:
Destination:
Name: MyApp
Match:
Request:
Headers:
Uri:
Prefix: /MyApp/
Rewrite:
Uri: /
Route:
Labels:
Version: v1
Weight: 10
Labels:
Version: v2
Weight: 90
现在我想更改规则,将 90% 的流量发送到 v1,将 10% 的流量发送到 v2:
kubectl patch routerule my-rule --type='json' -p='[{"op":"replace", "path":"/spec/route", "value":[{"labels":{"version":"v1"}, "weight": "90"}, {"labels":{"version":"v2"}, "weight": "10"}]}]'
当我运行这个时,命令成功routerule.config.istio.io "my-rule" patched
;如果我再次 运行 kubectl describe
我的规则,我可以验证它具有更新的值:
...
Route:
Labels:
Version: v1
Weight: 90
Labels:
Version: v2
Weight: 10
然而,这实际上并没有生效。当我到达端点时,我仍然看到应用了原始规则(大部分流量发送到 v2)。关于什么可能导致这种情况的任何想法?我是否需要以某种方式通知 Istio 规则已更改?
愚蠢的错误 - 弄清楚我做错了什么:
"weight": "90"
应该是 "weight": 90
(整数值而不是字符串)。然而奇怪的是 Istio 很乐意从补丁中获取字符串值并应用它,即使它应该报告错误。我会等着看他们是否会在稳定的试用版中修复它,否则会提出 PR。
我正在尝试通过更改每个版本的服务接收的流量比例来即时修补 Istio 的 RouteRule。现在当我 运行
kubectl describe routerule my-rule
我得到描述:
Name: my-rule
Namespace: default
Labels: <none>
Annotations: kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"config.istio.io/v1alpha2","kind":"RouteRule","metadata":{"annotations":{},"name":"my-rule","namespace":"default"},"spec":...
API Version: config.istio.io/v1alpha2
Kind: RouteRule
Metadata:
Cluster Name:
Creation Timestamp: 2018-05-25T16:21:59Z
Generation: 0
Resource Version: 154906
Self Link: /apis/config.istio.io/v1alpha2/namespaces/default/routerules/my-rule
UID: bfd78178-6037-11e8-8d5c-06f2e5b7e6b2
Spec:
Destination:
Name: MyApp
Match:
Request:
Headers:
Uri:
Prefix: /MyApp/
Rewrite:
Uri: /
Route:
Labels:
Version: v1
Weight: 10
Labels:
Version: v2
Weight: 90
现在我想更改规则,将 90% 的流量发送到 v1,将 10% 的流量发送到 v2:
kubectl patch routerule my-rule --type='json' -p='[{"op":"replace", "path":"/spec/route", "value":[{"labels":{"version":"v1"}, "weight": "90"}, {"labels":{"version":"v2"}, "weight": "10"}]}]'
当我运行这个时,命令成功routerule.config.istio.io "my-rule" patched
;如果我再次 运行 kubectl describe
我的规则,我可以验证它具有更新的值:
...
Route:
Labels:
Version: v1
Weight: 90
Labels:
Version: v2
Weight: 10
然而,这实际上并没有生效。当我到达端点时,我仍然看到应用了原始规则(大部分流量发送到 v2)。关于什么可能导致这种情况的任何想法?我是否需要以某种方式通知 Istio 规则已更改?
愚蠢的错误 - 弄清楚我做错了什么:
"weight": "90"
应该是 "weight": 90
(整数值而不是字符串)。然而奇怪的是 Istio 很乐意从补丁中获取字符串值并应用它,即使它应该报告错误。我会等着看他们是否会在稳定的试用版中修复它,否则会提出 PR。