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
)。
流程
- 以集群管理员身份登录到 OpenShift Container Platform CLI。
在 CLI 中运行这个命令,在
openshift-operators
项目中创建名为smcp-templates
的 ConfigMap,并将<templates-directory>
替换成本地磁盘上的ServiceMeshControlPlane
文件的位置:$ oc create configmap --from-file=<templates-directory> smcp-templates -n openshift-operators
找到 Operator 集群服务版本名称。
$ oc get clusterserviceversion -n openshift-operators | grep 'Service Mesh'
输出示例
maistra.v1.0.0 Red Hat OpenShift Service Mesh 1.0.0 Succeeded
编辑 Operator 集群服务版本,指定 Operator 使用
smcp-templates
ConfigMap。$ oc edit clusterserviceversion -n openshift-operators maistra.v1.0.0
在 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 ...
- 保存更改并退出编辑器。
现在,您可以使用
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 注入的部署。
流程
要查找部署,请使用
oc get
命令。$ oc get deployment -n <namespace>
例如,若要查看
bookinfo
命名空间中 'ratings-v1' 微服务的部署文件,请使用以下命令以 YAML 格式查看资源。oc get deployment -n bookinfo ratings-v1 -o yaml
- 在编辑器中打开应用程序的部署配置 YAML 文件。
将
spec.template.metadata.annotations.sidecar.istio/inject
添加到 Deployment YAML 中,并将sidecar.istio.io/inject
设置为true
,如下例所示。bookinfo deployment-ratings-v1.yaml 中的代码片段示例
apiVersion: apps/v1 kind: Deployment metadata: name: ratings-v1 namespace: bookinfo labels: app: ratings version: v1 spec: template: metadata: annotations: sidecar.istio.io/inject: 'true'
- 保存部署配置文件。
将文件添加回包含应用程序的项目。
$ oc apply -n <namespace> -f deployment.yaml
在本例中,
bookinfo
是包含ratings-v1
应用程序和deployment-ratings-v1.yaml
的项目的名称,这是您编辑的文件。$ oc apply -n bookinfo -f deployment-ratings-v1.yaml
若要验证资源上传成功,请运行以下命令:
$ oc get deployment -n <namespace> <deploymentName> -o yaml
例如,
$ oc get deployment -n bookinfo 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)的命名空间。
流程
- 登录 OpenShift Container Platform CLI。
运行这个命令检查当前的 Mixer 策略强制状态:
$ oc get cm -n <istio-system> istio -o jsonpath='{.data.mesh}' | grep disablePolicyChecks
如果为
disablePolicyChecks: true
,编辑 Service Mesh ConfigMap:$ oc edit cm -n <istio-system> istio
-
在 ConfigMap 中找到
disablePolicyChecks: true
,把它的值改为false
。 - 保存配置并退出编辑器。
-
重新检查 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.2.3 安装。
Bookinfo 应用程序显示一本书的信息,类似于在线书店的单一目录条目。应用会显示一个页面,其中描述了图书详细信息(ISBN、页数和其他信息)以及图书的评论。
Bookinfo 应用程序由这些微服务组成:
-
productpage
微服务调用details
和reviews
微服务来产生页面信息。 -
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.2.3。
-
访问 OpenShift CLI(
oc
)。 -
具有
cluster-admin
角色的帐户。
Bookinfo 示例应用程序不能安装在 IBM Z 和 IBM Power Systems 上。
本节中的命令假设 Service Mesh control plane 项目为 istio-system
。如果在另一个命名空间中安装了 control plane,在运行前编辑每个命令。
流程
-
以具有 cluster-admin 权限的用户身份登录到 OpenShift Container Platform web 控制台。如果使用 Red Hat OpenShift Dedicated,则必须有一个具有
dedicated-admin
角色的帐户。 -
点 Home
Projects。 - 点击 Create Project。
在 Project Name 中输入
bookinfo
,输入 Display Name 及 Description,然后点 Create。或者,也可以通过 CLI 运行这个命令来创建
bookinfo
项目。$ oc new-project bookinfo
-
点 Operators
Installed Operators。 -
点 Project 菜单,使用 Service Mesh control plane 命名空间。在这个示例中,使用
istio-system
。 - 点 Red Hat OpenShift Service Mesh Operator。
点 Istio Service Mesh Member Roll 选项卡。
- 如果您已经创建了 Istio Service Mesh Member Roll,请名称,然后点击 YAML 标签来打开 YAML 编辑器。
-
如果您还没有创建
ServiceMeshMemberRoll
,点 Create ServiceMeshMemberRoll。
- 单击 Members,然后在 Value 字段中输入项目名称。
点 Create 保存更新的 Service Mesh Member Roll。
或者,将以下示例保存到 YAML 文件中。
Bookinfo ServiceMeshMemberRoll 示例 servicemeshmemberroll-default.yaml
apiVersion: maistra.io/v1 kind: ServiceMeshMemberRoll metadata: name: default spec: members: - bookinfo
运行以下命令上传该文件,并在
istio-system
命名空间中创建ServiceMeshMemberRoll
资源。在本例中,istio-system
是 Service Mesh control plane 项目的名称。$ oc create -n istio-system -f servicemeshmemberroll-default.yaml
运行以下命令,以验证
ServiceMeshMemberRoll
是否已成功创建。$ oc get smmr -n istio-system -o wide
当
STATUS
列为Configured
时,安装成功完成。NAME READY STATUS AGE MEMBERS default 1/1 Configured 70s ["bookinfo"]
在 CLI 中,通过应用
bookinfo.yaml
文件在 `bookinfo` 项目中部署 Bookinfo:$ oc apply -n bookinfo -f https://raw.githubusercontent.com/Maistra/istio/maistra-2.2/samples/bookinfo/platform/kube/bookinfo.yaml
您应该看到类似如下的输出:
service/details created serviceaccount/bookinfo-details created deployment.apps/details-v1 created service/ratings created serviceaccount/bookinfo-ratings created deployment.apps/ratings-v1 created service/reviews created serviceaccount/bookinfo-reviews created deployment.apps/reviews-v1 created deployment.apps/reviews-v2 created deployment.apps/reviews-v3 created service/productpage created serviceaccount/bookinfo-productpage created deployment.apps/productpage-v1 created
通过应用
bookinfo-gateway.yaml
文件创建入站网关 :$ oc apply -n bookinfo -f https://raw.githubusercontent.com/Maistra/istio/maistra-2.2/samples/bookinfo/networking/bookinfo-gateway.yaml
您应该看到类似如下的输出:
gateway.networking.istio.io/bookinfo-gateway created virtualservice.networking.istio.io/bookinfo created
设置
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 文件。
流程
要添加目的地规则,请运行以下命令之一:
如果没有启用 mutual TLS:
$ oc apply -n bookinfo -f https://raw.githubusercontent.com/Maistra/istio/maistra-2.2/samples/bookinfo/networking/destination-rule-all.yaml
如果启用了 nutual TLS:
$ oc apply -n bookinfo -f https://raw.githubusercontent.com/Maistra/istio/maistra-2.2/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 的步骤
- 登录 OpenShift Container Platform CLI。
验证所有 pod 是否都与此命令就绪:
$ oc get pods -n bookinfo
所有容器集的状态都应为
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
运行以下命令来检索产品页面的 URL:
echo "http://$GATEWAY_URL/productpage"
- 在网页浏览器中复制并粘贴输出以验证是否已部署了 Bookinfo 产品页面。
来自 Kiali web 控制台的步骤
获取 Kiali web 控制台的地址。
-
以具有
cluster-admin
权限的用户身份登录 OpenShift Container Platform web 控制台。如果使用 Red Hat OpenShift Dedicated,则必须有一个具有dedicated-admin
角色的帐户。 -
进入 Networking
Routes。 在 Routes 页面中,从 Namespace 菜单中选择 Service Mesh control plane 项目,如
istio-system
。Location 列显示每个路由的链接地址。
- 点 Kiali 的 Location 列中的链接。
- 单击 Log In With OpenShift。Kiali Overview 屏幕显示每个项目命名空间的标题。
-
以具有
- 在 Kiali 中,点 Graph。
- 从 Namespace 列表中选择 bookinfo,从 Graph Type 列表中选择 App graph。
从 Display 菜单中选择 Display idle nodes。
这将显示定义的节点,但尚未收到或发送请求。它可以确认应用已正确定义,但未报告任何请求流量。
- 使用 Duration 菜单增加时间段,以帮助确保捕获旧的流量。
- 使用 Refresh Rate 菜单刷新流量频率或更小,或者根本不刷新流量。
- 点 Services、Workloads 或 Istio Config 查看 bookinfo 组件列表视图,并确认它们是否正常运行。
2.8.6.4. 删除 Bookinfo 应用程序
按照以下步骤删除 Bookinfo 应用程序。
先决条件
- 安装了 OpenShift Container Platform 4.1 或更高版本。
- 安装了 Red Hat OpenShift Service Mesh 2.2.3。
-
访问 OpenShift CLI(
oc
)。
2.8.6.4.1. 删除 Bookinfo 项目
流程
- 登陆到 OpenShift Container Platform Web 控制台。
-
点 Home
Projects。 -
点
bookinfo
菜单 ,然后点 Delete Project。 在确认对话框中输入
bookinfo
,然后点 Delete。另外,您可以使用 CLI 运行这个命令来创建
bookinfo
项目。$ oc delete project bookinfo
2.8.6.4.2. 从 Service Mesh member roll 中删除 Bookinfo 项目
流程
- 登陆到 OpenShift Container Platform Web 控制台。
-
点 Operators
Installed Operators。 -
点 Project 菜单,从列表中选
istio-system
。 - 为 Red Hat OpenShift Service Mesh Operator 在 Provided APIS 下点 Istio Service Mesh Member Roll 链接。
-
点
ServiceMeshMemberRoll
菜单 并选择 Edit Service Mesh Member Roll。 编辑默认的 Service Mesh Member Roll YAML 并从 members 列表中删除
bookinfo
。另外,您可以使用 CLI 运行这个命令从
ServiceMeshMemberRoll
中删除bookinfo
项目。在本例中,istio-system
是 Service Mesh control plane 项目的名称。$ oc -n istio-system patch --type='json' smmr default -p '[{"op": "remove", "path": "/spec/members", "value":["'"bookinfo"'"]}]'
- 点 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.2.3。
- 安装过程中启用了 Jaeger 。
- 已安装 Bookinfo 示例应用程序。
流程
安装 Bookinfo 示例应用程序后,将流量发送到网格。输入以下命令几次。
$ curl "http://$GATEWAY_URL/productpage"
此命令模拟访问应用的
productpage
微服务的用户。在 OpenShift Container Platform 控制台中,进入 Networking
Routes 并搜索 Jaeger 路由,它是 Location 项下列出的 URL。 或者,使用 CLI 查询路由的详细信息:在本例中,
istio-system
是 Service Mesh control plane 命名空间:$ export JAEGER_URL=$(oc get route -n istio-system jaeger -o jsonpath='{.spec.host}')
输入以下命令来显示 Jaeger 控制台的 URL。将结果粘贴到浏览器并导航到该 URL。
echo $JAEGER_URL
- 使用与您用来访问 OpenShift Container Platform 控制台相同的用户名和密码登录。
- 在 Jaeger 仪表板左侧的窗格中,从 Service 菜单中选择 productpage.bookinfo,然后点击窗格底部的 Find Traces。此时会显示一个跟踪列表。
-
点击列表中的某个跟踪打开那个追踪的详细视图。如果您点列表中的第一个(它是最新的追踪),您会看到与
/productpage
最新刷新对应的详情。