本系列OpenShift Servic Mesh教程是基于Red Hat官方公开发行的《Introducing Istio Service Mesh for Micoservices》出版物,我将所有操作在OpenShift 4.2.x环境中进行了验证。喜欢读英文或者需要了解更多和场景相关知识点的小伙伴可以通过上面的链接下载该书慢慢阅读。
在VirtualService中可以对HTTP请求注入模拟的故障,从而实现混沌测试。这是通过在VirtualService中设置HTTPFaultInjection的delay和abort属性实现的。
- delay用来延时访问。
- abort用来终止访问。
下面以recommendation微服务为例实现delay和abort混沌测试。需要按照《OpenShift 4 之Istio-Tutorial (6) 服务恢复能力》的“环境准备”部署recommendation v1和recommendation 2,并且删除所有针对recommendation的VirtualService和DestinationRule。
- 首先查看istiofiles/destination-rule-recommendation.yml文件,其中定义了名为recommendation的DestinationRule,它会将发到名为recommendation的Service的请求平均分配给后台所有lable包含“app=recommendation”的Pod。
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: recommendation
spec:
host: recommendation
subsets:
- labels:
app: recommendation
name: app-recommendation
- 执行命令,为名为recommendation的Service创建DestinationRule。
$ oc apply -f istiofiles/destination-rule-recommendation.yml
注入延时故障
- 查看istiofiles/virtual-service-recommendation-delay.yml,其中在VirtualService中定义了将50%的请求注入7s的延时。
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: recommendation
spec:
hosts:
- recommendation
http:
- fault:
delay:
fixedDelay: 7.000s
percent: 50
route:
- destination:
host: recommendation
subset: app-recommendation
- 执行命令创建VirtualService。
$ oc apply -f istiofiles/virtual-service-recommendation-delay.yml
- 执行命令,验证测试请求的响应时间。可以发现有的请求返回比较快,有的返回比较慢。
$ export INGRESS_GATEWAY=$(oc get route istio-ingressgateway -n istio-system -o 'jsonpath={.spec.host}')
$ ./scripts/run.sh $INGRESS_GATEWAY/customer
- 进入Kiali控制台的Distributed Trace,在Service选择recommendation,在Lookback选择1m,然后点击右侧的Search Traces按钮。然后在下方可以看到跟踪到的请求和消耗的时间。其中快的请求是ms级别,慢的请求超过7s。
注入终止故障
- 查看istiofiles/virtual-service-recommendation-503.yml文件,他定义了终止abort故障,对50%的recommendation请求返回HTTP 503。
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: recommendation
spec:
hosts:
- recommendation
http:
- fault:
abort:
httpStatus: 503
percent: 50
route:
- destination:
host: recommendation
subset: app-recommendation
- 执行命令创建VirtualService。
$ oc apply -f istiofiles/virtual-service-recommendation-503.yml
- 执行命令连续访问customer微服务。可以看到有一部分会返回结果是503的错误。
$ export INGRESS_GATEWAY=$(oc get route istio-ingressgateway -n istio-system -o 'jsonpath={.spec.host}')
$ ./scripts/run.sh $INGRESS_GATEWAY/customer
customer => preference => recommendation v1 from '67976848-4l4s7': 13
customer => Error: 503 - preference => Error: 503 - fault filter abort
customer => Error: 503 - preference => Error: 503 - fault filter abort
customer => preference => recommendation v1 from '67976848-4l4s7': 14
customer => preference => recommendation v1 from '67976848-4l4s7': 15
customer => Error: 503 - preference => Error: 503 - fault filter abort