Triển khai Canary trong Kubernetes #3: Istio

Sử dụng Istio+Kiali để khởi chạy và trực quan hóa quá trình triển khai Canary

Triển khai Canary trong Kubernetes #3: Istio

Các bài viết trong loạt bài này

  1. Triển khai Canary trong Kubernetes #1: Gitlab CI
  2. Triển khai Canary trong Kubernetes #2: Triển khai Argo
  3. (Bài viết này)
  4. Triển khai Canary bằng cách sử dụng Jenkins-X Istio Flagger

Triển khai Canary

Chúng tôi hy vọng bạn đọc phần đầu tiên, trong đó chúng tôi đã giải thích ngắn gọn về việc triển khai Canary là gì và chỉ ra cách triển khai chúng bằng cách sử dụng tài nguyên Kubernetes tiêu chuẩn.

Istio

Và chúng tôi cho rằng khi đọc bài viết này bạn đã biết Istio là gì. Nếu không thì bạn có thể đọc về nó đây.

Đơn xin xét nghiệm

Triển khai Canary trong Kubernetes #3: Istio

Mỗi nhóm chứa hai vùng chứa: ứng dụng của chúng tôi và istio-proxy.

Chúng tôi sẽ sử dụng một ứng dụng thử nghiệm đơn giản với các nhóm python frontend-nginx và phụ trợ. Nhóm nginx sẽ chỉ chuyển hướng từng yêu cầu đến nhóm phụ trợ và hoạt động như một proxy. Thông tin chi tiết có thể được tìm thấy trong các yaml sau:

Tự chạy ứng dụng thử nghiệm

Nếu bạn muốn làm theo ví dụ của tôi và tự mình sử dụng ứng dụng thử nghiệm này, hãy xem dự án đọc tôi.

Triển khai ban đầu

Khi khởi chạy Triển khai đầu tiên, chúng tôi thấy rằng các nhóm ứng dụng của chúng tôi chỉ có 2 vùng chứa, tức là Istio sidecar mới đang được triển khai:

Triển khai Canary trong Kubernetes #3: Istio

Và chúng ta cũng thấy Istio Gateway Loadbalancer trong namespace istio-system:

Triển khai Canary trong Kubernetes #3: Istio

Tạo lưu lượng truy cập

Chúng tôi sẽ sử dụng IP sau để tạo lưu lượng truy cập sẽ được nhóm giao diện người dùng nhận và chuyển tiếp đến nhóm phụ trợ:

while true; do curl -s --resolve 'frontend.istio-test:80:35.242.202.152' frontend.istio-test; sleep 0.1; done

Chúng tôi cũng sẽ thêm frontend.istio-test vào tập tin máy chủ của chúng tôi.

Xem lưới qua Kiali

Chúng tôi đã cài đặt ứng dụng thử nghiệm và Istio cùng với Tracing, Grafana, Prometheus và Kiali (xem bên dưới để biết chi tiết). dự án đọc tôi). Vì vậy chúng ta có thể sử dụng Kiali thông qua:

istioctl dashboard kiali # admin:admin

Triển khai Canary trong Kubernetes #3: Istio

Kiali trực quan hóa lưu lượng truy cập hiện tại thông qua Mesh

Như chúng ta có thể thấy, 100% lưu lượng truy cập đến dịch vụ giao diện người dùng, sau đó đến nhóm giao diện người dùng có nhãn v1, vì chúng ta đang sử dụng proxy nginx đơn giản để chuyển hướng các yêu cầu đến dịch vụ phụ trợ, từ đó chuyển hướng chúng đến nhóm phụ trợ với nhãn v1.

Kiali hoạt động hiệu quả với Istio và cung cấp giải pháp kết xuất Lưới đóng hộp. Thật tuyệt vời.

Triển khai Canary

Phần phụ trợ của chúng tôi đã có hai bản triển khai k8, một cho v1 và một cho v2. Bây giờ chúng ta chỉ cần yêu cầu Istio chuyển tiếp một tỷ lệ phần trăm yêu cầu nhất định tới v2.

Bước 1: 10%

Và tất cả những gì chúng ta cần làm là điều chỉnh trọng số của VirtualService trong istio.yaml:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: backend
  namespace: default
spec:
  gateways: []
  hosts:
  - "backend.default.svc.cluster.local"
  http:
  - match:
    - {}
    route:
    - destination:
        host: backend.default.svc.cluster.local
        subset: v1
        port:
          number: 80
      weight: 90
    - destination:
        host: backend.default.svc.cluster.local
        subset: v2
        port:
          number: 80
      weight: 10

Triển khai Canary trong Kubernetes #3: Istio

Chúng tôi thấy rằng 10% yêu cầu được chuyển hướng đến v2.

Bước 2: 50%

Và bây giờ chỉ cần tăng nó lên 50% là đủ:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: backend
  namespace: default
spec:
...
    - destination:
        host: backend.default.svc.cluster.local
        subset: v1
        port:
          number: 80
      weight: 50
    - destination:
        host: backend.default.svc.cluster.local
        subset: v2
        port:
          number: 80
      weight: 50

Triển khai Canary trong Kubernetes #3: Istio

Bước 3: 100%

Bây giờ việc triển khai Canary có thể được coi là hoàn tất và tất cả lưu lượng truy cập được chuyển hướng đến v2:

Triển khai Canary trong Kubernetes #3: Istio

Kiểm tra Canary theo cách thủ công

Giả sử hiện tại chúng tôi gửi 2% tổng số yêu cầu đến phần phụ trợ v10. Điều gì sẽ xảy ra nếu chúng ta muốn kiểm tra thủ công v2 để đảm bảo mọi thứ hoạt động như chúng ta mong đợi?

Chúng tôi có thể thêm quy tắc khớp đặc biệt dựa trên tiêu đề HTTP:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: backend
  namespace: default
spec:
  gateways: []
  hosts:
  - "backend.default.svc.cluster.local"
  http:
  - match:
    - headers:
        canary:
          exact: "canary-tester"
    route:
    - destination:
        host: backend.default.svc.cluster.local
        subset: v2
        port:
          number: 80
      weight: 100
  - match:
    - {}
    route:
    - destination:
        host: backend.default.svc.cluster.local
        subset: v1
        port:
          number: 80
      weight: 90
    - destination:
        host: backend.default.svc.cluster.local
        subset: v2
        port:
          number: 80
      weight: 10

Bây giờ bằng cách sử dụng Curl, chúng ta có thể buộc yêu cầu v2 bằng cách gửi tiêu đề:

Triển khai Canary trong Kubernetes #3: Istio

Các yêu cầu không có tiêu đề vẫn sẽ được điều khiển theo tỷ lệ 1/10:

Triển khai Canary trong Kubernetes #3: Istio

Canary cho hai phiên bản phụ thuộc

Bây giờ chúng tôi sẽ xem xét tùy chọn nơi chúng tôi có phiên bản v2 cho cả giao diện người dùng và phụ trợ. Đối với cả hai, chúng tôi đã chỉ định rằng 10% lưu lượng truy cập sẽ chuyển đến v2:

Triển khai Canary trong Kubernetes #3: Istio

Chúng tôi thấy rằng cả giao diện người dùng v1 và v2 đều chuyển tiếp lưu lượng truy cập với tỷ lệ 1/10 so với phụ trợ v1 và v2.

Điều gì sẽ xảy ra nếu chúng ta chỉ cần chuyển tiếp lưu lượng truy cập từ frontend-v2 sang backend-v2 vì nó không tương thích với v1? Để làm điều này, chúng tôi sẽ đặt tỷ lệ 1/10 cho giao diện người dùng, tỷ lệ này kiểm soát lưu lượng truy cập nào đến phần phụ trợ-v2 bằng cách sử dụng thương lượng sourceLabels :

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: backend
  namespace: default
spec:
  gateways: []
  hosts:
  - "backend.default.svc.cluster.local"
  http:
...
  - match:
    - sourceLabels:
        app: frontend
        version: v2
    route:
    - destination:
        host: backend.default.svc.cluster.local
        subset: v2
        port:
          number: 80
      weight: 100

Kết quả là, chúng tôi nhận được những gì chúng tôi cần:

Triển khai Canary trong Kubernetes #3: Istio

Sự khác biệt so với phương pháp Canary thủ công

В phần đầu tiên Chúng tôi đã triển khai Canary theo cách thủ công, đồng thời sử dụng hai lượt triển khai k8. Ở đó, chúng tôi kiểm soát tỷ lệ yêu cầu bằng cách thay đổi số lượng bản sao. Cách tiếp cận này hoạt động, nhưng có những hạn chế nghiêm trọng.

Istio cho phép xác định tỷ lệ yêu cầu bất kể số lượng bản sao. Ví dụ: điều này có nghĩa là chúng ta có thể sử dụng HPA (Bộ chia tỷ lệ tự động Pod ngang) và không cần phải định cấu hình theo trạng thái triển khai Canary hiện tại.

Tổng

Istio hoạt động rất tốt và sử dụng nó cùng với Kiali sẽ tạo nên một sự kết hợp rất mạnh mẽ. Tiếp theo trong danh sách sở thích của tôi là kết hợp Spinnaker với Istio để tự động hóa và phân tích Canary.

Nguồn: www.habr.com

Thêm một lời nhận xét