1.10. 在 Red Hat OpenShift Service Mesh 上部署应用程序
当将应用程序部署到 Service Mesh 后,在 Istio 上游社区版本的应用程序的行为和在 Red Hat OpenShift Service Mesh 中的应用程序的行为有几个不同之处。
1.10.1. 先决条件
1.10.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 。
1.10.2.1. 创建 ConfigMap
按照以下步骤创建 ConfigMap。
先决条件
- 已安装并验证的 Service Mesh Operator。
-
具有
cluster-admin
角色的帐户。 - Operator 部署的位置。
-
访问 OpenShift Container Platform 命令行界面 (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
1.10.3. Red Hat OpenShift Service Mesh 的 sidecar 注入
Red Hat OpenShift Service Mesh 依靠应用程序 pod 中的 proxy sidecar 来为应用程序提供 Service Mesh 功能。您可以使用自动 sidecar 注入功能或手动管理它。红帽推荐通过注释使用自动注入功能,而不需要标记项目。这样可保证您的应用程序在部署时包含正确的 Service Mesh 配置。这个方法需要较少的权限,且不会与其他 OpenShift 功能冲突,比如 builder pod。
如果您已经标记了项目,Istio 的上游版本会默认注入 sidecar。Red Hat OpenShift Service Mesh 要求您选择为一个部署自动注入 sidecar,因此您不需要标记项目。这可避免在不需要的情况下(例如,在构建或部署 pod 中)注入 sidecar。
webhook 会检查部署到所有项目的 pod 的配置,看它们是否选择使用适当的注解注入。
1.10.3.1. 通过注解在应用程序中设置代理的环境变量
您可以通过在 injection-template.yaml
文件中的部署中添加 pod 注解,为应用程序在 sidecar 代理上设置环境变量。环境变量注入 sidecar。
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\" }"
1.10.3.2. 启用自动 sidecar 注入
在 Red Hat OpenShift Service Mesh 中部署应用程序时,需要为sidecar.istio.io/inject
注解指定一个 "true"
值来选择进行注入。这可以确保 sidecar 注入不会影响 OpenShift 的其他功能,如被 OpenShift 生态系统中的很多框架使用的 builder pod。
先决条件
- 识别要启用自动插入的部署。
- 找到应用程序的 YAML 配置文件。
流程
- 在编辑器中打开应用程序的配置 YAML 文件。
把值为
"true"
的sidecar.istio.io/inject
添加到配置 YAML 中,如下所示:休眠测试程序示例
apiVersion: apps/v1 kind: Deployment metadata: name: sleep spec: replicas: 1 template: metadata: annotations: sidecar.istio.io/inject: "true" labels: app: sleep spec: containers: - name: sleep image: tutum/curl command: ["/bin/sleep","infinity"] imagePullPolicy: IfNotPresent
- 保存配置文件。
1.10.4. 更新 Mixer 策略强制功能
在之前的 Red Hat OpenShift Service Mesh 版本中,Mixer 的策略强制功能被默认启用。现在,Mixer 的策略强制功能被默认禁用。您需要在运行策略任务前启用它。
先决条件
-
访问 OpenShift Container Platform 命令行界面 (CLI) 也称为
oc
。
流程
- 登录 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
。
1.10.4.1. 设置正确的网络策略
Service Mesh 在 control plane 和成员命名空间中创建网络策略,以允许它们之间的流量。在部署前,请考虑以下条件,以确保之前通过 OpenShift Container Platform 路由公开的网格中的服务。
- 进入网格的流量必须总是通过 ingress 网关以使 Istio 可以正常工作。
- 在没有处于任何网格的单独命名空间中为网格部署服务。
-
需要在服务网格列出的命名空间中部署的非 mesh 服务应该标记其
maistra.io/expose-route: "true"
,这可以确保 OpenShift Container Platform 路由到这些服务仍可以正常工作。
1.10.5. Bookinfo 示例应用程序
上游 Istio 项目有一个名为 Bookinfo 的示例,它由四个独立的微服务组成,用来演示各种 Istio 特性。Bookinfo 应用程序显示一本书的信息,类似于在线书店的单一目录条目。页面上显示的是对书、书目详情(ISBN 、页数以及其它信息)以及对本书的评论。
Bookinfo 应用程序由这些微服务组成:
-
productpage
微服务调用details
和reviews
微服务来产生页面信息。 -
details
微服务包括了书的信息。 -
review
微服务包括了书的评论。它同时还会调用ratings
微服务。 -
ratings
微服务包括了带有对本书的评论信息的评分信息。
reviews 微服务有三个版本:
-
版本 v1 不调用
ratings
服务。 -
版本 v2 调用
ratings
服务,并以一到五个黑色星来代表对本书的评分。 -
版本 v2 调用
ratings
服务,并以一到五个红色星来代表对本书的评分。
1.10.5.1. 安装 Bookinfo 应用程序
本教程介绍了创建 Bookinfo 项目的步骤,包括部署 Bookinfo 应用程序,以及在使用 Service Mesh 1.1.9 的 OpenShift Container Platform 上运行 Bookinfo。
您可以使用 Bookinfo 示例应用程序来测试 OpenShift Container Platform 中的 Red Hat OpenShift Service Mesh 1.1.9 安装。
红帽不提供对 Bookinfo 应用程序的支持。
先决条件
- 安装了 OpenShift Container Platform 4.1 或更高版本。
- 安装了 Red Hat OpenShift Service Mesh 1.1.9。
-
访问 OpenShift Container Platform 命令行界面 (CLI) 也称为
oc
。
Red Hat OpenShift Service Mesh 的自动注入与上游 Istio 项目不同,因此这里介绍的过程所使用的 bookinfo.yaml
文件版本已被注解为为 Red Hat OpenShift Service Mesh 启用 Istio sidecar 自动注入功能。
流程
- 以具有 cluster-admin 权限的用户身份登录到 OpenShift Container Platform web 控制台。
-
点 Home
Projects。 - 点击 Create Project。
在 Project Name 中输入
bookinfo
,输入 Display Name 及 Description,然后点 Create。或者,也可以通过 CLI 运行这个命令来创建
bookinfo
项目。$ oc new-project bookinfo
-
点 Operators
Installed Operators。 -
点击 Project 菜单,并使用 control plane 命名空间。在这个示例中,使用
istio-system
。 - 点 Red Hat OpenShift Service Mesh Operator。
点 Istio Service Mesh Member Roll 链接。
- 如果您已经创建了 Istio Service Mesh Member Roll,请名称,然后点击 YAML 标签来打开 YAML 编辑器。
如果您还没有创建 Istio Service Mesh Member Roll,请点击 Create Service Mesh Member Roll。
注意您需要 cluster-admin 权限来编辑 Istio Service Mesh Member Roll。
编辑默认的 Service Mesh Member Roll YAML 并把
bookinfo
添加到 members 列表中。apiVersion: maistra.io/v1 kind: ServiceMeshMemberRoll metadata: name: default spec: members: - bookinfo
另外,您还可以通过 CLI 运行这个命令,将
bookinfo
项目添加到ServiceMeshMemberRoll
中。用 control plane 项目的名称来替换<control_plane_project>
。$ oc -n <control_plane_project> patch --type='json' smmr default -p '[{"op": "add", "path": "/spec/members", "value":["'"bookinfo"'"]}]'
- 点 Create 保存更新的 Service Mesh Member Roll。
在 CLI 中,通过应用
bookinfo.yaml
文件在 `bookinfo` 项目中部署 Bookinfo:$ oc apply -n bookinfo -f https://raw.githubusercontent.com/Maistra/istio/maistra-1.1/samples/bookinfo/platform/kube/bookinfo.yaml
通过应用
bookinfo-gateway.yaml
文件创建入站网关 :$ oc apply -n bookinfo -f https://raw.githubusercontent.com/Maistra/istio/maistra-1.1/samples/bookinfo/networking/bookinfo-gateway.yaml
设置
GATEWAY_URL
参数的值:注意用 control plane 项目的名称来替换
<control_plane_project>
。在本例中,control plane 项目为istio-system
。$ export GATEWAY_URL=$(oc -n <control_plane_project> get route istio-ingressgateway -o jsonpath='{.spec.host}')
1.10.5.2. 添加默认目的地规则
在使用 Bookinfo 应用程序前,您必须添加默认的目的地规则。根据您是否启用了 mutual TLS 验证,预先配置两个 YAML 文件。
流程
要添加目的地规则,请运行以下命令之一:
如果没有启用 mutual TLS:
$ oc apply -n bookinfo -f https://raw.githubusercontent.com/Maistra/istio/maistra-1.1/samples/bookinfo/networking/destination-rule-all.yaml
如果启用了 nutual TLS:
$ oc apply -n bookinfo -f https://raw.githubusercontent.com/Maistra/istio/maistra-1.1/samples/bookinfo/networking/destination-rule-all-mtls.yaml
1.10.5.3. 验证 Bookinfo 安装
在配置应用程序前,请确定它已被成功部署。
先决条件
- 安装了 OpenShift Container Platform 4.1 或更高版本。
- 安装了 Red Hat OpenShift Service Mesh 1.1.9。
-
访问 OpenShift Container Platform 命令行界面 (CLI) 也称为
oc
。
流程
- 登录 OpenShift Container Platform CLI。
运行这个命令确认已部署了 Bookinfo:
$ curl -o /dev/null -s -w "%{http_code}\n" http://$GATEWAY_URL/productpage
-
另外,也可以通过在浏览器中打开
http://$GATEWAY_URL/productpage
来确认。 您还可以确认所有 pod 都可以使用这个命令:
$ oc get pods -n bookinfo
-
另外,也可以通过在浏览器中打开
1.10.5.4. 删除 Bookinfo 应用程序
按照以下步骤删除 Bookinfo 应用程序。
先决条件
- 安装了 OpenShift Container Platform 4.1 或更高版本。
- 安装了 Red Hat OpenShift Service Mesh 1.1.9。
-
访问 OpenShift Container Platform 命令行界面 (CLI) 也称为
oc
。
1.10.5.4.1. 删除 Bookinfo 项目
流程
- 登陆到 OpenShift Container Platform Web 控制台。
-
点 Home
Projects。 -
点击
bookinfo
菜单 ,然后点击 Delete Project。 在确认对话框中输入
bookinfo
,然后点 Delete。或者,也可以通过 CLI 运行这个命令来创建
bookinfo
项目。$ oc delete project bookinfo
1.10.5.4.2. 从 Service Mesh member roll 中删除 Bookinfo 项目
流程
- 登陆到 OpenShift Container Platform Web 控制台。
-
点 Operators
Installed Operators。 -
点 Project 菜单,从列表中选择
openshift-operators
。 - 为 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
项目。用 control plane 项目的名称来替换<control_plane_project>
。$ oc -n <control_plane_project> patch --type='json' smmr default -p '[{"op": "remove", "path": "/spec/members", "value":["'"bookinfo"'"]}]'
- 点 Save 更新 Service Mesh Member Roll。
1.10.6. 生成追踪示例并分析 trace 数据
Jaeger 是一个开源分布式追踪系统。您可以使用 Jaeger 监控基于微服务的分布式系统并进行故障排除。使用 Jaeger ,您可以执行一个追踪(trace),该 trace 会追踪一个请求在组成应用程序的各种微服务间执行的路径。默认安装 Jaeger 作为 Service Mesh 的一部分。
本教程使用 Service Mesh 和 bookinfo 指南来演示如何使用 Jaeger 来执行分布式追踪。
您可以使用 Bookinfo 示例应用程序来测试 OpenShift Container Platform 中的 Red Hat OpenShift Service Mesh 1.1.9 安装。
红帽不提供对 Bookinfo 应用程序的支持。
本教程使用 Service Mesh 和 Bookinfo 指南来演示如何使用 Red Hat OpenShift Service Mesh 的 Jaeger 组件来执行追踪。
先决条件
- 安装了 OpenShift Container Platform 4.1 或更高版本。
- 安装了 Red Hat OpenShift Service Mesh 1.1.9。
- 安装过程中启用了 Jaeger 。
- 已安装 Bookinfo 示例应用程序。
流程
- 在部署了 Bookinfo 应用程序后,您需要生成对 Bookinfo 应用程序的调用,以便获得一些要分析的追踪数据。访问 http://<GATEWAY_URL>/productpage ,刷新该页面几次以生成一些跟踪数据。
安装过程会创建路由来访问 Jaeger 控制台。
-
在 OpenShift Container Platform 控制台中,进入 Networking
Routes 并搜索 Jaeger 路由,它是 Location 项下列出的 URL。 使用 CLI 查询路由详情:
$ export JAEGER_URL=$(oc get route -n bookinfo jaeger-query -o jsonpath='{.spec.host}')
-
在 OpenShift Container Platform 控制台中,进入 Networking
-
启动浏览器并访问
https://<JAEGER_URL>
。 - 如有必要,使用与您用来访问 OpenShift Container Platform 控制台相同的用户名和密码登录。
在 Jaeger dashboard 左侧的 dashboard 中,从 Service 菜单中选择 "productpage" 并点击面板底部的 Find Traces 按钮。此时会显示一个跟踪列表,如下所示:
点击列表中的某个跟踪打开那个追踪的详细视图。如果点击顶部(最新)追踪,您会看到与最新刷新
'/productpage
所对应的详细信息。上图中的 trace 由几个嵌套的 spans 组成,每个 spans 对应一个 Bookinfo Service 调用,它们都是针对
'/productpage
请求执行的。总的处理时间是 2.62s,details Service 为 3.56ms,reviews Service 使用了 2.6s,ratings Service 使用了 5.32ms。每个远程服务调用都由客户端和服务器端的 span 代表。例如,details 客户端 span 被标记为productpage details.myproject.svc.cluster.local:9080
。在它下面嵌套的标记为details.myproject.svc.cluster.local:9080
的 span 与服务器端的请求相对应。该 trace 还显示对 istio-policy 的调用,它反映了 Istio 的验证检查。