Bài viết thuộc series “Service Mesh on Kubernetes”
Giới thiệu
Ở bài trước chúng ta đã triển khai ví dụ đầu tiên với Istio. Ở bài này chúng sẽ sơ lược qua những tính năng nổi bật của Istio, nó giúp ta những gì?
Istio sẽ giúp ta xây dựng Enterprise Network với các tính năng sau:
- Observability
- Resilience
- Traffic Control
Istio Gateway
Với Kubernetes ta thường sử dụng Ingress Controller để xử lý HTTP Request. Istio cung cấp cho ta một resource mạnh mẽ hơn là Istio Gateway. Gateway cho phép ta tùy chỉnh cấu hình và linh động hơn so với Ingress bằng Route Rules, bên cạnh đó nó còn cung cấp tính năng như giám sát toàn bộ Request đi vào Kubernetes Cluster.
Ví dụ ta sẽ tạo Gateway cho webapp service
ở bài trước.
Tạo tệp tin tên là gateway.yaml
.
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: outfitters-gateway
spec:
selector:
istio: ingressgateway # use istio default controller
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: webapp-virtualservice
spec:
hosts:
- "*"
gateways:
- outfitters-gateway
http:
- route:
- destination:
host: webapp
port:
number: 80
kubectl apply -f ingress-gateway.yaml
Bây giờ ta có thể truy cập được tới webapp service
.
curl http://localhost:80/api/catalog/items/1
Mình sẽ giải thích về Gateway và VirtualService ở các bài sau.
Observability
Tính năng nổi bật thứ hai của Istio là Observability bao gồm:
- Request Monitoring: khi bạn cài Istio thì các giá trị ta cần giám sát như yêu cầu trên giây (requests per second), tỉ lệ gọi thất bại (number of failures), hoặc độ trễ (latency) đều có sẵn
- Distributed Tracing: Istio có sẵn công cụ để thực hiện Tracing
Thu thập dữ liệu Request Monitoring
Để thu thập dữ liệu Request Monitoring từ Istio ta sẽ dùng Prometheus và Grafana (đây là add-ons có sẵn của Istio ta đã cài từ bài đầu tiên).
Sau đó ta chỉ cần chạy câu lệnh istioctl
là có được Grafana Dashboard để xem.
istioctl dashboard grafana
Mở trình duyệt và truy cập http://localhost:3000
.
Chạy câu lệnh sau để gửi yêu cầu tới webapp
.
while true; do curl http://localhost/api/catalog; sleep .5; done
Sau đó mở Dashboard lên ta sẽ thấy một vài thông số quan trọng.
Thu thập Distributed Tracing
Mặc định Istio sử dụng Jaeger làm Dashboard để ta xem dữ liệu Tracing.
istioctl dashboard jaeger
Mở trình duyệt và truy cập http://localhost:16686
.
Ta sẽ tìm hiểu kĩ hơn về Monitoring và Tracing ở các bài sau.
Resiliency
Đây là tính năng để giúp ta xây dựng được một Enterprise Network. Bình thường để xử lý được các vấn đề như Retries, Timeouts, Circuit Breaking ta cần phải thêm rất nhiều thư viện vào bên trong mã nguồn của ứng dụng. Với các ngôn ngữ khác nhau ta phải thêm các thư viện khác nhau, rất rắc rối và tốn thời gian. Istio có sẵn cho ta những tính năng trên.
Ví dụ ta sẽ dùng VirtualService để thực hiện Retries khi ta gọi tới một ứng dụng nào đó mà bị lỗi 500
.
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: catalog
spec:
hosts:
- catalog
http:
- route:
- destination:
host: catalog
retries:
attempts: 3
retryOn: 5xx
perTryTimeout: 2s
Ở trên ta sẽ thực hiện gọi lại 3 lần nếu ta gọi tới catalog service
mà bị lỗi 500
.
Traffic Control
Istio cho phép ta điều hướng một Request đi vào Kubernetes Cluster theo nhiều cách khác nhau.
Ví dụ mặc định Kubernetes Service không hỗ trợ Load Balancing, nhưng với Istio thì ta có thể áp dụng Load Balancing vào Kubernetes Service.
Thuật toán Load Balancing mà Istio hỗ trợ:
- Round robin (mặc định)
- Random
- Weighted least request
Ta sẽ sử dụng DestinationRule để áp dụng Load Balancing vào một Kubernetes Service, ví dụ:
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: catalog-load-balancing
spec:
host: catalog
trafficPolicy:
loadBalancer:
simple: ROUND_ROBIN
Ngoài ra Istio còn hỗ trợ ta thực hiện A/B Testing Deployment hoặc Canary Deployment một cách rất dễ dàng. Ví dụ ta đang có catalog service
v1 và ta cần triển khai catalog service
v2.
Nhưng ta không muốn gửi toàn bộ Request tới catalog service
v2 mà chỉ những Request nào có HTTP Header là x-istio-cohort: internal
thì mới được gửi tới v2.
Nếu ta tự thực hiện việc này thì sẽ mất rất nhiều thời gian, còn nếu xài Istio thì nó có hỗ trợ sẵn. Ta sẽ sử dụng hai resource là DestinationRule và VirtualService để thực hiện yêu cầu trên.
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: catalog
spec:
host: catalog
subsets:
- name: version-v1
labels:
version: v1
- name: version-v2
labels:
version: v2
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: catalog-vs-from-gw
spec:
hosts:
- "catalog.istioinaction.io"
gateways:
- catalog-gateway
http:
- match:
- headers:
x-istio-cohort:
exact: "internal"
route:
- destination:
host: catalog
subset: version-v2
- route:
- destination:
host: catalog
subset: version-v1
Mình sẽ giải thích kĩ hơn về Traffic Control ở các bài sau.
Kết luận
Vậy là ta đã xem sơ lược qua các tính năng chính của Istio. Ở các bài tiếp theo chúng ta sẽ đi vào chi tiết của từng resource ở trên.
Nếu bài viết có gì sai hoặc cần cập nhật thì liên hệ Admin.
Tham gia nhóm chat của DevOps VN tại Telegram.
Kém tiếng Anh và cần nâng cao trình độ giao tiếp: Tại sao bạn học không hiệu quả?