将 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 如何配置流量策略。 以下演练不会重复当前文档,而是会在相关时引用特定主题。 在继续作之前,你应该熟悉并充分了解书店应用程序体系结构。

先决条件

OSM 示例书店应用程序中所需的修改

若要允许 Istio 管理 OSM 书籍存储应用程序,现有清单中需要进行一些更改。 这些更改与书店和 mysql 服务有关。

书店改动

在 OSM Bookstore 演示中,书店服务与另一个 bookstore-v2 服务一起部署,以演示 OSM 如何提供流量转移。 此部署的服务允许在多个服务终结点之间拆分客户端 (bookbuyer) 流量。 了解 Istio 如何处理他们所说的 交通转移的第一个新概念。

流量转移的 OSM 实现基于 SMI 流量拆分规范。 SMI 流量拆分规范要求存在多个顶级服务,这些服务作为后端添加了所需的权重指标,以便将客户端请求从一个服务转移到另一个服务。 Istio 使用虚拟服务和目标规则的组合完成流量转移。 强烈建议熟悉虚拟服务和目标规则的概念。

简单地说,Istio 虚拟服务为请求主机(服务名称)的客户端定义路由规则。 虚拟服务允许将部署的多个版本关联到一个虚拟服务主机名,以便客户端能够以此为目标。 可以为同一服务标记多个部署,表示同一主机名后面的应用程序的不同版本。 然后,可以将 Istio 虚拟服务配置为将请求加权到服务的特定版本。 服务的可用版本配置为在 Istio 目标规则中使用 subsets 属性。

对 Bookstore 服务和 Istio 部署所做的修改消除了需要有一个明确的第二个服务来面向 SMI 流量拆分所需的目标。 书店 v2 服务也不需要另一个服务帐户,因为它将在书店服务下合并。 对于 bookstore v1 和 v2,原始 OSM 流量访问 -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 演示类似,我们从新安装的书店应用程序开始。

创建命名空间

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 版本 1,即便还部署了 bookstore 版本 2。 Istio 虚拟服务仅提供到书店版本 1 的路由。 与 OSM 如何处理流量转移(流量拆分)不同,OSM 为 bookstore 版本 2 应用程序部署了另一个服务。 OSM 需要通过 TrafficSplit 将流量在客户端请求之间拆分。 使用 Istio 进行流量转移时,我们可以参考将流量转移到为同一服务标记的多个 Kubernetes 应用程序部署(版本)。

在此操作说明中,书籍存储的两个版本(v1 和 v2)将同时部署。 由于虚拟服务配置,只能访问版本 1。 无需为书店的版本 2 部署额外的服务,当我们更新书店虚拟服务并提供必要的权重属性来进行流量分流时,我们将启用到书店版本 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、服务和服务帐户

我们使用一个清单文件,其中包含在演练中讨论的修改来部署 bookbuyerbookthiefbookstorebookwarehousemysql 应用程序。

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。 目前,我们仅关注查看 bookbuyerbookthief 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 - 购书者

http://localhost:8083 - 书盗

配置 Istio 的流量策略

为了保持与原始 OSM Bookstore 演练的连续性,以便翻译到 Istio,我们将讨论 OSM 的宽松流量策略模式。 OSM 的宽松流量策略模式是允许或拒绝网格中的流量的概念,无需部署任何特定的 SMI 流量访问控制规则 。 存在宽松的流量模式配置,允许用户将应用程序载入网格,同时获得 mTLS 加密,而无需显式规则允许网格中的应用程序进行通信。 宽松的流量模式功能是避免在 OSM 管理应用程序后立即中断应用程序的通信,并提供时间来定义规则,同时确保应用程序通信经过 mTLS 加密。 此设置可以设置为 truefalse 通过 OSM 的 MeshConfig 进行设置。

Istio 以不同的方式处理 mTLS 的实施。 与 OSM 不同,Istio 的宽松模式会自动将 sidecar 代理配置为使用 mTLS,但允许该服务同时接受纯文本和 mTLS 流量。 与 OSM 的宽松模式配置等效的是利用 Istio 的PeerAuthentication 设置。 PeerAuthentication 可以在命名空间或整个网格中细粒度地进行。 有关 Istio 强制实施 mTLS 的详细信息,请阅读 Istio 相互 TLS 迁移文章

强制在 Bookstore 命名空间上实施 Istio 严格模式

请务必记住,就像 OSM 的宽松模式一样,Istio 的配置 PeerAuthentication 仅与 mTLS 强制的使用相关。 实际使用的第 7 层策略,类似于 OSM 的 HTTPRouteGroups 中使用的策略,是通过 Istio 的 AuthorizationPolicy 配置进行处理的,您可以在后续的演练中看到。

我们精细地将bookbuyerbookthiefbookstorebookwarehouse命名空间置于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 被授权与目标书店通信。 如果将服务间授权从 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

有一个match,命名为books-bought,允许源使用GET方法,并包含主机头、用户代理和客户端应用程序信息来访问路径/books-bought。并且有一个buy-a-book匹配项使用正则表达式方法匹配包含.*a-book.*new的路径,使用GET方法进行检查。

我们可以在 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 理解。 没有提供给书盗的AuthorizationPolicy,因此书盗 UI 应该停止从书店 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 应用程序访问书店

目前,没有 AuthorizationPolicy 允许书偷与书店通信。 我们可以部署以下内容 AuthorizationPolicy ,以允许书偷与书店通信。 您注意到书店政策中增加了一项允许盗书者授权的规则。

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 界面现在应从书店版本1 增加书籍。

配置两个服务版本之间的流量转移

演示如何平衡 Kubernetes 服务的两个版本之间的流量,即 Istio 中的流量转移。 在前一部分中你记得,流量转移的 OSM 实现依赖于被部署的两种独特服务,并将这些服务名称添加到策略的 TrafficTarget 后端配置中。 Istio 如何实现流量转移不需要此部署体系结构。 使用 Istio,我们可以创建多个部署,这些部署表示每个版本的服务应用程序,并通过 Istio virtualservice 配置将流量转移到这些特定版本。

在当前部署的 virtualservice 中,仅具有一个用于书店 v1 版本的路由规则如下所示:

spec:
  hosts:
    - bookstore
  http:
    - route:
        - destination:
            host: bookstore
            subset: v1

我们更新virtualservice以将100%的权重转移到书店的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

现在,您应该只看到 bookbuyerbookthief UI 正在递增,但仅限于 bookstore v2 服务。 可以通过更改 weigth 属性以在两 bookstore 个版本之间转移流量来继续试验。

概要

我们希望此演练提供了有关如何将当前 OSM 策略迁移到 Istio 策略的必要指导。 花时间查看 Istio 概念 并阅读 Istio 自己的入门指南 ,以了解如何使用 Istio 服务网格来管理您的应用程序。