Ngày 23 tháng 12 năm 2020 - Máy tính
Trong kiến trúc microservice, nếu một dịch vụ không khả dụng, liệu điều đó có dẫn đến việc các dịch vụ thượng nguồn gọi API của nó cũng trở nên không khả dụng hay không? Và các dịch vụ thượng nguồn có thực hiện xử lý dự phòng cho trường hợp này không? Điều này rất quan trọng đối với độ sẵn sàng tổng thể của ứng dụng. Istio có khả năng mô phỏng sự cố xảy ra trên microservice mà không xâm nhập vào chúng, giúp chúng ta kiểm tra khả năng chịu lỗi tổng thể của ứng dụng.
Istio chủ yếu sử dụng Virtual Service để cung cấp hai loại tiêm lỗi: trễ phản hồi và ngừng hoạt động dịch vụ.
- Trễ phản hồi
Dùng để mô phỏng tình trạng dịch vụ bị gọi mất nhiều thời gian phản hồi khi hệ thống đang chịu tải cao.
- Ngừng hoạt động dịch vụ
Dùng để j8bet com mô phỏng tình huống dịch vụ bị gọi không khả dụng hoặc tắt máy, trả về lỗi HTTP dưới dạng mã lỗi.
Sau đây, chúng ta sẽ sử dụng ví dụ Bookinfo để thử nghiệm hai khả năng tiêm lỗi này của Istio.
1 Tiêm trễ phản hồi
Trong bài viết trước “Quản lý lưu lượng Istio với định tuyến yêu cầu”, chúng ta đã biết cách chuyển luồng truy cập của người dùng cụ thể sang một phiên bản dịch vụ nhất định, trong khi chuyển luồng truy cập của phần còn lại sang phiên bản khác. Cách cấu hình “loại dò tìm” này rất hữu ích trong các trường hợp thực tế vì nó cho phép chúng ta gỡ lỗi mà không ảnh hưởng đến trải nghiệm bình thường của những người dùng khác.
Đầu tiên, hãy cấu hình lại Destination Rule mặc định.
$ cd [m88vin - cổng game quốc tế](/post/7711/) /usr/local/istio-1.8.1
$ kubectl apply -n istio-demo -f samples/bookinfo/networking/destination-rule-all.yaml
Tiếp theo, cấu hình Virtual Service cho reviews, chuyển luồng truy cập của người dùng đăng nhập là jason sang phiên bản v2 của reviews, và chuyển luồng truy cập của những người dùng khác hoặc chưa đăng nhập sang phiên bản v1.
$ cd /usr/local/istio-1.8.1
$ kubectl apply -n istio-demo -f samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml
Kiểm tra Virtual Service để đảm bảo cấu hình đã được áp dụng.
$ kubectl get virtualservice/reviews -n istio-demo -o yaml
apiVersion:networking.istio.io/v1beta1kind:VirtualServicemetadata:name:reviews---spec:hosts:- reviewshttp:- match:- headers:end-user:exact:jasonroute:- destination:host:reviewssubset:v2- route:- destination:host:reviewssubset:v1
Lúc này, khi bạn đăng nhập bằng tài khoản jason và làm mới trang productpage, bạn sẽ thấy phần Review luôn hiển thị đánh giá sao đen (tức là phiên bản v2 của reviews), trong khi không đăng nhập hoặc đăng nhập bằng tài khoản khác thì phần Review không hiển thị đánh giá sao (tức là phiên bản v1 của reviews).
Như vậy, luồng truy cập vào productpage đang di chuyển theo kịch bản mà chúng ta mong muốn:
Người dùng | Chuỗi gọi |
---|---|
jason | productpage -> reviews:v2 -> ratings:v1 |
khác | productpage -> reviews:v1 -> ratings:v1 |
Khi xem xét mã nguồn của reviews, chúng ta phát hiện rằng khi reviews gọi ratings, nếu gọi đánh giá sao đen (tức là reviews ở phiên bản v2), thời gian chờ tối đa là 10 giây, ngược lại là 2.5 giây. LibertyRestEndpoint.java#L132
privateJsonObjectgetRatings(StringproductId,HttpHeadersrequestHeaders){...Integertimeout=star_color.equals("black")?10000:2500;...}
Tài khoản jason đang sử dụng phiên bản v2 của reviews, vì vậy chúng ta thử thay đổi thời gian phản hồi của ratings thành 7 giây, nhỏ hơn thời gian chờ 10 giây của reviews, và kỳ vọng rằng thay đổi này sẽ không ảnh hưởng đến truy cập của jason.
Sau đó, cấu hình Virtual Service cho ratings theo như kịch bản trên, nếu người dùng truy cập là jason, hãy trì hoãn phản hồi của ratings thành 7 giây, trong khi các người dùng khác không bị ảnh hưởng.
$ cd /usr/local/istio-1.8.1
$ kubectl apply -n istio-demo -f samples/bookinfo/networking/virtual-service-ratings-test-delay.yaml
Kiểm tra Virtual Service để đảm bảo cấu hình đã được áp dụng.
$ kubectl get virtualservice/ratings -n istio-demo -o yaml
apiVersion:networking.istio.io/v1beta1kind:VirtualServicemetadata:name:ratings---spec:hosts:- ratingshttp:- fault:# Chậm phản hồi 7 giây cho tất cả truy cập của người dùng jasondelay:fixedDelay:7spercentage:value:100match:- headers:end-user:exact:jasonroute:- destination:host:ratingssubset:v1- route:# Các người dùng khác không bị ảnh hưởng- destination:host:ratingssubset:v1
Bây giờ, khi đăng nhập bằng tài khoản jason và truy cập vào productpage, bạn sẽ nhận thấy phần Review xuất hiện lỗi (Sorry, product reviews are currently unavailable for this book.).
Vấn đề nằm ở đâu? Khi xem xét mã nguồn của productpage, chúng ta phát hiện rằng thời gian chờ khi gọi reviews đã được thiết lập ngắn hơn (thời gian chờ là 3 giây, nếu thất bại sẽ thử lại một lần nữa, do đó tổng thời gian chờ là 6 giây). productpage.py#L382
def getProductReviews(product_id, headers):
# Do not remove. Bug introduced explicitly for illustration in fault injection task
for _ in range(2):
try:
...
res = requests.get(url, headers=headers, timeout=3.0)
...
return status, {'error': 'Sorry, product reviews [99win club](/post/leetcode-construct-binary-tree-from-preorder-and-postorder-traversa/) are currently unavailable for this book.'}
Như vậy, quá trình sử dụng Istio để tiêm trễ phản hồi và xác định lỗi đã hoàn tất.
2 Tiêm ngừng hoạt động dịch vụ
Tiếp theo, chúng ta sẽ xem xét khả năng tiêm ngừng hoạt động dịch vụ của Istio. Tiếp tục sử dụng cấu hình từ phần trước, chỉ cần thay đổi một chút cấu hình Virtual Service của ratings, tức là nếu người dùng truy cập là jason, hãy cho ratings trả về lỗi 500, và xem điều đó ảnh hưởng thế nào đến giao diện phía trước.
$ cd /usr/local/istio-1.8.1
$ kubectl apply -n istio-demo -f samples/bookinfo/networking/virtual-service-ratings-test-abort.yaml
Xem thông tin cấu hình:
$ kubectl get virtualservice/ratings -n istio-demo -o yaml
apiVersion:networking.istio.io/v1beta1kind:VirtualServicemetadata:name:ratings---spec:hosts:- ratingshttp:- fault:# Trả về lỗi 500 nếu người dùng truy cập là jasonabort:httpStatus:500percentage:value:100match:- headers:end-user:exact:jasonroute:- destination:host:ratingssubset:v1- route:# Các người dùng khác không bị ảnh hưởng- destination:host:ratingssubset:v1
Đăng nhập bằng tài khoản jason vào trang productpage, bạn sẽ thấy phần Review hiển thị lỗi không thể truy cập ratings (Ratings service is currently unavailable).
Cuối cùng, sau khi thử nghiệm xong, hãy sử dụng lệnh sau để xóa các đường dẫn tạm thời.
$ kubectl delete -n istio-demo -f samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml
$ kubectl delete -n istio-demo -f samples/bookinfo/networking/virtual-service-ratings-test-abort.yaml
Tóm tắt bài viết, đầu tiên chúng ta đã giới thiệu hai chế độ tiêm lỗi mà Istio hỗ trợ (tiêm trễ phản hồi và tiêm ngừng hoạt động dịch vụ), giúp chúng ta kiểm tra khả năng chịu lỗi tổng thể của ứng dụng mà không cần xâm nhập vào dịch vụ. Sau đó, chúng ta đã sử dụng ví dụ Bookinfo để kiểm tra từng loại tiêm lỗi này.
[1] Tiêm lỗi Istio [2] Quản lý lưu lượng Istio ![]( #Mạng dịch vụ #Istio