开发者学堂课程【微服务实战-Service Mesh 与 Istio:Istio 服务韧性】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/620/detail/9438
Istio 服务韧性
目录:
一、访问超时
二、熔断操作
三、测试
四、流量速率限制
一、访问超时
现在需要调整访问超时的时间,一个是通过故障注入,通过延长相应的时间来注入故障,一个是改变超时或延长超时来减少故障,消灭故障。
操作:
US-169691-MP
:istio andy.shi$ kubectl apply -f <apiVersion:networking.istio.io/v1alpha3
>kind:VirtualService
)metadata:
name:reviews
spec:
hosts:
reviews
http:
route:
一destination:
host:reviews
subset:v2
>EOF
virtualservice.networking.istio.io/reviews createdUS-169691-MP:istio andy.shi$
US-169691-MP
:istio andy.shi$ kubectl delete -f samples/bookinfo/networking/virtual-service-allv1.yaml
virtualservice.networking.istio.io "reviews" deleted
virtualservice.networking.istio.io "ratings" deleted
Error from server (NotFound)
:error when deleting"samples/bookinfo/networking/virtual-serviceall-v1.yaml":virtualservices.networking.istio.io"productpage"not found
Error from server (NotFound):error when deleting"samples/bookinfo/networking/virtual-serviceall-v1.yaml": virtualservices.networking.istio.io"details"not found
US-169691-MP
:istio andy.shi$//
只是对名字,不是具体操作。这是一个偷懒的做法但是很有用。
总结:
在超时的操作中,把 reviews 的超时设为半秒钟,但是 reviews 除了自己的文本以外,还有注入延迟需要两秒钟,所以就报错了。和故障注入很像,为了显示超时很重要,需要显示出来,否则就没有意义了。
要把调用它的服务延迟缩短,把超时延长,不要加注,可以调到3秒或4秒,操作的结果是一切正常。跟超时类似的结果就是冲蚀。
冲蚀操作如下:
apiVersion:networking.istio.io/v1alpha3kind:VirtualService
metadata:
name:ratings
spec:
hosts:
ratings
http:
route:
destination:
host:ratings
subset:v1//
都是一样的
retries:
attempts
:3//
试三次
perTryTimeout: 2s//
每次2秒钟
二、熔断操作
什么是 springcoud 的熔断机制,熔断机制是对分布式架构项目的一种起到保护作用的手段或者机制,就像继电器Q里面的保险丝,到达某个临界点就会自动熔断保险丝,以达到保护电路的作用,切换到 SpringCloud 里面也是同样的道理,是从可用性着想,为防止系统的整体缓慢甚至崩溃,采用的技术手段,也就是熔断机制。
springcloud 的熔断机制触发一般是因为某个服务的故障所引起,及时的进行熔断,避免了雪崩效应的出现。
US-169691-MP:istio andy.shi$ kubectl apply -f-<
kind:DestinationRule
metadata:
name:productpage
spec:
host:productpage
trafficPolicy:
connectionPool:
tcp:
maxConnections:1
http:
http1MaxPendingRequests:1
maxRequestsPerConnection:1
outlierDetection:
consecutiveErrors:1
interval:1s
baseEjectionTime:3m
maxEjectionPercent
:100
tls
:
mode:ISTIO_MUTUAL
EOF
三、测试
US-169691-MP:istio andy.shi$ docker run -p 8080:8080-p 8079:8079 fortio/fortio server[1] 67116
US-169691-MP:istio andy.shi$ Fortio 1.3.2-pre grpc 'ping' serverlistening on
[::]:8079Fortio 1.3.2-pre https redirector server listening on [::]:8081
Fortio 1.3.2-pre echo serverlistening on
[::]:8080
02:24:44 I fortio_main.go:214> A11 fortio 1.3.2-pre2019-04-29 15:41 f8f17fa310d60960f8267e1625231cf6e5ce459d go1.11.5servers started!
Data directory is /var/lib/fortio
UIstarted - visit:
http://localhost:8080/fortio/
(or any host/ipreachable on this server)
所以这就是熔断的演示,不要忘记清理一下,否则会与后面的内容冲突,删掉即可。
四、流量速率限制
通过对流量的速率限制来确保系统的稳定性,由此可以看出限流就相当重要。
1. 在系统中,使用 Mixer 实现,进行限流的工作,限流分为两部分,第一部分是在客户端配合的名称与大小,第二部分是可以把它与哪些服务关联起来,进行操作。
2. 需要定义 QuotaSpec 和 QuotaSpecBinding,确保配合的适配器在何时启动进行限流的操作。
3.以及本身的Instance,Handler和Rule
Instance
apiversion:config.istio.io/vlalpha2
kind:instance
metadata:
name:requestcount quota//
计数器,它是有条件的
namespace:istio-system
spec:
compiledTemplate:quota
params:
dimensions:
source:request.headers["x-forwarded-for"] |"unknown"//
保留原始的ip
destination:destination,labels["app"] | destination.service.nameI "unknown" destinationVersion:destination.labelsl"version"] l"unknown"//
服务的同一个 pod,算一个账号。
Handler
apiversion:config.istio.io/v1alpha2
kind:handler
metadata:
name:quota handler
namespace:istio-system
spec:
compiledAdapter:menqdota//
没有同步功能,每一个版本就一个 pod
params:
quotas:
name:requestcountquota.instance.istio-system
maxAmount:500
validDuration:1s
# The first matching override is apptied.
# A requestcount instance is checked against override dimensions. overrides:
# The following override applies to‘reviews'regardless# of the source.
dimensions:
destination: reviews
maxAmount:1
validDuration:5s
# The following override applies to ‘productpage' when
the source is a specific ip address.
dimensions:
destination: productpage
source:n 10.28.11.28
maxAmount;500
Rule
kind:QuotaSpec//
我这里有定义的,可以使它生效
metadata:
name: request-count
namespace:istio-system
spec:
rules:
quotas:
charge:1
guota:requestcountquota
apiversion:config.istio.io/vlalpha2
kind
:QuotaSpecBinding//
哪个产生作用
metadata:
name: request-count
namespace:istio-system
spec:
quotaspecs:
name:request-count
namecnace:istio-system