你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
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 服务下。 下面的“创建 Pod、服务和服务帐户”部分显示了对 bookstore v1 和 v2 的 Istio 进行的原始 OSM traffic-access-v1.yaml 清单修改。 我们将演示如何进行流量拆分,在之后的演示中我们将使用“流量转移”一词:
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 sidecar 注入添加命名空间标签
如果使用的是 OSM,使用命令 osm namespace add <namespace>
创建对命名空间的注释,供 OSM 控制器添加自动 sidecar 注入。 使用 Istio 时,只需标记命名空间,即可指示 Istio 控制器自动注入 Envoy sidecar 代理。
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 的宽松模式会自动将 sidecar 代理配置为使用 mTLS,但允许服务同时接受纯文本和 mTLS 流量。 利用 Istio 的 PeerAuthentication
设置与 OSM 的宽松模式配置效果相同。 可以在命名空间或是整个网格精细地完成 PeerAuthentication
。 有关 Istio 强制进行 mTLS 加密的更多信息,请参阅 Istio 相互 TLS 迁移一文。
在 Bookstore 命名空间上强制实施 Istio 严格模式
请切记,就像 OSM 的宽松模式一样,Istio 的 PeerAuthentication
配置仅与强制使用 mTLS 加密相关。 与 OSM 的 HTTPRouteGroups 所使用的策略十分类似,我们使用稍后会在教程中看到的 Istio 的 AuthorizationPolicy 配置来处理实际的第 7 层策略。
我们将 bookbuyer
、bookthief
、bookstore
和 bookwarehouse
命名空间精细地地置于 Istio 的 mTLS 严格模式之下。
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 策略。具体而言,该策略仅允许 bookbuyer
使用某些第 7 层路径、标头和方法与其进行通信。 以下是 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
。另一个则是 buy-a-book
匹配,为包含 使用 GET
方法的 .*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"]
接下来,我们可以如下按照 Istio 理解的方式部署 OSM 迁移的 traffic-access-v1.yaml 清单。 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 进行通信。 你注意到,为 bookstore 策略增加的策略允许 bookthief 授权。
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 服务网格管理应用程序。