Khám phá bí mật của kiến trúc service mesh và thấy cách nó tăng cường hệ thống phân tán của bạn.
Đắm mình vào Istio, ngôi sao sáng của service mesh, và học cách nó điều phối cụm Kubernetes của bạn đến sự hoàn hảo.
Các ứng dụng nguyên khối đã tiến hóa thành các dịch vụ nhỏ hơn, độc lập. Xu hướng này ngày càng phổ biến với điện toán đám mây và kiến trúc microservices. Các công cụ như Docker và Kubernetes đã thúc đẩy xu hướng này.
Microservices trên nền tảng như Kubernetes mang lại nhiều lợi ích, nhưng chúng cũng tạo ra những phức tạp. Quản lý giao tiếp giữa các dịch vụ phân tán này đòi hỏi phải xem xét kỹ lưỡng về khám phá, định tuyến, thử lại, và thay thế.
Các thách thức khác bao gồm bảo mật và khả năng quan sát.
Xây dựng khả năng giao tiếp cho từng dịch vụ mất thời gian, đặc biệt khi hệ sinh thái dịch vụ mở rộng. Đây là lúc service mesh tỏa sáng. Nó xử lý toàn bộ giao tiếp giữa các dịch vụ trong một hệ thống phân tán.
Service mesh đạt được điều này bằng cách sử dụng các proxy mạng. Các yêu cầu giữa các dịch vụ được định tuyến qua các proxy này, nằm ngoài các dịch vụ trong tầng hạ tầng:
Các proxy này tạo thành một mạng lưới cho các dịch vụ, do đó có tên là service mesh. Service mesh kiểm soát mọi khía cạnh của giao tiếp giữa các dịch vụ, cho phép nó giải quyết các sai lầm trong tính toán phân tán.
Giải phóng toàn bộ tiềm năng của các dịch vụ của bạn với service mesh! Khám phá cách công cụ tuyệt vời này có thể biến đổi cảnh quan ứng dụng của bạn.
Hãy chia sẻ phép thuật này thành ba khả năng cốt lõi: điều khiển lưu lượng, bảo mật vững chắc, và khả năng quan sát rõ ràng.
Service mesh là cảnh sát lưu lượng tối ưu của bạn, chỉ đạo tương tác giữa các dịch vụ với độ chính xác cao. Thưởng thức định tuyến động, khám phá thông minh, và những tính năng tuyệt vời như thử bóng và chia tách lưu lượng cho các bản phát hành canary và thử nghiệm A/B.
Tạm biệt các kết nối không đáng tin cậy! Service mesh bảo vệ dịch vụ của bạn với tính năng thử lại, thời gian chờ, giới hạn tốc độ và ngắt mạch, giữ ứng dụng của bạn tránh xa sự hỗn loạn.
Bảo vệ dịch vụ của bạn với một pháo đài không thể xâm nhập! Service mesh mã hóa tất cả các giao tiếp bằng MTLS mạnh mẽ, xác minh danh tính với xác thực nghiêm ngặt, và thực thi các quy tắc truy cập để đảm bảo an toàn tuyệt đối.
Khám phá những siêu năng lực bảo mật tiềm ẩn! Cách ly dịch vụ, theo dõi mọi hoạt động để kiểm tra, và tạo ra một vành đai bảo mật xung quanh ứng dụng của bạn với service mesh.
Điều hướng sự phức tạp của hệ thống phân tán của bạn một cách dễ dàng! Service mesh cung cấp khả năng quan sát chưa từng có vào hoạt động nội bộ của ứng dụng thông qua việc truy tìm phân tán.
Khám phá những thông tin quý giá với một kho dữ liệu về số liệu, nhật ký và hiệu suất. Tối ưu hóa dịch vụ và khắc phục sự cố như một chuyên gia với service mesh.
Istio, một service mesh mã nguồn mở được tạo ra bởi IBM, Google và Lyft, nâng cao ứng dụng phân tán một cách vô hình với quản lý lưu lượng, bảo mật và thông tin chi tiết về hiệu suất.
Được triển khai linh hoạt tại chỗ, trên đám mây, trong Kubernetes, hoặc trên các máy ảo, Istio tỏa sáng với các microservices trên Kubernetes. Mặc dù không bị ràng buộc vào nền tảng cụ thể, nó là sự lựa chọn tự nhiên cho các môi trường container hóa.
Ở trung tâm của nó, Istio triển khai các proxy Envoy làm sidecar cùng với mỗi microservice:
Mạng lưới proxy này tạo thành mặt phẳng dữ liệu của Istio, được điều phối bởi mặt phẳng điều khiển:
Mặt phẳng điều khiển, bộ não của Istio, cung cấp cho các proxy Envoy khả năng khám phá, cấu hình và quản lý chứng chỉ.
Giải phóng tiềm năng của Istio với nhiều microservices kết nối, nơi các proxy sidecar xây dựng một hạ tầng service mesh mạnh mẽ:
Khả năng thích ứng của Istio nổi bật qua tích hợp liền mạch với các hệ thống nhật ký, đo lường và chính sách bên ngoài.
Kiến trúc của Istio là một cặp đôi năng động: mặt phẳng dữ liệu và mặt phẳng điều khiển. Cùng nhau, chúng điều phối phép thuật đằng sau các khả năng của Istio. Hãy khám phá các thành phần cốt lõi điều khiển nền tảng này.
Sẵn sàng khám phá chi tiết các thành phần cốt lõi của Istio.
Mặt phẳng dữ liệu của Istio thực chất là một phiên bản mở rộng của proxy Envoy. Công cụ mã nguồn mở tuyệt vời này xử lý các phức tạp mạng, giải phóng các ứng dụng tập trung vào công việc kinh doanh chính của chúng. Các ứng dụng tương tác một cách liền mạch, không quan tâm đến hạ tầng mạng phức tạp.
Ở trung tâm của nó, Envoy là một phù thủy mạng hoạt động ở các lớp 3 và 4 của mô hình OSI. Nó quản lý các kết nối một cách khéo léo qua một chuỗi các bộ lọc mạng thích ứng. Ngoài ra, bộ lọc lớp L7 của Envoy còn giúp nó xử lý lưu lượng HTTP một cách tinh tế. Và chưa hết - nó còn thành thạo với các giao thức HTTP/2 và gRPC.
Nhiều tính năng nổi bật của Istio thực sự là siêu năng lực thừa hưởng từ khả năng tích hợp sẵn của Envoy:
Tiềm năng thực sự của Envoy tỏa sáng khi kết hợp với Istio. Tính mở rộng của nó, được tăng cường bởi WebAssembly, là một sự thay đổi trò chơi cho việc thực thi chính sách tùy chỉnh và đo lường. Thêm vào đó, API Proxy-Wasm của Istio mở ra cánh cửa cho các tùy chỉnh Envoy thêm nữa.
Hãy gặp gỡ istiod, nhạc trưởng của dàn nhạc mặt phẳng điều khiển của Istio. Nhạc trưởng này biến các quy tắc định tuyến cấp cao và chỉ thị quản lý lưu lượng thành các cấu hình thân thiện với Envoy, phân phối chúng một cách liền mạch tới các sidecar.
Nhớ kiến trúc trước đây của Istio với các thành phần riêng lẻ chứ? Để đơn giản hóa mọi thứ, các thành phần này đã được hợp nhất vào istiod thống nhất. Nhưng đừng lo, các chức năng cốt lõi vẫn còn nguyên vẹn.
Ở trung tâm của istiod, mã nguồn và các API tương tự như tiền thân của nó. Ví dụ, Pilot vẫn là nhạc trưởng của việc khám phá dịch vụ, dịch các chi tiết nền tảng cụ thể thành ngôn ngữ chung được các sidecar hiểu. Sự linh hoạt này cho phép Istio hòa hợp với nhiều môi trường khác nhau như Kubernetes và Máy ảo.
Istiod cũng nắm quyền quản lý bảo mật, thiết lập xác thực dịch vụ-với-dịch vụ mạnh mẽ và xác thực người dùng cuối với hệ thống quản lý nhận dạng và thông tin xác thực tích hợp sẵn của nó. Thực thi các chính sách bảo mật chi tiết dựa trên nhận dạng dịch vụ một cách dễ dàng. Hơn nữa, istiod hoạt động như một cơ quan cấp chứng chỉ đáng tin cậy (CA), cấp chứng chỉ để bảo mật giao tiếp giữa các dịch vụ bằng cách sử dụng TLS tương hỗ (MTLS).
Chúng ta đã khám phá các tính năng điển hình của một service mesh và mổ xẻ kiến trúc và các thành phần cốt lõi của Istio. Bây giờ, hãy khám phá cách Istio cung cấp những tính năng này bằng cách sử dụng các thành phần cốt lõi của nó.
Chúng ta sẽ xem xét lại các danh mục tính năng tương tự mà chúng ta đã khám phá trước đó.
API quản lý lưu lượng của Istio cung cấp khả năng kiểm soát chi tiết lưu lượng trong service mesh. Điều chỉnh cấu hình lưu lượng bằng các API này và xác định các tài nguyên API với định nghĩa tài nguyên tùy chỉnh của Kubernetes (CRD). Các tài nguyên API chính cho định tuyến lưu lượng là dịch vụ ảo và quy tắc đích:
Một dịch vụ ảo quy định cách các yêu cầu được định tuyến đến một dịch vụ trong mesh Istio. Nó bao gồm một hoặc nhiều quy tắc định tuyến được đánh giá tuần tự. Sau khi định tuyến dịch vụ ảo, các quy tắc đích được áp dụng để kiểm soát lưu lượng đến một đích, chẳng hạn như nhóm các phiên bản dịch vụ theo phiên bản.
Nền tảng bảo mật của Istio là nhận dạng mạnh mẽ cho mọi dịch vụ. Các agent Istio bên cạnh mỗi proxy Envoy hợp tác với istiod để tự động quay vòng khóa và chứng chỉ:
Istio hỗ trợ hai loại xác thực: xác thực đồng cấp và xác thực yêu cầu. Xác thực đồng cấp bảo mật giao tiếp dịch vụ-với-dịch vụ với giải pháp TLS tương hỗ của Istio. Xác thực yêu cầu xử lý xác thực người dùng cuối thông qua xác thực JSON Web Token (JWT) sử dụng nhà cung cấp xác thực tùy chỉnh hoặc nhà cung cấp OpenID Connect (OIDC).
Istio thực thi kiểm soát truy cập dịch vụ bằng cách áp dụng các chính sách ủy quyền. Các chính sách này điều chỉnh lưu lượng đầu vào trong proxy Envoy, cho phép kiểm soát truy cập ở cấp độ mesh, namespace và dịch vụ.
Istio tạo ra bộ đo lường toàn diện, bao gồm số liệu, dấu vết phân tán và nhật ký truy cập, cho tất cả các giao tiếp dịch vụ trong mesh. Bộ đo lường này bao gồm số liệu cấp proxy, dịch vụ và cấp điều khiển.
Trước đây, Mixer là thành phần trung tâm trong kiến trúc đo lường của Istio. Tuy nhiên, Telemetry v2 thay thế các tính năng của Mixer bằng các plugin proxy Envoy:
Istio tạo ra các dấu vết phân tán thông qua các proxy Envoy và hỗ trợ các nền tảng dấu vết khác nhau như Zipkin, Jaeger, Lightstep và Datadog. Tỷ lệ lấy mẫu dấu vết có thể được cấu hình. Ngoài ra, Istio tạo ra các nhật ký truy cập cho lưu lượng dịch vụ ở các định dạng tùy chỉnh.
Đủ lý thuyết, hãy xem Istio hoạt động! Chúng ta sẽ cài đặt Istio trên cụm Kubernetes và sử dụng một ứng dụng microservices đơn giản để trình diễn sức mạnh của nó.
Istio có thể được cài đặt theo nhiều cách khác nhau, nhưng tải xuống và giải nén phiên bản mới nhất cho hệ điều hành của bạn (như Windows) là cách dễ nhất. Gói đã giải nén bao gồm khách hàng istioctl trong thư mục bin. Sử dụng istioctl để cài đặt Istio trên cụm Kubernetes của bạn:
istioctl install --set profile=demo -y
Lệnh này cài đặt các thành phần Istio trên cụm Kubernetes mặc định bằng hồ sơ demo. Thay 'demo' bằng hồ sơ từ nhà cung cấp khác nếu cần.
Tiếp theo, yêu cầu Istio tự động tiêm proxy sidecar Envoy khi triển khai ứng dụng trên cụm Kubernetes này:
kubectl label namespace default istio-injection=enabled
Chúng ta đang sử dụng kubectl ở đây, giả định rằng bạn đã có cụm Kubernetes (như Minikube) và thiết lập CLI Kubernetes kubectl.
Hãy tưởng tượng một ứng dụng đặt hàng trực tuyến đơn giản cho bài demo này. Nó bao gồm ba dịch vụ microservices phối hợp với nhau để hoàn thành đơn đặt hàng:
Chúng ta sẽ không đi sâu vào chi tiết microservices, nhưng chúng dễ dàng tạo bằng Spring Boot và REST APIs. Điều quan trọng là tạo ra các hình ảnh Docker cho các dịch vụ này để triển khai trên Kubernetes.
Triển khai khối công việc container hóa trên cụm Kubernetes như Minikube thật đơn giản. Sử dụng các tài nguyên Deployment và Service để khai báo và truy cập khối công việc. Thường thì, chúng ta định nghĩa chúng trong một tệp YAML:
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: order-service
namespace: default
spec:
replicas: 1
template:
metadata:
labels:
app: order-service
version: v1
spec:
containers:
- name: order-service
image: kchandrakant/order-service:v1
resources:
requests:
cpu: 0.1
memory: 200
---
apiVersion: v1
kind: Service
metadata:
name: order-service
spec:
ports:
- port: 80
targetPort: 80
protocol: TCP
name: http
selector:
app: order-service
Đây là định nghĩa cơ bản của Deployment và Service cho order-service. Tạo các tệp YAML tương tự cho inventory-service và shipping-service.
Triển khai các tài nguyên này dễ dàng bằng cách sử dụng kubectl:
kubectl apply -f booking-service.yaml -f inventory-service.yaml -f shipping-service.yaml
Vì chúng ta đã bật tự động tiêm các proxy sidecar Envoy cho namespace mặc định, mọi thứ đã được xử lý. Hoặc, tiêm proxy sidecar Envoy theo cách thủ công bằng lệnh kube-inject của istioctl.
Istio chủ yếu xử lý lưu lượng mesh. Theo mặc định, lưu lượng vào hoặc ra khỏi mesh bị chặn. Istio sử dụng gateway để quản lý lưu lượng vào và ra, cho phép bạn kiểm soát chính xác những gì đi vào hoặc ra khỏi mesh. Istio cung cấp các triển khai proxy gateway được cấu hình trước: istio-ingressgateway và istio-egressgateway.
Tạo một Gateway và Dịch vụ ảo cho ứng dụng của bạn:
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: booking-gateway
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: booking
spec:
hosts:
- "*"
gateways:
- booking-gateway
http:
- match:
- uri:
prefix: /api/v1/booking
route:
- destination:
host: booking-service
port:
number: 8080
Chúng ta đang sử dụng bộ điều khiển ingress Istio mặc định ở đây. Thêm vào đó, chúng ta đã định nghĩa một dịch vụ ảo để định tuyến các yêu cầu đến booking-service.
Bạn cũng có thể định nghĩa một egress gateway để quản lý lưu lượng ra khỏi mesh.
Chúng ta đã triển khai một ứng dụng đơn giản trên Kubernetes với Istio. Hãy khám phá các tính năng mạnh mẽ của Istio và xem chúng có thể nâng cao ứng dụng của chúng ta như thế nào.
Hãy tưởng tượng bạn triển khai nhiều phiên bản của microservice như shipping-service. Bạn muốn giới thiệu dần các tính năng mới mà không ảnh hưởng đến tất cả người dùng. Định tuyến yêu cầu cho phép bạn làm điều này bằng cách điều hướng một phần lưu lượng đến phiên bản mới nhất.
Sử dụng các quy tắc định tuyến dịch vụ ảo để đạt được điều này.
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: shipping-service
spec:
hosts:
- shipping-service
http:
- route:
- destination:
host: shipping-service
subset: v1
weight: 90
- destination:
host: shipping-service
subset: v2
weight: 10
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: shipping-service
spec:
host: shipping-service
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
Các quy tắc định tuyến cũng có thể lọc lưu lượng dựa trên tiêu đề hoặc các thuộc tính khác. Trường đích chỉ định dịch vụ mục tiêu cho các yêu cầu phù hợp.
Ngăn chặn các lỗi lan rộng với ngắt mạch. Mẫu này phát hiện lỗi và tạm thời ngừng lưu lượng đến các dịch vụ gặp lỗi, bảo vệ sức khỏe tổng thể của ứng dụng của bạn.
Istio's DestinationRule cho phép bạn cấu hình hành vi ngắt mạch cho các dịch vụ như inventory-service.
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: inventory-service
spec:
host: inventory-service
trafficPolicy:
connectionPool:
tcp:
maxConnections: 1
http:
http1MaxPendingRequests: 1
maxRequestsPerConnection: 1
outlierDetection:
consecutive5xxErrors: 1
interval: 1s
baseEjectionTime: 3m
maxEjectionPercent: 100
Bằng cách giới hạn các kết nối tối đa, các yêu cầu đang chờ và các yêu cầu trên mỗi kết nối, bạn có thể quản lý lưu lượng một cách hiệu quả và ngăn chặn quá tải.
TLS tương hỗ đảm bảo giao tiếp an toàn giữa các dịch vụ bằng cách yêu cầu cả hai bên xác thực. Istio tự động bật TLS tương hỗ cho các dịch vụ sử dụng proxy của nó.
Mặc dù Istio thực thi TLS tương hỗ giữa các dịch vụ qua proxy, lưu lượng văn bản rõ ràng vẫn có thể đến được các dịch vụ không có proxy. Sử dụng chính sách PeerAuthentication để thực thi TLS tương hỗ trên toàn bộ mesh.
apiVersion: "security.istio.io/v1beta1"
kind: "PeerAuthentication"
metadata:
name: "default"
namespace: "istio-system"
spec:
mtls:
mode: STRICT
Bạn có thể áp dụng TLS tương hỗ ở cấp độ mesh, namespace hoặc dịch vụ. Các chính sách dịch vụ cụ thể sẽ ghi đè các thiết lập cấp namespace.
JSON Web Tokens (JWT) là tiêu chuẩn để truyền tải thông tin người dùng một cách an toàn. Chúng được sử dụng rộng rãi cho việc xác thực và ủy quyền.
Chính sách Ủy quyền của Istio cho phép bạn kiểm soát truy cập vào các dịch vụ như booking-service dựa trên các yêu cầu JWT.
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: require-jwt
namespace: default
spec:
selector:
matchLabels:
app: booking-service
action: ALLOW
rules:
- from:
- source:
requestPrincipals: ["[email protected]/[email protected]"]
Yêu cầu JWT hợp lệ với các yêu cầu cụ thể để truy cập được ủy quyền. Istio tạo thuộc tính requestPrincipal từ các yêu cầu nhà phát hành và chủ đề của JWT.
Istio đơn giản hóa việc quản lý các thách thức phổ biến trong kiến trúc microservice phân tán. Tuy nhiên, sự phức tạp của nó có thể tạo thêm chi phí cho triển khai. Như bất kỳ công cụ nào, Istio không phải là giải pháp kỳ diệu và cần được xem xét cẩn thận.
Mặc dù service mesh mang lại nhiều lợi ích, hãy xem xét các nhược điểm sau:
Service mesh mang lại nhiều lợi ích, nhưng đánh giá cẩn thận độ phức tạp của ứng dụng của bạn là điều cần thiết. Cân nhắc giữa lợi ích và sự phức tạp thêm vào.
Istio là một service mesh phổ biến được các công ty hàng đầu hỗ trợ, nhưng không phải là lựa chọn duy nhất. Dưới đây là tổng quan ngắn gọn về Linkerd và Consul.
Linkerd là một service mesh mã nguồn mở, Kubernetes-native, ngày càng được ưa chuộng. Đây là một dự án trong giai đoạn incubating của CNCF và hoạt động tương tự như Istio, sử dụng proxy TCP. Proxy micro Rust-based của Linkerd được gọi là Linkerd-proxy.
Linkerd thường đơn giản hơn Istio nhờ tập trung vào Kubernetes. Tuy nhiên, tập hợp tính năng của nó gần giống với Istio và kiến trúc lõi của nó tương tự. Linkerd bao gồm giao diện người dùng, mặt phẳng dữ liệu và mặt phẳng điều khiển.
Consul là một service mesh mã nguồn mở từ HashiCorp tích hợp với các công cụ hạ tầng khác của HashiCorp. Mặt phẳng dữ liệu của Consul hỗ trợ cả mô hình proxy và tích hợp gốc. Nó cung cấp một proxy tích hợp sẵn nhưng cũng có thể hoạt động với Envoy.
Consul hoạt động vượt ra ngoài Kubernetes, hỗ trợ các nền tảng như Nomad. Nó sử dụng các agent trên mỗi node để kiểm tra sức khỏe và giao tiếp với các máy chủ Consul để lưu trữ và sao chép dữ liệu. Mặc dù cung cấp các tính năng service mesh tiêu chuẩn, Consul phức tạp hơn trong việc triển khai và quản lý.
Hướng dẫn này đã khám phá những nguyên tắc cơ bản của kiến trúc service mesh và các khả năng mạnh mẽ của Istio. Chúng ta đã đi sâu vào cấu trúc lõi của Istio, các thành phần và các ứng dụng thực tiễn của nó. Cuối cùng, bạn nên có cái nhìn vững chắc về cách cài đặt và sử dụng Istio cho các tình huống phổ biến.
Phản Hồi Khách Hàng
Các đánh giá sau đây được thu thập trên trang web của chúng tôi.
Có Câu Hỏi? Tìm Câu Trả Lời Dưới Đây!
Các Câu Hỏi Thường Gặp Nhất Của Chúng Tôi