Ngày 21 tháng 12 năm 2020 Công nghệ máy tính
Trong bài viết trước “Cài đặt và sử dụng Istio”, chúng ta đã tiến hành cài đặt Istio và triển khai thử nghiệm mẫu Bookinfo. Bài viết này sẽ tiếp nối phần trước, tìm hiểu về khái niệm định tuyến yêu cầu trong quản lý lưu lượng của Istio cũng như thực hiện các bài kiểm tra mẫu.
Chúng ta đều biết rằng Istio thông qua mặt dữ liệu Envoy đã chặn tất cả lưu lượng ra vào của các instance dịch vụ. Nhờ vậy, dựa trên lưới dịch vụ Istio có thể áp dụng nhiều chiến lược quản lý lưu lượng mà cách thức thông thường khó lòng đạt được, chẳng hạn như phát hành bản dựng dần dần (canary release), kiểm tra A/B hay phân luồng theo tỷ lệ.
Istio chủ yếu cung cấp hai tài nguyên tùy chỉnh cấu hình bằng YAML để quản lý lưu lượng: Virtual Service và Destination Rule. Điều này giúp tách biệt việc quản lý lưu lượng khỏi các dịch vụ yêu cầu phía trên và các dịch vụ bị yêu cầu phía dưới. Virtual Service chủ yếu dùng để cấu hình cách lưu lượng di chuyển (tức là định nghĩa luồng nào phù hợp với quy tắc nào sẽ được gửi đến các tập con dịch vụ nào), trong khi Destination Rule lại tập trung vào việc định nghĩa cụ thể các tập con dịch vụ.
Sau đây chúng ta sẽ lần lượt xem xét các khái niệm về Virtual Service và Destination Rule, sau đó sử dụng mẫu Bookinfo để thực hiện cấu hình định tuyến đơn giản và kiểm tra.
1. Virtual Service
Virtual Service chủ yếu được sử dụng để cấu hình cách lưu lượng di chuyển. Trường hợp sử dụng điển hình là định tuyến lưu lượng đến các phiên bản khác nhau của một dịch vụ (thông qua việc chỉ định các tập con dịch vụ), ví dụ như phân phối lưu lượng theo tỷ lệ hoặc phát hành dần dần. So với cách tiếp cận của Kubernetes, lợi thế chính là không cần điều chỉnh số lượng instance để phân bổ lưu lượng; việc định tuyến lưu lượng đã được tách biệt hoàn toàn với các instance được triển khai. Một trường hợp sử dụng khác là sử dụng Virtual Service để cung cấp cấu hình định tuyến thống nhất cho tất cả các dịch vụ khác nhau trong một namespace.
Dưới đây là các ví dụ cụ thể để học cách cấu hình Virtual Service.
a) Cấu hình định tuyến cho các phiên bản khác nhau của một dịch vụ Dưới đây chúng ta sử dụng VirtualService để cấu hình các quy tắc định tuyến cho các tập con khác nhau của dịch vụ reviews trong Bookinfo, nhằm 7win đưa lưu lượng từ người dùng cụ thể đến phiên bản cụ thể.
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http:
- match:
- headers:
end-user:
exact: jason
route:
- destination:
host: reviews
subset: v2
- route:
- destination:
host: reviews
subset: v3
b) Cung cấp cấu hình định tuyến thống nhất cho các dịch vụ khác nhau Dưới đây chúng ta sử dụng VirtualService để cung cấp cấu hình định tuyến cho hai dịch vụ khác nhau của Bookinfo là reviews và ratings. Lưu lượng sẽ được dẫn hướng dựa trên URI của yêu cầu, hỗ trợ việc khớp tiền tố URI hoặc biểu thức chính quy.
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: bookinfo
spec:
hosts:
- bookinfo.com
http:
- match:
- uri:
prefix: /reviews
route:
- destination:
host: reviews
- match:
- uri:
prefix: /ratings
route:
- destination:
host: ratings
Ngoài việc sử dụng match
để viết điều kiện, chúng ta còn có thể sử dụng weight
để chỉ định trọng số. Ví dụ dưới đây sử dụng VirtualService để chỉ định 75% lưu lượng đến v1 của reviews và 25% đến v2.
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v1
weight: 75
- destination:
host: reviews
subset: v2
weight: 25
2. Destination Rule
Destination Rule chủ yếu được sử dụng để định nghĩa các tập con khác nhau của một dịch vụ. Khi đó, Virtual Service có thể định nghĩa các quy tắc định tuyến, đưa lưu lượng từ dịch vụ nào đến các tập con nào. Ngoài việc định nghĩa các tập con dịch vụ, Destination Rule còn có thể thiết lập các chính sách lưu lượng Envoy cho toàn bộ dịch vụ mục tiêu hoặc từng tập con cụ thể, chẳng hạn như chiến lược cân bằng tải, chế độ bảo mật TLS, hoặc cài đặt ngắt mạch.
Dưới đây là ví dụ sử dụng DestinationRule để định nghĩa ba tập con v1, v2 và v3 cho dịch vụ reviews (dựa trên nhãn Kubernetes). Tập con v1 và v3 sử dụng chiến lược cân bằng tải RANDOM, trong khi v2 sử dụng ROUND_ROBIN.
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: reviews
spec:
host: reviews
trafficPolicy:
loadBalancer:
simple: RANDOM
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
trafficPolicy:
loadBalancer:
simple: ROUND_ROBIN
- name: v3
labels:
version: v3
3. Cấu hình định tuyến yêu cầu cho mẫu Bookinfo
Trong bài viết trước “Cài đặt và sử dụng Istio”, chúng ta đã biết cách triển khai ứng dụng mẫu Bookinfo. Và chúng ta cũng biết rằng Bookinfo bao gồm một số dịch vụ sau: ngoài reviews có Loc88 Club Game Bài Tặng Code ba phiên bản, các dịch vụ khác chỉ có một phiên bản duy nhất. Phiên bản v1 của reviews không hiển thị đánh giá sao năm, v2 hiển thị đánh giá sao năm màu đen và v3 hiển thị đánh giá sao năm màu đỏ.
Chúng ta chỉ cần sử dụng lệnh sau để triển khai các dịch vụ của Bookinfo và cấu hình các quy tắc định tuyến cơ bản thông qua Gateway và Virtual Service, chỉ định productpage làm cổng vào thống nhất.
$ cd /usr/local/istio-1.8.1
$ kubectl apply -n istio-demo -f samples/bookinfo/platform/kube/bookinfo.yaml
$ kubectl apply -n istio-demo -f samples/bookinfo/networking/bookinfo-gateway.yaml
Cấu hình bookinfo-gateway.yaml
:
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: bookinfo-gateway
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: bookinfo
spec:
hosts:
- "*"
gateways:
- bookinfo-gateway
http:
- match:
- uri:
exact: /productpage
- uri:
prefix: /static
- uri:
exact: /login
- uri:
exact: /logout
- uri:
prefix: /api/v1/products
route:
- destination:
host: productpage
port:
number: 9080
Trước khi chỉ định các quy tắc định tuyến cụ thể, productpage sử dụng chiến lược luân phiên để gọi các dịch vụ, vì vậy khi chúng ta làm mới trang productpage, phần Review có lúc hiển thị đánh giá sao năm màu đen, có lúc màu đỏ, và đôi khi không có đánh giá sao năm – tức là lưu lượng đang được phân phối luân phiên giữa các phiên bản của dịch vụ reviews.
Tiếp theo, chúng ta sẽ thực hiện cấu hình các quy tắc định tuyến khác nhau cho dịch vụ reviews sử dụng Virtual Service và Destination Rule, đồng thời kiểm tra kết quả.
a) Đưa toàn bộ lưu lượng truy cập reviews đến một phiên bản duy nhất
Trước tiên, chúng ta cấu hình Destination Rule cho reviews để định nghĩa các tập con dịch vụ và chỉ định chiến lược cân bằng tải là RANDOM.
$ cd /usr/local/istio-1.8.1
$ cat destination-rule-reviews.yaml
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: reviews
spec:
host: reviews
trafficPolicy:
loadBalancer:
simple: RANDOM
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
- name: v3
labels:
version: v3
$ kubectl apply -n istio-demo -f destination-rule-reviews.yaml
Sau đó, chúng ta cấu hình Virtual Service cho reviews để đưa toàn bộ lưu lượng truy cập đến v1.
$ cd /usr/local/istio-1.8.1
$ cat virtual-service-all-v1.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v1
$ kubectl apply -n istio-demo -f virtual-service-all-v1.yaml
Lúc này, khi chúng ta làm mới trang productpage nhiều lần, chúng ta sẽ thấy phần Review luôn không hiển thị đánh giá sao năm – điều này chứng tỏ rằng toàn bộ lưu lượng truy cập đến reviews đều được đưa đến phiên bản v1.
Tiếp theo, chúng ta xem xét cách đưa lưu lượng truy cập từ người dùng cụ thể đến phiên bản cụ thể.
b) Định tuyến lưu lượng truy cập reviews theo người dùng cụ thể
Chúng ta vẫn sử dụng cấu hình Destination Rule ở phần a).
Để xóa cấu hình Virtual Service của phần a), sử dụng lệnh sau:
$ cd /usr/local/istio-1.8.1
$ kubectl delete -n istio-demo -f virtual-service-all-v1.yaml
Tiếp tục cấu hình Virtual Service cho reviews để nếu người dùng đăng nhập là jason, lưu lượng sẽ được đưa đến v2, ngược lại sẽ đưa đến v3.
$ cd /usr/local/istio-1.8.1
$ cat virtual-service-reviews-jason-v2-v3.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http:
- match:
- headers:
end-user:
exact: jason
route:
- destination:
host: reviews
subset: v2
- route:
- destination:
host: reviews
subset: v3
$ kubectl apply -n istio-demo -f virtual-service-reviews-jason-v2-v3.yaml
Khi đó, khi chúng ta đăng nhập với tài khoản jason và làm mới trang productpage, chúng ta sẽ thấy phần Review luôn hiển thị đánh giá sao năm màu đen (tức là phiên 22win casino bản v2 của reviews).
Ngược lại, khi không đăng nhập hoặc đăng nhập với tài khoản khác, phần Review luôn hiển thị đánh giá sao năm màu đỏ (tức là phiên bản v3 của reviews).
Như vậy, chúng ta đã xác minh rằng Istio hỗ trợ việc đưa lưu lượng truy cập từ người dùng cụ thể đến phiên bản cụ thể thông qua việc truyền nhận diện người dùng từ lớp frontend và Envoy định tuyến theo quy tắc cấu hình.
Cuối cùng, chúng ta xem xét cách phân chia lưu lượng theo tỷ lệ đến các phiên bản khác nhau của cùng một dịch vụ.
c) Phân chia lưu lượng truy cập reviews theo tỷ lệ đến các phiên bản khác nhau
Chúng ta vẫn sử dụng cấu hình Destination Rule ở phần a).
Để xóa cấu hình Virtual Service của phần b), sử dụng lệnh sau:
$ cd /usr/local/istio-1.8.1
$ kubectl delete -n istio-demo -f virtual-service-reviews-jason-v2-v3.yaml
Tiếp tục cấu hình Virtual Service cho reviews để đưa 90% lưu lượng đến v1 và 10% đến v2.
$ cd /usr/local/istio-1.8.1
$ cat virtual-service-reviews-90-10.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v1
weight: 90
- destination:
host: reviews
subset: v2
weight: 10
$ kubectl apply -n istio-demo -f virtual-service-reviews-90-10.yaml
Lúc này, khi làm mới trang productpage nhiều lần, chúng ta sẽ thấy phần Review hầu hết không hiển thị đánh giá sao năm, nhưng thỉnh thoảng xuất hiện đánh giá sao năm màu đen.
Sau khi kiểm tra xong, sử dụng lệnh sau để xóa các cấu hình liên quan.
$ cd /usr/local/istio-1.8.1
$ kubectl delete -n istio-demo -f virtual-service-reviews-90-10.yaml
$ kubectl delete -n istio-demo -f destination-rule-reviews.yaml
Nếu muốn gỡ cài đặt ứng dụng Bookinfo hoặc Istio, bạn có thể tham khảo bài viết trước “Cài đặt và sử dụng Istio”.
Tóm tắt bài viết, chúng ta đã giới thiệu hai tài nguyên chính hỗ trợ quản lý lưu lượng của Istio là Virtual Service và Destination Rule, sau đó sử dụng Virtual Service và Destination Rule để cấu hình và kiểm tra một số trường hợp chuyển phát lưu lượng phổ biến trong mẫu Bookinfo.
[1] Istio Request Routing [2] Istio Traffic Management
#Mạng dịch vụ #Istio