Introduction to Istio, Part 4

·

4 min read

Kiến Trúc Istio

Như đã minh họa ở phần trước, ý tưởng cốt lõi của Istio là đẩy các mối quan tâm về microservices vào hạ tầng bằng cách tận dụng Kubernetes. Điều này được thực hiện bằng cách tích hợp proxy Envoy dưới dạng một container sidecar trực tiếp bên trong mỗi Pod.

Lưu ý: Trong chương Advanced Topics sẽ chỉ ra cách mở rộng service mesh để bao gồm cả các workload chạy trên máy ảo (VM), bên ngoài Kubernetes.

Về mặt triển khai, các vấn đề chính mà Istio tập trung giải quyết bao gồm:

  1. Đảm bảo mỗi khi một workload được triển khai, một sidecar Envoy cũng được triển khai cùng với nó.

  2. Đảm bảo lưu lượng truy cập vào và ra khỏi ứng dụng được chuyển hướng một cách minh bạch thông qua proxy.

  3. Gán một định danh mật mã (cryptographic identity) cho mỗi workload để tạo nền tảng cho một môi trường tính toán an toàn hơn.

  4. Cấu hình các proxy với tất cả thông tin cần thiết để xử lý lưu lượng truy cập đến và đi.

Chúng ta sẽ đi sâu vào từng vấn đề này trong các phần tiếp theo.

Chèn Sidecar

Việc chỉnh sửa các manifest triển khai của Kubernetes để tích hợp proxy như một sidecar với mỗi Pod là một công việc vừa phức tạp, dễ xảy ra lỗi và khó duy trì.

Một phần mã nguồn của Istio được dành để cung cấp khả năng tự động sửa đổi manifest của Kubernetes nhằm thêm sidecar vào mỗi Pod.

Khả năng này được cung cấp theo hai cách:

  • Chèn sidecar thủ công (manual sidecar injection)

  • Chèn sidecar tự động (automatic sidecar injection)

Các Loại Chèn Sidecar

1. Chèn Sidecar Thủ Công
Istio cung cấp giao diện dòng lệnh (CLI) có tên là istioctl với lệnh con kube-inject. Lệnh này xử lý manifest triển khai gốc và tạo ra một manifest đã được sửa đổi, trong đó thông số cấu hình sidecar được thêm vào Pod (hoặc mẫu Pod). Manifest đã sửa đổi có thể được áp dụng vào cụm Kubernetes bằng lệnh kubectl apply -f.

2. Chèn Sidecar Tự Động
Với cơ chế chèn tự động, việc tích hợp sidecar trở nên minh bạch với người dùng.

Cơ chế này dựa trên một tính năng của Kubernetes có tên là Mutating Admission Webhooks, cho phép đăng ký một webhook có thể can thiệp vào manifest triển khai và thay đổi nó trước khi manifest cuối cùng được áp dụng vào cụm Kubernetes.

Webhook được kích hoạt dựa trên một quy ước đơn giản: nếu namespace Kubernetes được áp dụng nhãn istio-injection=enabled, webhook sẽ tự động sửa đổi bất kỳ resource deployment hoặc pod nào trong namespace đó để tích hợp sidecar.

Định Tuyến Lưu Lượng Qua Sidecar

Khi sidecar đã được triển khai, bước tiếp theo là đảm bảo proxy có thể chặn lưu lượng một cách minh bạch. Lưu lượng outbound cần được chuyển hướng đến proxy, và lưu lượng inbound phải đi qua proxy trước khi đến ứng dụng.

Điều này được thực hiện bằng cách áp dụng các quy tắc iptables. Ngoài ra, một container khởi tạo (init-container) của Kubernetes sẽ được tiêm vào Pod trong quá trình triển khai để áp dụng các quy tắc này trước khi các container chính được khởi động.

Hiện tại, Istio cung cấp hai cơ chế để cấu hình Pod cho phép Envoy chặn các yêu cầu:

  1. Phương pháp iptables truyền thống

  2. Plugin CNI của Kubernetes

Gán Định Danh Cho Workload

Cốt lõi của một service mesh an toàn là định danh mạnh mẽ. Trong Istio, mỗi workload được gán một định danh mật mã X.509 theo chuẩn SPIFFE (Secure Production Identity Framework for Everyone).

Envoy sidecar sử dụng định danh này để xác thực và mã hóa lưu lượng. Các chứng chỉ được quản lý thông qua API khám phá của Envoy, được gọi là xDS.

Cấu Hình Envoy

Envoy là proxy chịu trách nhiệm xử lý lưu lượng. Nó cần được cấu hình chính xác để định tuyến lưu lượng và thực thi các chính sách bảo mật hoặc định tuyến.

Istio đóng vai trò là control plane, tự động hóa việc đẩy các bản cập nhật cấu hình đến Envoy khi có sự thay đổi về dịch vụ hoặc chính sách trong mesh.

Envoy tại Biên (Edge)

Envoy không chỉ được sử dụng bên trong mesh mà còn được tận dụng để quản lý lưu lượng Ingress (từ bên ngoài vào mesh) và Egress (từ mesh ra ngoài).

Các thành phần như Ingress GatewayEgress Gateway của Istio cung cấp các khả năng cấu hình linh hoạt hơn so với Kubernetes Ingress thông thường, nhờ sử dụng CRD của Istio.

Chúng ta sẽ khám phá chi tiết hơn về các thành phần này trong chương quản lý lưu lượng.