iT邦幫忙

2024 iThome 鐵人賽

DAY 25
0
Kubernetes

從零到一: 使用Spring Boot、Kubernetes 和 Istio實現微服務架構系列 第 25

Day 25 使用Spring Boot、Kubernetes 和 Istio實現微服務架構 - istio 流量控制(金絲雀部屬)

  • 分享至 

  • xImage
  •  

接續昨天安裝的istio環境,我們來感受一下istio的核心功能們,今天介紹的是流量控管的一個應用方式-金絲雀部署

金絲雀部屬

金絲雀部屬(Canary Deployment)是一種軟體發布策略,其核心概念是透過逐步將新版本應用於生產環境中,以此降低版本升級影響生產環境的風險。該方法可以先讓少部分金絲雀用戶進行新版本的測試與回饋,以此驗證新版本的穩定後,並逐步將生產環境升級至新版。

Istio 金絲雀部屬

為了模擬金絲雀部屬的情境,這邊我寫了一個範例的服務,分別有v1與 v2兩個版本。假設一個情境,v1是我一直使用在生產環境的版本,今天我開發了一個v2的版本,想使用金絲雀部屬來逐步更新我的服務。

Deployment 與 Service

apiVersion: v1
kind: Service
metadata:
  name: helloworld-service
spec:
  type: ClusterIP
  selector:
    app: helloworld
  ports:
    - protocol: TCP
      name: http
      port: 5000
      targetPort: 5000
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: helloworld-v1
  labels:
    app: helloworld
spec:
  replicas: 1
  selector:
    matchLabels:
      app: helloworld
      version: v1
  template:
    metadata:
      labels:
        app: helloworld
        version: v1
    spec:
      containers:
      - name: helloworld-v1
        image: allenku0/hello-api:v1
        ports:
        - containerPort: 5000
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: helloworld-v2
  labels:
    app: helloworld
spec:
  replicas: 1
  selector:
    matchLabels:
      app: helloworld
      version: v2
  template:
    metadata:
      labels:
        app: helloworld
        version: v2
    spec:
      containers:
      - name: helloworld-v2
        image: allenku0/hello-api:v2
        ports:
        - containerPort: 5000

Gateway

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: hello-gateway
spec:
  selector:
    istio: ingressgateway 
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "*"

selector 會選擇處理該gateway 的服務,這邊選擇istio安裝時啟動的 ingressgateway
servers 會處理接收選擇的ingressgateway 的 port,監聽的port 如下,我選擇監聽80 port
hosts 表示匹配的主機名稱,收到對應的主機名稱的請求才會觸發路由規則
https://ithelp.ithome.com.tw/upload/images/20240918/20139136HW7LNzJ25P.png

VirtualService

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: hello-vs
spec:
  hosts:
  - "*"
  gateways:
  - hello-gateway
  http:
  - match:
    - uri:
        prefix: /api
    route:
    - destination:
        host: helloworld-service
        subset: v1
        port:
          number: 5000
      weight: 90
    - destination:
        host: helloworld-service
        subset: v2
        port:
          number: 5000
      weight: 10

hosts :表示匹配的主機名稱,收到對應的主機名稱的請求才會觸發路由規則
gateways :選擇處理從哪個gateway 接收到的流量
route.destination.host :這邊選擇目的,我指定目的服務的service 與 service port

DestinationRule

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: hello-version-define
spec:
  host: helloworld-service
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2

hosts :表示匹配的主機名稱,收到對應的主機名稱的請求才會觸發路由規則,這邊指定我hello 服務的service,也就是經過helloworld-service的流量會觸發規則
subsets: 這邊為了進一步區分version 版本,設定label去對應不同版本的服務(Deployment),這個label值也可以在helloworld-v1與helloworld-v2中找到

以上部屬完來看看效果。

v1 weight:90、v2 weight:10結果

https://ithelp.ithome.com.tw/upload/images/20240918/2013913671s3kOMk6P.png
可以看到大部分流量到了v1的服務中

v1 weight:50、v2 weight:50結果

https://ithelp.ithome.com.tw/upload/images/20240918/20139136pLBmJdeYOw.png
可以看到流量平均分散到v1與v2的服務中

v1 weight:10、v2 weight:90結果

https://ithelp.ithome.com.tw/upload/images/20240918/20139136FSQ8Z4eMeh.png
可以看到大部分流量到了v2的服務中

透過上述方法逐步分配流量,以此方式達到金絲雀部屬
今天就到這邊,我們明天再見!


上一篇
Day 24 使用Spring Boot、Kubernetes 和 Istio實現微服務架構 - istio 服務發現與負載平衡
下一篇
Day 26 使用Spring Boot、Kubernetes 和 Istio實現微服務架構 - istio 安全管理
系列文
從零到一: 使用Spring Boot、Kubernetes 和 Istio實現微服務架構30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言