Open Service Mesh (OSM) 設定至 Istio 的移轉指引
重要
本文旨在讓您輕鬆了解如何識別 OSM 設定,並將其轉譯為對等的 Istio 設定,以便將工作負載從 OSM 移轉至 Istio。 本文絕非詳盡的詳細指南。
本文提供將 OSM 原則對應至 Istio 原則的實際指引,以協助將 OSM 管理的微服務部署移轉為由 Istio 管理。 我們使用 OSM Bookstore 範例應用程式,作為目前 OSM 使用者的基本參考。 下列逐步解說將部署 Bookstore 應用程式。 遵循相同的步驟,並說明如何使用 Istio 對等專案來套用 OSM SMI 流量原則。
如果您未使用 OSM 且不熟悉 Istio,請先參閱 Istio 自己的使用者入門指南,了解如何將 Istio 服務網格用於您的應用程式。 如果您正在使用 OSM,請確定您熟悉 OSM Bookstore 範例應用程式逐步解說中關於 OSM 設定流量原則的內容。 下列逐步解說不會複製目前的文件,並在相關時參考特定主題。 您應該熟悉並充分了解 Bookstore 應用程式架構,然後再續繼。
必要條件
- Azure 訂用帳戶。 如果您沒有 Azure 訂用帳戶,您可以建立免費帳戶。
- Azure CLI 已安裝。
- OSM AKS 附加元件已從 AKS 叢集解除安裝
- 任何現有的 OSM Bookstore 應用程式 (包括命名空間) 皆已從叢集解除安裝及刪除
- 安裝 Istio AKS 服務網格附加元件
OSM 範例 Bookstore 應用程式所需的修改
若要讓 Istio 管理 OSM Bookstore 應用程式,需要對現有資訊清單進行幾項變更。 這些變更與 Bookstore 和 mysql 服務有關。
Bookstore 修改
在 OSM Bookstore 逐步解說中,bookstore 服務會與另一個 bookstore-v2 服務一起部署,以示範 OSM 如何提供流量轉移。 這項部署的服務可讓您分割多個服務端點之間的用戶端 (bookbuyer
) 流量。 第一個新概念,是了解 Istio 如何處理其所謂的流量轉移。
流量轉移的 OSM 實作是以 SMI 流量分割規格為基礎。 SMI 流量分割規格要求需存在多個最上層服務,這些服務會新增為具有所需加權計量的後端,以將用戶端要求從一個服務移位到另一個服務。 Istio 會使用虛擬服務和目的地規則的組合來完成流量轉移。 強烈建議您熟悉虛擬服務和目的地規則的概念。
簡單地說,Istio 虛擬服務會針對要求主機 (服務名稱) 的用戶端定義路由規則。 虛擬服務可讓多個版本的部署與一個虛擬服務主機名相關聯,讓客戶端設定目標。 可針對相同的服務為多個部署加上標籤,代表相同主機名稱背後的不同應用程式版本。 然後,可設定 Istio 虛擬服務將要求加權至特定版本的服務。 服務的可用版本會設定為在 Istio 目的地規則中使用 subsets
屬性。
對 Istio 的 bookstore 服務和部署進行的修改,便不需要有明確的第二個服務作為目標,而 SMI 流量分割則需要。 bookstore v2 服務也不需要另一個服務帳戶,因為其將在 bookstore 服務下合併。 針對 bookstore v1 和 v2 的原始 OSM traffic-access-v1.yaml 資訊清單修改,如底下的建立 Pod、服務和服務帳戶一節所示。 我們示範如何進行流量分割,也就是稍後逐步解說中的流量轉移:
MySql 修改
只有服務組態中才需要 mysql StatefulSet 的變更。 在服務規格下,OSM 需要 targetPort
和 appProtocol
屬性。 Istio 不需要這些屬性。 mysqldb 的下列更新服務看起來像這樣:
apiVersion: v1
kind: Service
metadata:
name: mysqldb
labels:
app: mysqldb
service: mysqldb
spec:
ports:
- port: 3306
name: tcp
selector:
app: mysqldb
部署修改的 Bookstore 應用程式
與 OSM Bookstore 逐步解說類似,我們從新的 Bookstore 應用程式安裝開始。
建立命名空間
kubectl create namespace bookstore
kubectl create namespace bookbuyer
kubectl create namespace bookthief
kubectl create namespace bookwarehouse
新增 Istio 側車插入的命名空間標籤
針對 OSM,使用命令 osm namespace add <namespace>
為 OSM 控制器建立命名空間的必要註釋,以新增自動側車插入。 使用 Istio 時,您只需要為命名空間加上標籤,即可指示 Istio 控制器自動插入 Envoy 側車 Proxy。
kubectl label namespace bookstore istio-injection=enabled
kubectl label namespace bookbuyer istio-injection=enabled
kubectl label namespace bookthief istio-injection=enabled
kubectl label namespace bookwarehouse istio-injection=enabled
部署 Bookstore 的 Istio 虛擬服務和目的地規則
如先前在 Bookstore 修改一節中所述,Istio 會使用我們稍後在逐步解說中設定的 VirtualService 加權屬性來處理流量轉移。 我們會部署 Bookstore 服務的虛擬服務和目的地規則。 即使已部署 Bookstore 第 2 版,我們仍只會部署 Bookstore 第 1 版。 Istio 虛擬服務只提供 Bookstore 第 1 版的路由。 與 OSM 處理流量轉移 (流量分割) 的方式不同,OSM 會為 Bookstore 第 2 版應用程式部署另一個服務。 OSM 需要設定使用 TrafficSplit 在用戶端要求之間分割流量。 搭配 Istio 使用流量轉移時,我們可以將流量轉移參考至針對相同服務標示的多個 Kubernetes 應用程式部署 (版本)。
在此逐步解說中,同時部署這兩個 Bookstore 版本 (v1 和 v2)。 因為虛擬服務組態的緣故,只有第 1 版可連線。 不需要為 Bookstore 第 2 版部署另一個服務,當我們稍後更新Bookstore 虛擬服務並提供必要的加權屬性來執行流量轉移時,便會啟用至 Bookstore 第 2 版的路由。
kubectl apply -f - <<EOF
# Create bookstore virtual service
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: bookstore-virtualservice
namespace: bookstore
spec:
hosts:
- bookstore
http:
- route:
- destination:
host: bookstore
subset: v1
---
# Create bookstore destination rule
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: bookstore-destination
namespace: bookstore
spec:
host: bookstore
subsets:
- name: v1
labels:
app: bookstore
version: v1
- name: v2
labels:
app: bookstore
version: v2
EOF
建立 Pod、服務和服務帳戶
我們使用單一資訊清單檔案,其中包含先前部署 bookbuyer
、bookthief
、bookstore
、bookwarehouse
和 mysql
應用程式的逐步解說中討論的修改。
kubectl apply -f - <<EOF
##################################################################################################
# bookbuyer service
##################################################################################################
---
# Create bookbuyer Service Account
apiVersion: v1
kind: ServiceAccount
metadata:
name: bookbuyer
namespace: bookbuyer
---
# Create bookbuyer Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: bookbuyer
namespace: bookbuyer
spec:
replicas: 1
selector:
matchLabels:
app: bookbuyer
version: v1
template:
metadata:
labels:
app: bookbuyer
version: v1
spec:
serviceAccountName: bookbuyer
nodeSelector:
kubernetes.io/arch: amd64
kubernetes.io/os: linux
containers:
- name: bookbuyer
image: openservicemesh/bookbuyer:latest-main
imagePullPolicy: Always
command: ["/bookbuyer"]
env:
- name: "BOOKSTORE_NAMESPACE"
value: bookstore
- name: "BOOKSTORE_SVC"
value: bookstore
---
##################################################################################################
# bookthief service
##################################################################################################
---
# Create bookthief ServiceAccount
apiVersion: v1
kind: ServiceAccount
metadata:
name: bookthief
namespace: bookthief
---
# Create bookthief Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: bookthief
namespace: bookthief
spec:
replicas: 1
selector:
matchLabels:
app: bookthief
template:
metadata:
labels:
app: bookthief
version: v1
spec:
serviceAccountName: bookthief
nodeSelector:
kubernetes.io/arch: amd64
kubernetes.io/os: linux
containers:
- name: bookthief
image: openservicemesh/bookthief:latest-main
imagePullPolicy: Always
command: ["/bookthief"]
env:
- name: "BOOKSTORE_NAMESPACE"
value: bookstore
- name: "BOOKSTORE_SVC"
value: bookstore
- name: "BOOKTHIEF_EXPECTED_RESPONSE_CODE"
value: "503"
---
##################################################################################################
# bookstore service version 1 & 2
##################################################################################################
---
# Create bookstore Service
apiVersion: v1
kind: Service
metadata:
name: bookstore
namespace: bookstore
labels:
app: bookstore
spec:
ports:
- port: 14001
name: bookstore-port
selector:
app: bookstore
---
# Create bookstore Service Account
apiVersion: v1
kind: ServiceAccount
metadata:
name: bookstore
namespace: bookstore
---
# Create bookstore-v1 Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: bookstore-v1
namespace: bookstore
spec:
replicas: 1
selector:
matchLabels:
app: bookstore
version: v1
template:
metadata:
labels:
app: bookstore
version: v1
spec:
serviceAccountName: bookstore
nodeSelector:
kubernetes.io/arch: amd64
kubernetes.io/os: linux
containers:
- name: bookstore
image: openservicemesh/bookstore:latest-main
imagePullPolicy: Always
ports:
- containerPort: 14001
name: web
command: ["/bookstore"]
args: ["--port", "14001"]
env:
- name: BOOKWAREHOUSE_NAMESPACE
value: bookwarehouse
- name: IDENTITY
value: bookstore-v1
---
# Create bookstore-v2 Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: bookstore-v2
namespace: bookstore
spec:
replicas: 1
selector:
matchLabels:
app: bookstore
version: v2
template:
metadata:
labels:
app: bookstore
version: v2
spec:
serviceAccountName: bookstore
nodeSelector:
kubernetes.io/arch: amd64
kubernetes.io/os: linux
containers:
- name: bookstore
image: openservicemesh/bookstore:latest-main
imagePullPolicy: Always
ports:
- containerPort: 14001
name: web
command: ["/bookstore"]
args: ["--port", "14001"]
env:
- name: BOOKWAREHOUSE_NAMESPACE
value: bookwarehouse
- name: IDENTITY
value: bookstore-v2
---
##################################################################################################
# bookwarehouse service
##################################################################################################
---
# Create bookwarehouse Service Account
apiVersion: v1
kind: ServiceAccount
metadata:
name: bookwarehouse
namespace: bookwarehouse
---
# Create bookwarehouse Service
apiVersion: v1
kind: Service
metadata:
name: bookwarehouse
namespace: bookwarehouse
labels:
app: bookwarehouse
spec:
ports:
- port: 14001
name: bookwarehouse-port
selector:
app: bookwarehouse
---
# Create bookwarehouse Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: bookwarehouse
namespace: bookwarehouse
spec:
replicas: 1
selector:
matchLabels:
app: bookwarehouse
template:
metadata:
labels:
app: bookwarehouse
version: v1
spec:
serviceAccountName: bookwarehouse
nodeSelector:
kubernetes.io/arch: amd64
kubernetes.io/os: linux
containers:
- name: bookwarehouse
image: openservicemesh/bookwarehouse:latest-main
imagePullPolicy: Always
command: ["/bookwarehouse"]
##################################################################################################
# mysql service
##################################################################################################
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: mysql
namespace: bookwarehouse
---
apiVersion: v1
kind: Service
metadata:
name: mysqldb
labels:
app: mysqldb
service: mysqldb
spec:
ports:
- port: 3306
name: tcp
selector:
app: mysqldb
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
namespace: bookwarehouse
spec:
serviceName: mysql
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
serviceAccountName: mysql
nodeSelector:
kubernetes.io/os: linux
containers:
- image: mysql:5.6
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD
value: mypassword
- name: MYSQL_DATABASE
value: booksdemo
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- mountPath: /mysql-data
name: data
readinessProbe:
tcpSocket:
port: 3306
initialDelaySeconds: 15
periodSeconds: 10
volumes:
- name: data
emptyDir: {}
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 250M
EOF
若要在叢集上檢視這些資源,請執行下列命令:
kubectl get pods,deployments,serviceaccounts -n bookbuyer
kubectl get pods,deployments,serviceaccounts -n bookthief
kubectl get pods,deployments,serviceaccounts,services,endpoints -n bookstore
kubectl get pods,deployments,serviceaccounts,services,endpoints -n bookwarehouse
檢視應用程式 UI
與原始 OSM 逐步解說類似,如果您複製 OSM 存放庫,則可以利用連接埠轉送指令碼在此處檢視每個應用程式的 UI。 目前,我們只需要檢視 bookbuyer
和 bookthief
UI。
cp .env.example .env
bash <<EOF
./scripts/port-forward-bookbuyer-ui.sh &
./scripts/port-forward-bookthief-ui.sh &
wait
EOF
在瀏覽器中開啟下列 URL:
http://localhost:8080 - bookbuyer
http://localhost:8083 - bookthief
設定 Istio 的流量原則
為了維持原始 OSM Bookstore 逐步解說的持續性,以轉譯至 Istio,我們將討論 OSM 的寬鬆流量原則模式。 OSM 的寬鬆流量原則模式是允許或拒絕網格中的流量的概念,而不需要部署任何特定的 SMI 流量存取控制規則。 寬鬆流量模式設定的存在可讓使用者將應用程式上線到網格中,同時取得 mTLS 加密,而不需要明確的規則,即可允許網格中的應用程式進行通訊。 寬鬆流量模式功能可避免在 OSM 管理應用程式時立即中斷應用程式的通訊,並提供定義規則的時間,同時確保應用程式通訊經過 mTLS 加密。 此設定可透過 OSM 的 MeshConfig 設定為 true
或 false
。
Istio 會以不同的方式處理 mTLS 強制執行。 不同於 OSM,Istio 的寬鬆模式會自動設定側車 Proxy 使用 mTLS,但允許服務同時接受純文字和 mTLS 流量。 與 OSM 寬鬆模式設定對等的,是利用 Istio 的 PeerAuthentication
設定。 PeerAuthentication
可以在命名空間或整個網格上更細微地完成。 如需 Istio 強制執行 mTLS 的詳細資訊,請參閱 istio 相互 TLS 移轉文章。
在 Bookstore 命名空間上強制執行 Istio Strict 模式
請務必記住,就像 OSM 寬鬆模式一樣,Istio 的 PeerAuthentication
設定只會與 mTLS 強制執行的使用有關。 實際的第 7 層原則,就像 OSM HTTPRouteGroups 中使用的原則,是使用稍後在逐步解說中看到的 Istio AuthorizationPolicy 設定來處理。
我們會在 Istio 的 mTLS 嚴格模式中,細微地放置 bookbuyer
、bookthief
、bookstore
和 bookwarehouse
命名空間。
kubectl apply -f - <<EOF
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
name: bookbuyer
namespace: bookbuyer
spec:
mtls:
mode: STRICT
---
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
name: bookthief
namespace: bookthief
spec:
mtls:
mode: STRICT
---
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
name: bookstore
namespace: bookstore
spec:
mtls:
mode: STRICT
---
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
name: bookwarehouse
namespace: bookwarehouse
spec:
mtls:
mode: STRICT
EOF
部署 Istio 存取控制原則
與 OSM SMI 流量目標和 SMI 流量規格資源類似,為了定義要通訊之應用程式的存取控制和路由原則,Istio 會使用 AuthorizationPolicy
設定來完成這些類似的精細控制。
讓我們逐步解說如何轉譯 Bookstore TrafficTarget 原則,其特別允許只使用特定的第 7 層路徑、標頭和方法 bookbuyer
與其通訊。 以下是 traffic-access-v1.yaml 資訊清單的一部分。
kind: TrafficTarget
apiVersion: access.smi-spec.io/v1alpha3
metadata:
name: bookstore
namespace: bookstore
spec:
destination:
kind: ServiceAccount
name: bookstore
namespace: bookstore
rules:
- kind: HTTPRouteGroup
name: bookstore-service-routes
matches:
- buy-a-book
- books-bought
sources:
- kind: ServiceAccount
name: bookbuyer
namespace: bookbuyer
---
apiVersion: specs.smi-spec.io/v1alpha4
kind: HTTPRouteGroup
metadata:
name: bookstore-service-routes
namespace: bookstore
spec:
matches:
- name: books-bought
pathRegex: /books-bought
methods:
- GET
headers:
- "user-agent": ".*-http-client/*.*"
- "client-app": "bookbuyer"
- name: buy-a-book
pathRegex: ".*a-book.*new"
methods:
- GET
如果您在 TrafficTarget 原則下注意到,您可以在規格中明確定義哪些來源服務可與目的地服務通訊。 我們可以看到,我們允許來源 bookbuyer
授權與目的地 Bookstore 通訊。 如果我們將服務對服務授權從 OSM TrafficTarget
設定轉譯為 Istio AuthorizationPolicy
,其看起來像這樣:
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: bookstore
namespace: bookstore
spec:
selector:
matchLabels:
app: bookstore
action: ALLOW
rules:
- from:
- source:
principals: ["cluster.local/ns/bookbuyer/sa/bookbuyer"]
在 Istio 的 AuthorizationPolicy
中,您會注意到 OSM TrafficTarget 原則目的地服務如何對應至選取器標籤比對,以及服務所在的命名空間。 來源服務會顯示在規則區段底下,其中有一個來源/原則屬性會對應至 bookbuyer
服務的服務帳戶名稱。
除了 OSM TrafficTarget 中的來源/目的地設定以外,OSM 會繫結使用 HTTPRouteGroup 進一步定義來源可存取的第 7 層授權。 我們可以在下面的 HTTPRouteGroup 部分看到。 允許的來源服務有兩個 matches
。
apiVersion: specs.smi-spec.io/v1alpha4
kind: HTTPRouteGroup
metadata:
name: bookstore-service-routes
namespace: bookstore
spec:
matches:
- name: books-bought
pathRegex: /books-bought
methods:
- GET
headers:
- "user-agent": ".*-http-client/*.*"
- "client-app": "bookbuyer"
- name: buy-a-book
pathRegex: ".*a-book.*new"
methods:
- GET
有一個名為 books-bought
的 match
,可讓來源使用具有主機標頭使用者代理程式和用戶端應用程式資訊的 GET
方法來存取路徑 /books-bought
,以及使用 GET
方法使用 regex express 的 buy-a-book
比對於包含 .*a-book.*new
的路徑。
我們可以在 Istio AuthorizationPolicy
的規則區段中定義這些 OSM HTTPRouteGroup 設定,如下所示:
apiVersion: "security.istio.io/v1beta1"
kind: "AuthorizationPolicy"
metadata:
name: "bookstore"
namespace: bookstore
spec:
selector:
matchLabels:
app: bookstore
action: ALLOW
rules:
- from:
- source:
principals: ["cluster.local/ns/bookbuyer/sa/bookbuyer"]
- source:
namespaces: ["bookbuyer"]
to:
- operation:
methods: ["GET"]
paths: ["*/books-bought", "*/buy-a-book/new"]
- when:
- key: request.headers[User-Agent]
values: ["*-http-client/*"]
- key: request.headers[Client-App]
values: ["bookbuyer"]
我們現在可以部署 OSM 移轉的 traffic-access-v1.yaml 資訊清單,如下列 Istio 中所了解到的。 Bookthief 沒有 AuthorizationPolicy
,所以 Bookthief UI 應該停止從 Bookstore v1 遞增書籍:
kubectl apply -f - <<EOF
##################################################################################################
# bookstore policy
##################################################################################################
apiVersion: "security.istio.io/v1beta1"
kind: "AuthorizationPolicy"
metadata:
name: "bookstore"
namespace: bookstore
spec:
selector:
matchLabels:
app: bookstore
action: ALLOW
rules:
- from:
- source:
principals: ["cluster.local/ns/bookbuyer/sa/bookbuyer"]
- source:
namespaces: ["bookbuyer"]
to:
- operation:
methods: ["GET"]
paths: ["*/books-bought", "*/buy-a-book/new"]
- when:
- key: request.headers[User-Agent]
values: ["*-http-client/*"]
- key: request.headers[Client-App]
values: ["bookbuyer"]
---
##################################################################################################
# bookwarehouse policy
##################################################################################################
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: "bookwarehouse"
namespace: bookwarehouse
spec:
selector:
matchLabels:
app: bookwarehouse
action: ALLOW
rules:
- from:
- source:
principals: ["cluster.local/ns/bookstore/sa/bookstore"]
- source:
namespaces: ["bookstore"]
to:
- operation:
methods: ["POST"]
---
##################################################################################################
# mysql policy
##################################################################################################
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: "mysql"
namespace: bookwarehouse
spec:
selector:
matchLabels:
app: mysql
action: ALLOW
rules:
- from:
- source:
principals: ["cluster.local/ns/bookwarehouse/sa/bookwarehouse"]
- source:
namespaces: ["bookwarehouse"]
to:
- operation:
ports: ["3306"]
EOF
允許 Bookthief 應用程式存取 Bookstore
目前沒有 AuthorizationPolicy
允許 Bookthief 與 Bookstore 通訊。 我們可以部署下列 AuthorizationPolicy
,以允許 Bookthief 與 Bookstore 通訊。 您注意到允許 Bookthief 授權之 Bookstore 原則規則的新增。
kubectl apply -f - <<EOF
##################################################################################################
# bookstore policy
##################################################################################################
apiVersion: "security.istio.io/v1beta1"
kind: "AuthorizationPolicy"
metadata:
name: "bookstore"
namespace: bookstore
spec:
selector:
matchLabels:
app: bookstore
action: ALLOW
rules:
- from:
- source:
principals: ["cluster.local/ns/bookbuyer/sa/bookbuyer", "cluster.local/ns/bookthief/sa/bookthief"]
- source:
namespaces: ["bookbuyer", "bookthief"]
to:
- operation:
methods: ["GET"]
paths: ["*/books-bought", "*/buy-a-book/new"]
- when:
- key: request.headers[User-Agent]
values: ["*-http-client/*"]
- key: request.headers[Client-App]
values: ["bookbuyer"]
---
##################################################################################################
# bookwarehouse policy
##################################################################################################
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: "bookwarehouse"
namespace: bookwarehouse
spec:
selector:
matchLabels:
app: bookwarehouse
action: ALLOW
rules:
- from:
- source:
principals: ["cluster.local/ns/bookstore/sa/bookstore"]
- source:
namespaces: ["bookstore"]
to:
- operation:
methods: ["POST"]
---
##################################################################################################
# mysql policy
##################################################################################################
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: "mysql"
namespace: bookwarehouse
spec:
selector:
matchLabels:
app: mysql
action: ALLOW
rules:
- from:
- source:
principals: ["cluster.local/ns/bookwarehouse/sa/bookwarehouse"]
- source:
namespaces: ["bookwarehouse"]
to:
- operation:
ports: ["3306"]
EOF
Bookthief UI 現在應該從 Bookstore v1 遞增書籍。
設定兩個服務版本之間的流量轉移
示範如何平衡 Kubernetes 服務兩個版本之間的流量,稱為 Istio 中的流量轉移。 如您在上一節所述,流量轉移的 OSM 實作依賴部署的兩個不同服務,並將這些服務名稱新增至 TrafficTarget
原則的後端設定。 Istio 實作流量轉移的方式不需要此部署架構。 透過 Istio,我們可以建立多個部署,代表服務應用程式的每個版本,並透過 Istio virtualservice
設定將流量轉移至這些特定版本。
目前部署的 virtualservice
只有 Bookstore v1 版的路由規則,如下所示:
spec:
hosts:
- bookstore
http:
- route:
- destination:
host: bookstore
subset: v1
我們會更新 virtualservice
,將 100% 的加權移轉到 Bookstore v2 版本。
kubectl apply -f - <<EOF
# Create bookstore virtual service
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: bookstore-virtualservice
namespace: bookstore
spec:
hosts:
- bookstore
http:
- route:
- destination:
host: bookstore
subset: v1
weight: 0
- destination:
host: bookstore
subset: v2
weight: 100
EOF
您現在應該只會看到 bookstore
v2 服務的 bookbuyer
和 bookthief
UI 遞增。 您可以變更 weigth
屬性,在兩個 bookstore
版本之間轉移流量,以繼續實驗。
摘要
我們希望此逐步解說提供如何將您目前 OSM 原則移轉至 Istio 原則的必要指引。 花時間並檢閱 Istio 概念並逐步解說 Istio 自己的使用者入門指南,了解如何使用 Istio 服務網格來管理您的應用程式。