你当前正在访问 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 应用程序体系结构。

先决条件

需要对 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 需要 targetPortappProtocol 属性。 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、服务和服务帐户

我们使用包含之前在教程中介绍的修改的单个清单文件来部署 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 - bookbuyer

http://localhost:8083 - bookthief

配置 Istio 的流量策略

为了保持原始 OSM Bookstore 教程的连续性,转换到 Istio,我们将介绍 OSM 的宽松流量策略模式。 OSM 的宽松流量策略模式是指,在未部署任何具体 SMI 流量访问控制规则的情况下,允许或拒绝网格中的流量。 宽松流量模式配置的作用是允许用户将应用程序加入到网格中,同时获得 mTLS 加密,而无需明确的规则来允许网格中的应用程序进行通信。 宽松流量模式这一功能旨在避免当 OSM 管理应用程序后,应用程序出现通信中断,并提供时间制定规则,同时确保应用程序通信经过 mTLS 加密。 可以通过 OSM 的 MeshConfig 将此设置设置为 truefalse

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 层策略。

我们将 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 与目标 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-boughtmatch,允许源使用带有主机头用户-代理和客户端-应用信息的 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 服务的 bookbuyerbookthief UI 在递增。 可以通过将 weigth 属性更改为转移两个 bookstore 版本之间的流量来继续进行试验。

总结

我们希望本教程提供了必要的指导准则,让你了解了如何将当前的 OSM 策略迁移到 Istio 策略。 请花点时间查看 Istio 概念和教程《Istio 入门指南》,了解如何使用 Istio 服务网格管理应用程序。