接續昨天安裝的istio環境,我們來感受一下istio的核心功能們,今天介紹的是流量控管的一個應用方式-金絲雀部署
金絲雀部屬(Canary Deployment)是一種軟體發布策略,其核心概念是透過逐步將新版本應用於生產環境中,以此降低版本升級影響生產環境的風險。該方法可以先讓少部分金絲雀用戶進行新版本的測試與回饋,以此驗證新版本的穩定後,並逐步將生產環境升級至新版。
為了模擬金絲雀部屬的情境,這邊我寫了一個範例的服務,分別有v1與 v2兩個版本。假設一個情境,v1是我一直使用在生產環境的版本,今天我開發了一個v2的版本,想使用金絲雀部屬來逐步更新我的服務。
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
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安裝時啟動的 ingressgatewayservers
會處理接收選擇的ingressgateway 的 port,監聽的port 如下,我選擇監聽80 porthosts
表示匹配的主機名稱,收到對應的主機名稱的請求才會觸發路由規則
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
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的服務中
可以看到流量平均分散到v1與v2的服務中
可以看到大部分流量到了v2的服務中
透過上述方法逐步分配流量,以此方式達到金絲雀部屬
今天就到這邊,我們明天再見!