Sử Dụng Nhiều Phiên Bản Istio Trên Một Cụm Cluster Kubernetes Với revision

KiloKilo
6 min read

Trong quá trình quản lý hệ thống phân tán và dịch vụ trên Kubernetes, yêu cầu nâng cấp và triển khai nhiều phiên bản của Istio là một phần không thể thiếu. Tuy nhiên, việc quản lý nhiều phiên bản của Istio trên cùng một cụm (cluster) đòi hỏi sự cẩn trọng và chính xác để đảm bảo dịch vụ luôn ổn định trong quá trình nâng cấp hoặc triển khai song song các phiên bản khác nhau.

Trong bài viết này, chúng ta sẽ tìm hiểu cách sử dụng nhiều phiên bản Istio trên cùng một cụm Kubernetes bằng tính năng revision, giúp đơn giản hóa quy trình này và tăng cường khả năng quản lý các phiên bản dịch vụ.

Tại Sao Cần Nhiều Phiên Bản Istio?

Trong một môi trường phát triển liên tục (CI/CD), việc nâng cấp các phiên bản dịch vụ, bao gồm cả Istio, là điều cần thiết. Nhưng việc nâng cấp trực tiếp toàn bộ hệ thống có thể gây ra những sự cố không mong muốn, khiến các ứng dụng ngừng hoạt động nếu có lỗi phát sinh trong phiên bản mới.

Bằng cách chạy song song nhiều phiên bản Istio, bạn có thể:

  • Test phiên bản mới: Triển khai và kiểm thử một phiên bản mới mà không ảnh hưởng đến các dịch vụ hiện có.

  • Tách biệt dịch vụ: Mỗi namespace có thể chọn một phiên bản Istio khác nhau để đảm bảo tính ổn định trong quá trình thử nghiệm hoặc triển khai dần (canary deployment).

  • Giảm thiểu rủi ro: Các phiên bản cũ vẫn có thể chạy song song với phiên bản mới, giúp dễ dàng rollback khi có lỗi.

Khái Niệm revision Trong Istio

Istio sử dụng revision để quản lý nhiều phiên bản cùng tồn tại trên một cụm Kubernetes. Một revision đơn giản là một chuỗi ký tự duy nhất (ví dụ v1, v2) được gắn vào các thành phần control plane của Istio như Pilot, Galley, Citadel,... Điều này giúp phân biệt các phiên bản khác nhau của Istio, đặc biệt trong quá trình nâng cấp.

Lợi Ích Của revision

  • Không ảnh hưởng đến phiên bản hiện tại: Mỗi phiên bản Istio có thể chạy độc lập mà không ảnh hưởng đến các phiên bản khác.

  • Kiểm soát chi tiết: Chỉ định từng namespace sử dụng phiên bản Istio cụ thể với label istio.io/rev, giúp kiểm soát rõ ràng ứng dụng nào chạy với phiên bản nào.

Cách Cài Đặt Nhiều Phiên Bản Istio Với revision

1. Cài Đặt Các Phiên Bản Istio

Để cài đặt nhiều phiên bản Istio, bạn cần sử dụng istioctl và chỉ định revision cho mỗi phiên bản. Mỗi phiên bản sẽ được cài đặt trong một namespace điều khiển riêng (ví dụ: istio-system-v1istio-system-v2).

Cài đặt phiên bản Istio v1:

istioctl install --set profile=default --set revision=v1 --namespace=istio-system-v1

Cài đặt phiên bản Istio v2:

istioctl install --set profile=default --set revision=v2 --namespace=istio-system-v2

2. Gán revision Cho Namespace

Để gán một namespace sử dụng phiên bản Istio cụ thể, bạn sử dụng label istio.io/rev.

  • Gán namespace A cho phiên bản Istio v1:
kubectl label namespace A istio.io/rev=v1
  • Gán namespace B cho phiên bản Istio v2:
kubectl label namespace B istio.io/rev=v2

Lưu ý rằng các pod trong những namespace này sẽ tự động được inject với Envoy sidecar từ phiên bản Istio tương ứng khi tạo mới hoặc khi chúng được khởi động lại.

3. Triển Khai Ứng Dụng

Khi triển khai ứng dụng vào các namespace được gán revision, Envoy sidecar sẽ được inject từ đúng phiên bản Istio tương ứng, giúp đảm bảo rằng ứng dụng sử dụng đúng phiên bản control plane của Istio.

Xác Minh Phiên Bản Istio Đang Sử Dụng

Sau khi gán revision cho các namespace, bạn có thể xác minh rằng các pods đã được inject với đúng phiên bản Istio bằng cách kiểm tra logs của các sidecar hoặc kiểm tra annotation trong các pod.

Ví dụ, để kiểm tra phiên bản revision được inject, bạn có thể chạy lệnh sau:

kubectl get pod -n A <pod-name> -o jsonpath='{.metadata.labels.istio\.io/rev}'

Lệnh này sẽ hiển thị revision mà pod đang sử dụng.

Quản Lý Nhiều Phiên Bản Istio

Khi cần nâng cấp hoặc xóa bỏ một phiên bản Istio, bạn cần đảm bảo rằng các namespace đã được chuyển sang sử dụng phiên bản mới bằng cách thay đổi label istio.io/rev sang phiên bản mong muốn. Sau đó, bạn có thể xóa phiên bản cũ mà không ảnh hưởng đến các dịch vụ khác.

Dưới đây là một số hình minh họa bằng text về cách sử dụng nhiều phiên bản Istio trên cùng một cụm với các namespace khác nhau:

Hình 1: Cấu trúc cụm với hai phiên bản Istio điều khiển hai namespace

+---------------------------+    +---------------------------+
| Namespace: istio-system-v1 |    | Namespace: istio-system-v2 |
| Control Plane v1           |    | Control Plane v2           |
+---------------------------+    +---------------------------+
             |                             |
             |                             |
  +-----------------+          +-----------------+
  | Namespace: A     |          | Namespace: B     |
  | (revision=v1)    |          | (revision=v2)    |
  +-----------------+          +-----------------+
         |                             |
  +--------------+               +--------------+
  | App Pod A1   |               | App Pod B1   |
  | Envoy v1     |               | Envoy v2     |
  +--------------+               +--------------+

Giải thích:

  • Namespace istio-system-v1istio-system-v2 tương ứng với hai control plane Istio khác nhau.

  • Namespace A được gán với revision=v1, sử dụng Istio phiên bản v1, và namespace B được gán với revision=v2, sử dụng Istio phiên bản v2.

  • Mỗi ứng dụng trong các namespace sẽ sử dụng phiên bản Envoy sidecar tương ứng với control plane của phiên bản đó.

Hình 2: Quá trình gán revision cho namespace

+-------------------------------+     +-------------------------------+
|                               |     |                               |
|  Namespace A                  |     |  Namespace B                  |
|                               |     |                               |
|  kubectl label namespace A     |     |  kubectl label namespace B     |
|  istio.io/rev=v1               |     |  istio.io/rev=v2               |
|                               |     |                               |
+-------------------------------+     +-------------------------------+

               |                                   |
               |                                   |
   +--------------------------+         +--------------------------+
   | App A uses Istio v1       |         | App B uses Istio v2       |
   +--------------------------+         +--------------------------+

Giải thích:

  • Lệnh kubectl label namespace được sử dụng để gán revision cho mỗi namespace, đảm bảo ứng dụng trong namespace đó sẽ sử dụng đúng phiên bản Istio.

Hình 3: Quá trình inject Envoy sidecar từ đúng phiên bản Istio

+---------------------+
|  Deploy App in A     |
+---------------------+
            |
+------------------------------+
|  Inject Envoy sidecar v1      |
+------------------------------+
            |
+------------------------------+
|  App Pod A1 + Envoy v1        |
+------------------------------+

            +
            |
            v

+---------------------+
|  Deploy App in B     |
+---------------------+
            |
+------------------------------+
|  Inject Envoy sidecar v2      |
+------------------------------+
            |
+------------------------------+
|  App Pod B1 + Envoy v2        |
+------------------------------+

Giải thích:

  • Quá trình deploy ứng dụng trong các namespace đã được gán revision sẽ tự động inject đúng phiên bản Envoy sidecar, đảm bảo rằng các pods chạy với đúng phiên bản Istio tương ứng.

Kết Luận

Tính năng revision của Istio giúp đơn giản hóa việc quản lý nhiều phiên bản trên cùng một cụm Kubernetes. Điều này giúp dễ dàng nâng cấp, kiểm thử, và triển khai các phiên bản Istio mới mà không ảnh hưởng đến hoạt động của toàn bộ hệ thống. Bằng cách gán revision cho từng namespace, các đội ngũ phát triển có thể kiểm soát chính xác phiên bản Istio mà dịch vụ của họ sử dụng, từ đó tăng cường tính linh hoạt và giảm thiểu rủi ro.

0
Subscribe to my newsletter

Read articles from Kilo directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Kilo
Kilo