Istio virtual service

·

6 min read

Trong Istio, "Service" đề cập đến các dịch vụ thực sự chạy trong mạng lưới. "Virtual services" là một cách để định nghĩa các quy tắc định tuyến và điều hướng cho các dịch vụ đó mà không cần thay đổi mã nguồn của chúng.

Sự khác biệt cơ bản giữa hai khái niệm này là:

  1. Service: Là các dịch vụ thực sự mà bạn muốn tạo ra một mạng lưới cho chúng.

  2. Virtual services: Là các quy tắc định tuyến và điều hướng mà bạn áp dụng cho các dịch vụ đó. Các virtual service định nghĩa cách mà các yêu cầu từ một dịch vụ sẽ được định tuyến tới các dịch vụ khác, thường được sử dụng để thực hiện điều hướng yêu cầu theo các quy tắc cụ thể, chẳng hạn như phân phối tải, canary deployments, hoặc routing dựa trên headers.

Tại sao cần phải sử dụng Virtual Services trong Istio?

  1. Quản lý định tuyến: Virtual services cho phép bạn quản lý cách yêu cầu từ một dịch vụ được chuyển tiếp tới các dịch vụ khác trong mạng lưới của mình. Điều này làm cho việc thực hiện các chiến lược định tuyến phức tạp trở nên dễ dàng hơn.

  2. Phân phối tải: Bằng cách sử dụng virtual services, bạn có thể phân phối tải giữa các phiên bản khác nhau của một dịch vụ, hoặc giữa các phiên bản khác nhau của các dịch vụ khác nhau.

  3. Canary deployments: Virtual services cung cấp khả năng thực hiện Canary deployments, tức là triển khai một phiên bản mới của dịch vụ và chỉ chuyển một phần nhỏ của lưu lượng tới phiên bản mới để kiểm tra trước khi triển khai toàn bộ.

  4. Phân chia traffic: Bạn có thể sử dụng virtual services để phân chia lưu lượng dựa trên các yếu tố như header, URI path, hoặc các thông tin khác trong yêu cầu HTTP.

  5. Kiểm soát chi tiết hơn: Virtual Services cung cấp khả năng kiểm soát lưu lượng truy cập microservice chi tiết hơn nhiều so với Kubernetes Services.

  6. Tính năng nâng cao: Virtual Services cung cấp nhiều tính năng mà Kubernetes Services không có, giúp bạn dễ dàng triển khai các microservice phức tạp hơn.

  7. Tách biệt mối quan tâm: Virtual Services tách biệt cấu hình lưu lượng truy cập khỏi triển khai microservice, giúp bạn dễ dàng thay đổi cấu hình mà không cần thay đổi mã microservice.

  8. Khả năng quan sát: Virtual Services cung cấp khả năng quan sát chi tiết hơn về lưu lượng truy cập microservice, giúp bạn dễ dàng gỡ lỗi và khắc phục sự cố.

  9. Bảo mật: Virtual Services cung cấp các tính năng bảo mật nâng cao hơn so với Kubernetes Services, giúp bảo vệ microservice của bạn khỏi các mối đe dọa.

Sự khác biệt chính giữa Istio Virtual Service và Kubernetes Service là ở mức độ hoạt động và mục tiêu sử dụng:

  1. Kubernetes Service:

    • Là một đối tượng trong Kubernetes được sử dụng để tạo một cơ chế định danh ổn định cho các pods của ứng dụng.

    • Kubernetes Service cung cấp một địa chỉ IP và tên DNS cho một nhóm các pods, giúp các thành phần trong cụm Kubernetes có thể giao tiếp với nhau dễ dàng hơn.

    • Service trong Kubernetes chỉ xác định cách truy cập vào các pod trong cụm Kubernetes mà không điều hướng lưu lượng qua các phiên bản khác nhau của một dịch vụ hoặc các phiên bản khác nhau của một ứng dụng.

    • Là một tài nguyên cơ bản trong Kubernetes, cung cấp cách thức để phát hiện và truy cập các Pod trong một cluster.

    • Cung cấp thông tin về cách truy cập Pod, bao gồm:

      • Tên service

      • Cổng

      • Giao thức (ví dụ: HTTP, gRPC)

      • Chọn lọc Pod theo nhãn và selector

    • Được sử dụng để cân bằng tải lưu lượng truy cập đến các Pod trong một service.

    •   apiVersion: v1
        kind: Service
        metadata:
          name: foo-service
        spec:
          type: NodePort
          selector:
            app: foo
          ports:
            - port: 80
              targetPort: 80
              nodePort: 30007
      

      In this configuration, we create a Service named foo-service that routes external traffic coming to the node on port 30007 to the pods labeled with app: foo on port 80

  2. Istio Virtual Service:

  • Là một thành phần của Istio Service Mesh, được sử dụng để định nghĩa các quy tắc định tuyến và điều hướng cho lưu lượng truy cập vào các dịch vụ.

  • Virtual Service cho phép bạn ánh xạ các yêu cầu từ một dịch vụ đến các phiên bản khác nhau của cùng một dịch vụ, hoặc giữa các dịch vụ khác nhau, dựa trên các tiêu chí như header, URI path, hoặc thông tin khác trong yêu cầu HTTP.

  • Istio Virtual Service cung cấp các tính năng mạnh mẽ như phân phối tải, canary deployments, phân chia traffic và các chiến lược định tuyến phức tạp khác.

  • Xây dựng dựa trên Kubernetes Services, cung cấp thêm nhiều tính năng nâng cao để quản lý lưu lượng truy cập microservice.

  • Cung cấp các tính năng như:

    • Phân chia lưu lượng truy cập: Định tuyến lưu lượng truy cập đến các phiên bản microservice khác nhau (ví dụ: canary deployments, A/B testing).

    • Xử lý lỗi: Xác định cách xử lý các lỗi HTTP (ví dụ: trả về mã trạng thái tùy chỉnh, thực hiện retry).

    • Bảo mật: Áp dụng các chính sách bảo mật (ví dụ: xác thực, ủy quyền).

    • Giám sát: Thu thập dữ liệu lưu lượng truy cập và nhật ký.

  • Hoạt động ở lớp Network: Cho phép kiểm soát lưu lượng truy cập chi tiết hơn so với Kubernetes Services, hoạt động ở lớp Transport.

      # First, let’s see a retry policy example
      apiVersion: networking.istio.io/v1alpha3
      kind: VirtualService
      metadata:
        name: foo-retry-virtualservice
      spec:
        hosts:
        - foo
        http:
        - route:
          - destination:
              host: foo
          retries:
            attempts: 3
            perTryTimeout: 2s
    
      # With this configuration, we automatically retry failed requests 
      # to foo up to 3 times with a timeout of 2 seconds for each try.
    
#let’s consider a sample delay injection
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: foo-delay-virtualservice
spec:
  hosts:
  - foo
  http:
  - fault:
      delay:
        percentage:
          value: 0.1
        fixedDelay: 5s
    route:
    - destination:
        host: foo

# Here, a fixed delay of 5 seconds is introduced to 0.1% of the requests to foo,
# which is useful for testing the application’s resilience under latency conditions
# let’s see an example of traffic splitting
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: my-service
spec:
  hosts:
    - my-service
  http:
  - match:
    - uri:
        prefix: /test
    route:
    - destination:
        host: my-service
        subset: v1
      weight: 90
    - destination:
        host: my-service
        subset: v2
      weight: 10

# In this configuration, we route 10% of the traffic to the v2 version of my-service 
# for requests with a URI prefix of /test. 
#This enables safe and controlled exposure to new features

Ví dụ sử dụng Virtual Services:

Phân chia lưu lượng truy cập: Bạn có thể sử dụng Virtual Service để phân chia lưu lượng truy cập giữa phiên bản sản xuất của microservice và phiên bản canary mới.

Xử lý lỗi: Bạn có thể sử dụng Virtual Service để trả về mã trạng thái HTTP tùy chỉnh hoặc thực hiện retry khi xảy ra lỗi.

Bảo mật: Bạn có thể sử dụng Virtual Service để yêu cầu xác thực và ủy quyền trước khi cho phép truy cập microservice.

Giám sát: Bạn có thể sử dụng Virtual Service để thu thập dữ liệu lưu lượng truy cập và nhật ký để theo dõi hiệu suất microservice.