2.8. 在 Service Mesh 上部署应用程序

警告

查看不再支持的 Red Hat OpenShift Service Mesh 发行版本的文档。

Service Mesh 版本 1.0 和 1.1 control plane 不再被支持。有关升级服务网格 control plane 的详情,请参阅 升级 Service Mesh

有关特定 Red Hat OpenShift Service Mesh 发行版本的支持状态的信息,请参阅产品生命周期页面

当将应用程序部署到 Service Mesh 后,在 Istio 上游社区版本的应用程序的行为和在 Red Hat OpenShift Service Mesh 中的应用程序的行为有几个不同之处。

2.8.1. 前提条件

2.8.2. 创建 control plane 模板

您可以使用 ServiceMeshControlPlane 模板生成可重复使用的配置。用户可根据自己的配置对创建的模板进行扩展。模板也可以从其他模板继承配置信息。例如,您可以为财务团队创建一个财务 control plane,为市场团队创建一个市场 control plane。如果您创建了一个开发模板和一个产品模板,则市场团队成员和财务团队成员就可以根据自己团队的情况对开发模板和产品模板进行扩展。

当配置 control plane 模板(与 ServiceMeshControlPlane 语法相同)时,用户以分级方式继承设置。Operator 附带一个具有 Red Hat OpenShift Service Mesh 默认设置的 default 模板 。要添加自定义模板,您必须在 openshift-operators 项目中创建一个名为 smcp-templates 的 ConfigMap,并在 Operator 容器的 /usr/local/share/istio-operator/templates中挂载 ConfigMap 。

2.8.2.1. 创建 ConfigMap

按照以下步骤创建 ConfigMap。

前提条件

  • 已安装并验证的 Service Mesh Operator。
  • 具有 cluster-admin 角色的帐户。
  • Operator 部署的位置。
  • 访问 OpenShift CLI(oc)。

流程

  1. 以集群管理员身份登录到 OpenShift Container Platform CLI。
  2. 在 CLI 中运行这个命令,在 openshift-operators 项目中创建名为smcp-templates 的 ConfigMap,并将 <templates-directory> 替换成本地磁盘上的ServiceMeshControlPlane 文件的位置:

    $ oc create configmap --from-file=<templates-directory> smcp-templates -n openshift-operators
  3. 找到 Operator 集群服务版本名称。

    $ oc get clusterserviceversion -n openshift-operators | grep 'Service Mesh'

    输出示例

    maistra.v1.0.0            Red Hat OpenShift Service Mesh   1.0.0                Succeeded

  4. 编辑 Operator 集群服务版本,指定 Operator 使用 smcp-templates ConfigMap。

    $ oc edit clusterserviceversion -n openshift-operators maistra.v1.0.0
  5. 在 Operator 部署中添加卷挂载和卷。

    deployments:
      - name: istio-operator
        spec:
          template:
            spec:
              containers:
                volumeMounts:
                  - name: discovery-cache
                    mountPath: /home/istio-operator/.kube/cache/discovery
                  - name: smcp-templates
                    mountPath: /usr/local/share/istio-operator/templates/
              volumes:
                - name: discovery-cache
                  emptyDir:
                    medium: Memory
                - name: smcp-templates
                  configMap:
                    name: smcp-templates
    ...
  6. 保存更改并退出编辑器。
  7. 现在,您可以使用 ServiceMeshControlPlane 中的 template 参数来指定模板。

    apiVersion: maistra.io/v1
    kind: ServiceMeshControlPlane
    metadata:
      name: minimal-install
    spec:
      template: default

2.8.3. 启用自动 sidecar 注入

在部署应用程序时,您必须通过将 spec.template.metadata.annotations 中的 spec.template.metadata.annotations 中的注解 sidecar.istio.io/inject 配置为 true 来选择 注入。选择确保 sidecar 注入不会影响 OpenShift Container Platform 的其他功能,如 OpenShift Container Platform 生态系统中的多个框架使用的 builder pod。

先决条件

  • 识别作为服务网格一部分的命名空间,以及需要自动 sidecar 注入的部署。

流程

  1. 要查找部署,请使用 oc get 命令。

    $ oc get deployment -n <namespace>

    例如,若要查看 info 命名空间中 'ratings-v1' 微服务的部署文件,请使用以下命令以 YAML 格式查看资源:

    oc get deployment -n info ratings-v1 -o yaml
  2. 在编辑器中打开应用程序的部署配置 YAML 文件。
  3. spec.template.metadata.annotations.sidecar.istio/inject 添加到 Deployment YAML 中,并将 sidecar.istio.io/inject 设置为 true,如下例所示。

    info deployment-ratings-v1.yaml 中的代码片段示例

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: ratings-v1
      namespace: info
      labels:
        app: ratings
        version: v1
    spec:
      template:
        metadata:
          annotations:
            sidecar.istio.io/inject: 'true'

  4. 保存部署配置文件。
  5. 将文件添加回包含应用程序的项目。

    $ oc apply -n <namespace> -f deployment.yaml

    在本例中,info 是包含 ratings-v1 应用程序和 deployment-ratings-v1.yaml 的项目的名称,这是您编辑的文件。

    $ oc apply -n info -f deployment-ratings-v1.yaml
  6. 若要验证资源上传成功,请运行以下命令:

    $ oc get deployment -n <namespace> <deploymentName> -o yaml

    例如,

    $ oc get deployment -n info ratings-v1 -o yaml

2.8.4. 通过注解设置代理环境变量

Envoy sidecar 代理的配置由 ServiceMeshControlPlane 管理。

您可以通过在 injection-template.yaml 文件中的部署中添加 pod 注解来为应用程序设置 sidecar 代理的环境变量。环境变量注入 sidecar。

injection-template.yaml 示例

apiVersion: apps/v1
kind: Deployment
metadata:
  name: resource
spec:
  replicas: 7
  selector:
    matchLabels:
      app: resource
  template:
    metadata:
      annotations:
        sidecar.maistra.io/proxyEnv: "{ \"maistra_test_env\": \"env_value\", \"maistra_test_env_2\": \"env_value_2\" }"

警告

在创建自己的自定义资源时,您绝不应包含 maistra.io/ 标签和注解。这些标签和注解表示资源由 Operator 生成和管理。如果您在创建自己的资源时从 Operator 生成的资源复制内容,请不要包含以 maistra.io/ 开头的标签或注解。在下一个协调过程中,Operator 将覆盖或删除这些标签或注解的资源。

2.8.5. 更新 Mixer 策略强制功能

在之前的 Red Hat OpenShift Service Mesh 版本中,Mixer 的策略强制功能被默认启用。现在,Mixer 的策略强制功能被默认禁用。您需要在运行策略任务前启用它。

前提条件

  • 访问 OpenShift CLI(oc)。
注意

示例使用 <istio-system> 作为 control plane 命名空间。将这个值替换为部署 Service Mesh Control Plane(SMCP)的命名空间。

流程

  1. 登录 OpenShift Container Platform CLI。
  2. 运行这个命令检查当前的 Mixer 策略强制状态:

    $ oc get cm -n <istio-system> istio -o jsonpath='{.data.mesh}' | grep disablePolicyChecks
  3. 如果为 disablePolicyChecks: true,编辑 Service Mesh ConfigMap:

    $ oc edit cm -n <istio-system> istio
  4. 在 ConfigMap 中找到 disablePolicyChecks: true,把它的值改为 false
  5. 保存配置并退出编辑器。
  6. 重新检查 Mixer 策略强制状态以确保其已被设置为 false

2.8.5.1. 设置正确的网络策略

Service Mesh 在 Service Mesh control plane 和成员命名空间中创建网络策略,以允许它们之间的流量。在部署前,请考虑以下条件,以确保之前通过 OpenShift Container Platform 路由公开的服务网格中的服务。

  • 进入服务网格的流量必须总是经过 ingress-gateway 才能使 Istio 正常工作。
  • 在不在任何服务网格中的独立命名空间中为服务网格部署服务。
  • 需要在服务网格列出的命名空间中部署的非 mesh 服务应该标记其 maistra.io/expose-route: "true",这可以确保 OpenShift Container Platform 路由到这些服务仍可以正常工作。

2.8.6. Bookinfo 示例应用程序

您可以使用 Bookinfo 示例应用程序来测试 OpenShift Container Platform 中的 Red Hat OpenShift Service Mesh 2.3.2 安装。

Bookinfo 应用程序显示一本书的信息,类似于在线书店的单一目录条目。应用会显示一个页面,其中描述了图书详细信息(ISBN、页数和其他信息)以及图书的评论。

Bookinfo 应用程序由这些微服务组成:

  • productpage 微服务调用 detailsreviews 微服务来产生页面信息。
  • details 微服务包括了书的信息。
  • review 微服务包括了书的评论。它同时还会调用 ratings 微服务。
  • ratings微服务包括了带有对本书的评论信息的评分信息。

reviews 微服务有三个版本:

  • 版本 v1 不调用 ratings 服务。
  • 版本 v2 调用 ratings 服务,并以一到五个黑色星来代表对本书的评分。
  • 版本 v3 调用 ratings 服务,并以一到五个红色星来代表对本书的评分。

2.8.6.1. 安装 Bookinfo 应用程序

本教程介绍了如何创建项目、将 Bookinfo 应用程序部署到该项目并在 Service Mesh 中查看正在运行的应用程序来创建示例应用程序。

先决条件

  • 安装了 OpenShift Container Platform 4.1 或更高版本。
  • 安装了 Red Hat OpenShift Service Mesh 2.3.2。
  • 访问 OpenShift CLI(oc)。
  • 具有 cluster-admin 角色的帐户。
注意

Bookinfo 示例应用程序不能安装在 IBM Z 和 IBM Power Systems 上。

注意

本节中的命令假设 Service Mesh control plane 项目为 istio-system。如果在另一个命名空间中安装了 control plane,在运行前编辑每个命令。

流程

  1. 以具有 cluster-admin 权限的用户身份登录到 OpenShift Container Platform web 控制台。如果使用 Red Hat OpenShift Dedicated,则必须有一个具有 dedicated-admin 角色的帐户。
  2. HomeProjects
  3. 点击 Create Project
  4. Project Name 中输入 info,输入 Display NameDescription,然后点 Create

    • 或者,也可以通过 CLI 运行这个命令来创建 info 项目。

      $ oc new-project info
  5. OperatorsInstalled Operators
  6. Project 菜单,使用 Service Mesh control plane 命名空间。在这个示例中,使用 istio-system
  7. Red Hat OpenShift Service Mesh Operator。
  8. Istio Service Mesh Member Roll 选项卡。

    1. 如果您已经创建了 Istio Service Mesh Member Roll,请名称,然后点击 YAML 标签来打开 YAML 编辑器。
    2. 如果您还没有创建 ServiceMeshMemberRoll,点 Create ServiceMeshMemberRoll
  9. 单击 Members,然后在 Value 字段中输入项目名称。
  10. Create 保存更新的 Service Mesh Member Roll。

    1. 或者,将以下示例保存到 YAML 文件中。

      Bookinfo ServiceMeshMemberRoll 示例 servicemeshmemberroll-default.yaml

      apiVersion: maistra.io/v1
      kind: ServiceMeshMemberRoll
      metadata:
        name: default
      spec:
        members:
        - info

    2. 运行以下命令上传该文件,并在 istio-system 命名空间中创建 ServiceMeshMemberRoll 资源。在本例中,istio-system 是 Service Mesh control plane 项目的名称。

      $ oc create -n istio-system -f servicemeshmemberroll-default.yaml
  11. 运行以下命令,以验证 ServiceMeshMemberRoll 是否已成功创建。

    $ oc get smmr -n istio-system -o wide

    STATUS 列为 Configured 时,安装成功完成。

    NAME      READY   STATUS       AGE   MEMBERS
    default   1/1     Configured   70s   ["info"]
  12. 在 CLI 中,通过应用 bookinfo.yaml 文件在 `info` 项目中部署 Bookinfo:

    $ oc apply -n info -f https://raw.githubusercontent.com/Maistra/istio/maistra-2.3/samples/bookinfo/platform/kube/bookinfo.yaml

    您应该看到类似如下的输出:

    service/details created
    serviceaccount/info-details created
    deployment.apps/details-v1 created
    service/ratings created
    serviceaccount/info-ratings created
    deployment.apps/ratings-v1 created
    service/reviews created
    serviceaccount/info-reviews created
    deployment.apps/reviews-v1 created
    deployment.apps/reviews-v2 created
    deployment.apps/reviews-v3 created
    service/productpage created
    serviceaccount/info-productpage created
    deployment.apps/productpage-v1 created
  13. 通过应用 info-gateway.yaml 文件创建入站网关 :

    $ oc apply -n info -f https://raw.githubusercontent.com/Maistra/istio/maistra-2.3/samples/bookinfo/networking/bookinfo-gateway.yaml

    您应该看到类似如下的输出:

    gateway.networking.istio.io/info-gateway created
    virtualservice.networking.istio.io/info created
  14. 设置 GATEWAY_URL 参数的值:

    $ export GATEWAY_URL=$(oc -n istio-system get route istio-ingressgateway -o jsonpath='{.spec.host}')

2.8.6.2. 添加默认目的地规则

在使用 Bookinfo 应用程序前,您必须首先添加默认目的地规则。根据您是否启用了 mutual TLS 验证,预先配置两个 YAML 文件。

流程

  1. 要添加目的地规则,请运行以下命令之一:

    • 如果没有启用 mutual TLS:

      $ oc apply -n info -f https://raw.githubusercontent.com/Maistra/istio/maistra-2.3/samples/bookinfo/networking/destination-rule-all.yaml
    • 如果启用了 nutual TLS:

      $ oc apply -n info -f https://raw.githubusercontent.com/Maistra/istio/maistra-2.3/samples/bookinfo/networking/destination-rule-all-mtls.yaml

      您应该看到类似如下的输出:

      destinationrule.networking.istio.io/productpage created
      destinationrule.networking.istio.io/reviews created
      destinationrule.networking.istio.io/ratings created
      destinationrule.networking.istio.io/details created

2.8.6.3. 验证 Bookinfo 安装

要确认示例 Bookinfo 应用程序已被成功部署,请执行以下步骤。

前提条件

  • 安装了 Red Hat OpenShift Service Mesh。
  • 完成安装 Bookinfo 示例应用程序的步骤。

通过 CLI 的步骤

  1. 登录 OpenShift Container Platform CLI。
  2. 验证所有 pod 是否都与此命令就绪:

    $ oc get pods -n info

    所有容器集的状态都应为 Running。您应该看到类似如下的输出:

    NAME                              READY   STATUS    RESTARTS   AGE
    details-v1-55b869668-jh7hb        2/2     Running   0          12m
    productpage-v1-6fc77ff794-nsl8r   2/2     Running   0          12m
    ratings-v1-7d7d8d8b56-55scn       2/2     Running   0          12m
    reviews-v1-868597db96-bdxgq       2/2     Running   0          12m
    reviews-v2-5b64f47978-cvssp       2/2     Running   0          12m
    reviews-v3-6dfd49b55b-vcwpf       2/2     Running   0          12m
  3. 运行以下命令来检索产品页面的 URL:

    echo "http://$GATEWAY_URL/productpage"
  4. 在网页浏览器中复制并粘贴输出以验证是否已部署了 Bookinfo 产品页面。

来自 Kiali web 控制台的步骤

  1. 获取 Kiali web 控制台的地址。

    1. 以具有 cluster-admin 权限的用户身份登录 OpenShift Container Platform web 控制台。如果使用 Red Hat OpenShift Dedicated,则必须有一个具有 dedicated-admin 角色的帐户。
    2. 进入 NetworkingRoutes
    3. Routes 页面中,从 Namespace 菜单中选择 Service Mesh control plane 项目,如 istio-system

      Location 列显示每个路由的链接地址。

    4. 点 Kiali 的 Location 列中的链接。
    5. 单击 Log In With OpenShift。Kiali Overview 屏幕显示每个项目命名空间的标题。
  2. 在 Kiali 中,点 Graph
  3. Namespace 列表中选择 info,从 Graph Type 列表中选择 App graph。
  4. Display 菜单中选择 Display idle nodes

    这将显示定义的节点,但尚未收到或发送请求。它可以确认应用已正确定义,但未报告任何请求流量。

    Kiali 显示 info 应用程序
    • 使用 Duration 菜单增加时间段,以帮助确保捕获旧的流量。
    • 使用 Refresh Rate 菜单刷新流量频率或更小,或者根本不刷新流量。
  5. ServicesWorkloadsIstio Config 查看 info 组件的列表视图,并确认它们健康。

2.8.6.4. 删除 Bookinfo 应用程序

按照以下步骤删除 Bookinfo 应用程序。

先决条件

  • 安装了 OpenShift Container Platform 4.1 或更高版本。
  • 安装了 Red Hat OpenShift Service Mesh 2.3.2。
  • 访问 OpenShift CLI(oc)。
2.8.6.4.1. 删除 Bookinfo 项目

流程

  1. 登陆到 OpenShift Container Platform Web 控制台。
  2. HomeProjects
  3. info 菜单 kebab ,然后点 Delete Project
  4. 在确认对话框中键入 info,然后点 Delete

    • 或者,您可以使用 CLI 运行这个命令来创建 info 项目。

      $ oc delete project info
2.8.6.4.2. 从 Service Mesh member roll 中删除 Bookinfo 项目

流程

  1. 登陆到 OpenShift Container Platform Web 控制台。
  2. OperatorsInstalled Operators
  3. Project 菜单,从列表中选 istio-system
  4. Red Hat OpenShift Service Mesh Operator 在 Provided APIS 下点 Istio Service Mesh Member Roll 链接。
  5. ServiceMeshMemberRoll 菜单 kebab 并选择 Edit Service Mesh Member Roll
  6. 编辑默认的 Service Mesh Member Roll YAML 并从 members 列表中删除 info

    • 或者,您可以使用 CLI 运行这个命令从 ServiceMeshMemberRoll 中删除 info 项目。在本例中,istio-system 是 Service Mesh control plane 项目的名称。

      $ oc -n istio-system patch --type='json' smmr default -p '[{"op": "remove", "path": "/spec/members", "value":["'"info"'"]}]'
  7. Save 更新 Service Mesh Member Roll。

2.8.7. 生成追踪示例并分析 trace 数据

Jaeger 是一个开源分布式追踪系统。使用 Jaeger,您可以在组成一个应用程序的各种微服务间执行遵循请求路径的 trace。默认安装 Jaeger 作为 Service Mesh 的一部分。

本教程使用 Service Mesh 和 Bookinfo 示例应用程序来演示如何使用 Jaeger 执行分布式追踪。

先决条件

  • 安装了 OpenShift Container Platform 4.1 或更高版本。
  • 安装了 Red Hat OpenShift Service Mesh 2.3.2。
  • 安装过程中启用了 Jaeger 。
  • 已安装 Bookinfo 示例应用程序。

流程

  1. 安装 Bookinfo 示例应用程序后,将流量发送到网格。输入以下命令几次。

    $ curl "http://$GATEWAY_URL/productpage"

    此命令模拟访问应用的 productpage 微服务的用户。

  2. 在 OpenShift Container Platform 控制台中,进入 NetworkingRoutes 并搜索 Jaeger 路由,它是 Location 项下列出的 URL。

    • 或者,使用 CLI 查询路由的详细信息:在本例中,istio-system 是 Service Mesh control plane 命名空间:

      $ export JAEGER_URL=$(oc get route -n istio-system jaeger -o jsonpath='{.spec.host}')
      1. 输入以下命令来显示 Jaeger 控制台的 URL。将结果粘贴到浏览器并导航到该 URL。

        echo $JAEGER_URL
  3. 使用与您用来访问 OpenShift Container Platform 控制台相同的用户名和密码登录。
  4. 在 Jaeger 仪表板左侧的窗格中,从 Service 菜单中选择 productpage.info,然后点击窗格底部的 Find Traces。此时会显示一个跟踪列表。
  5. 点击列表中的某个跟踪打开那个追踪的详细视图。如果您点列表中的第一个(它是最新的追踪),您会看到与 /productpage 最新刷新对应的详情。