mirror of https://github.com/istio/istio.io.git
[zh] improve add-istio add-new-microservice-version bookinfo-kubernetes (#13347)
Signed-off-by: xin.li <xin.li@daocloud.io>
This commit is contained in:
parent
46953ce7c0
commit
21a7019554
|
@ -9,7 +9,10 @@ test: no
|
|||
|
||||
正如您在上一个模块所见,Istio 通过增强 Kubernetes 功能,让您能更高效的操作微服务。
|
||||
|
||||
在这个模块中,您可以在 `productpage` 微服务中,启用Istio。这个应用的其他部分会继续照原样运行。注意您可以一个微服务一个微服务的逐步启用 Istio。启用 Istio 在微服务中是无侵入的,您不用修改微服务代码或者破坏您的应用,它也能够持续运行并且为用户请求服务。
|
||||
在这个模块中,您可以在 `productpage` 微服务中,启用 Istio。
|
||||
这个应用的其他部分会继续照原样运行。注意您可以一个微服务一个微服务的逐步启用 Istio。
|
||||
启用 Istio 在微服务中是无侵入的,您不用修改微服务代码或者破坏您的应用,
|
||||
它也能够持续运行并且为用户请求服务。
|
||||
|
||||
1. 应用默认目标规则:
|
||||
|
||||
|
@ -20,7 +23,9 @@ test: no
|
|||
1. 重新部署 `productpage` 微服务,启用 Istio:
|
||||
|
||||
{{< tip >}}
|
||||
本教程为了教学目的将会逐步演示如何手动注入 Sidecar 启用 Istio,但是 [自动注入 Sidecar](/zh/docs/setup/additional-setup/sidecar-injection/#automatic-sidecar-injection) 更加便捷。
|
||||
本教程为了教学目的将会逐步演示如何手动注入 Sidecar 启用 Istio,
|
||||
但是[自动注入 Sidecar](/zh/docs/setup/additional-setup/sidecar-injection/#automatic-sidecar-injection)
|
||||
更加便捷。
|
||||
{{< /tip >}}
|
||||
|
||||
{{< text bash >}}
|
||||
|
@ -30,7 +35,8 @@ test: no
|
|||
|
||||
1. 进入应用的网页去验证应用是否在工作。Istio 是在没有改变原应用代码的情况下添加的。
|
||||
|
||||
1. 检查 `productpage` 的 Pod 并且查看每个副本的两个容器。第一个容器是微服务本身的,第二个是连接到它的 Sidecar 代理:
|
||||
1. 检查 `productpage` 的 Pod 并且查看每个副本的两个容器。第一个容器是微服务本身的,
|
||||
第二个是连接到它的 Sidecar 代理:
|
||||
|
||||
{{< text bash >}}
|
||||
$ kubectl get pods
|
||||
|
@ -49,9 +55,11 @@ test: no
|
|||
sleep-88ddbcfdd-cc85s 1/1 Running 0 7h
|
||||
{{< /text >}}
|
||||
|
||||
1. Kubernetes 采取无侵入的和逐步的 [滚动更新](https://kubernetes.io/zh-cn/docs/tutorials/kubernetes-basics/update/update-intro/) 方式用启用 Istio 的 Pod 替换了原有的 Pod。
|
||||
Kubernetes 只有在新的 Pod 开始运行的时候才会终止老的 Pod,它透明地将流量一个一个地切换到新的 Pod 上。
|
||||
也就是说,它不会在声明一个新的 Pod 之前结束一个或者以上的 Pod。这些操作都是为了防止破坏您的应用,因此在注入 Istio 的过程中应用能够持续工作。
|
||||
1. Kubernetes 采取无侵入的和逐步的[滚动更新](https://kubernetes.io/zh-cn/docs/tutorials/kubernetes-basics/update/update-intro/)
|
||||
方式用启用 Istio 的 Pod 替换了原有的 Pod。Kubernetes 只有在新的 Pod
|
||||
开始运行的时候才会终止老的 Pod, 它透明地将流量一个一个地切换到新的 Pod 上。
|
||||
也就是说,它不会在声明一个新的 Pod 之前结束一个或者以上的 Pod。
|
||||
这些操作都是为了防止破坏您的应用,因此在注入 Istio 的过程中应用能够持续工作。
|
||||
|
||||
1. 检查 `productpage` Istio Sidecar 的日志:
|
||||
|
||||
|
@ -70,7 +78,8 @@ Kubernetes 只有在新的 Pod 开始运行的时候才会终止老的 Pod,它
|
|||
tutorial
|
||||
{{< /text >}}
|
||||
|
||||
1. 检查 Istio 仪表盘,通过自定义的 URL, 它配置在[您之前配置](/zh/docs/examples/microservices-istio/bookinfo-kubernetes/#update-your-etc-hosts-configuration-file)的 `/etc/hosts` 文件中:
|
||||
1. 检查 Istio 仪表盘,通过自定义的 URL,它配置在[您之前配置](/zh/docs/examples/microservices-istio/bookinfo-kubernetes/#update-your-etc-hosts-configuration-file)的
|
||||
`/etc/hosts` 文件中:
|
||||
|
||||
{{< text plain >}}
|
||||
http://my-istio-dashboard.io/dashboard/db/istio-mesh-dashboard
|
||||
|
@ -97,15 +106,17 @@ Kubernetes 只有在新的 Pod 开始运行的时候才会终止老的 Pod,它
|
|||
caption="Istio Service Dashboard, `productpage` selected"
|
||||
>}}
|
||||
|
||||
向下滚动到 _Service Workloads_ 部分。观察到仪表盘图表已经更新。
|
||||
向下滚动到 **Service Workloads** 部分。观察到仪表盘图表已经更新。
|
||||
|
||||
{{< image width="80%"
|
||||
link="dashboard-service.png"
|
||||
caption="Istio Service Dashboard"
|
||||
>}}
|
||||
|
||||
这是在一个微服务中应用 Istio 的直接优点,您可以收到进出微服务的流量日志,包括时间、HTTP 方法、路径和响应代码。您可以用 Istio 仪表盘监控您的微服务。
|
||||
这是在一个微服务中应用 Istio 的直接优点,您可以收到进出微服务的流量日志,
|
||||
包括时间、HTTP 方法、路径和响应代码。您可以用 Istio 仪表盘监控您的微服务。
|
||||
|
||||
在下一个模块,您将会学习到关于 Istio 可以为您的应用提供的功能。当 Istio 的功能对微服务是有益的时候,您将学习如何在整个应用程序上使用 Istio 来实现其全部潜力。
|
||||
在下一个模块,您将会学习到关于 Istio 可以为您的应用提供的功能。当 Istio
|
||||
的功能对微服务是有益的时候,您将学习如何在整个应用程序上使用 Istio 来实现其全部潜力。
|
||||
|
||||
您已经准备好[所有微服务上启用 Istio](/zh/docs/examples/microservices-istio/enable-istio-all-microservices)。
|
||||
|
|
|
@ -11,8 +11,9 @@ test: no
|
|||
在此模块中,您将部署 reviews 服务的一个新版本 v2,该服务将返回审阅人员提供的评分星级和评级颜色。
|
||||
在实际场景中,在部署之前,您将在模拟环境中执行静态分析测试、单元测试、集成测试、端到端测试和验证。
|
||||
|
||||
1. 部署 `reviews` 不带 `app=reviews` 标签的新版本微服务。没有此标签,将不会选择新版本 `reviews` 来提供服务。
|
||||
因此,生产代码不会调用它。 运行以下命令部署 `reviews` 微服务的版本 2,再更换标签 `app=reviews` 为 `app=reviews_test`:
|
||||
1. 部署 `reviews` 不带 `app=reviews` 标签的新版本微服务。没有此标签,
|
||||
将不会选择新版本 `reviews` 来提供服务。因此,生产代码不会调用它。 运行以下命令部署 `reviews`
|
||||
微服务的版本 2,再更换标签 `app=reviews` 为 `app=reviews_test`:
|
||||
|
||||
{{< text bash >}}
|
||||
$ curl -s {{< github_file >}}/samples/bookinfo/platform/kube/bookinfo.yaml | sed 's/app: reviews/app: reviews_test/' | kubectl apply -l app=reviews_test,version=v2 -f -
|
||||
|
@ -21,10 +22,11 @@ test: no
|
|||
|
||||
1. 访问您的应用程序以确保已部署的微服务不会破坏它。
|
||||
|
||||
1. 从集群内部使用您之前部署的测试容器测试新版本的微服务。请注意您的新版本在测试期间访问微服务 ratings 的生产 Pods。
|
||||
还需要注意,您必须使用 Pod IP 访问新版本的微服务,因为它还没有被 `reviews` 服务选中。
|
||||
1. 从集群内部使用您之前部署的测试容器测试新版本的微服务。请注意您的新版本在测试期间访问微服务
|
||||
ratings 的生产 Pod。还需要注意,您必须使用 Pod IP 访问新版本的微服务,因为它还没有被
|
||||
`reviews` 服务选中。
|
||||
|
||||
1. 获取Pod IP:
|
||||
1. 获取 Pod IP:
|
||||
|
||||
{{< text bash >}}
|
||||
$ REVIEWS_V2_POD_IP=$(kubectl get pod -l app=reviews_test,version=v2 -o jsonpath='{.items[0].status.podIP}')
|
||||
|
@ -38,7 +40,7 @@ test: no
|
|||
{"id": "7","reviews": [{ "reviewer": "Reviewer1", "text": "An extremely entertaining play by Shakespeare. The slapstick humour is refreshing!", "rating": {"stars": 5, "color": "black"}},{ "reviewer": "Reviewer2", "text": "Absolutely fun and entertaining. The play lacks thematic depth when compared to other plays by Shakespeare.", "rating": {"stars": 4, "color": "black"}}]}
|
||||
{{< /text >}}
|
||||
|
||||
1. 连续发送10次请求来执行原始负载测试:
|
||||
1. 连续发送 10 次请求来执行原始负载测试:
|
||||
|
||||
{{< text bash >}}
|
||||
$ kubectl exec $(kubectl get pod -l app=sleep -o jsonpath='{.items[0].metadata.name}') -- sh -c "for i in 1 2 3 4 5 6 7 8 9 10; do curl -o /dev/null -s -w '%{http_code}\n' $REVIEWS_V2_POD_IP:9080/reviews/7; done"
|
||||
|
@ -48,10 +50,11 @@ test: no
|
|||
{{< /text >}}
|
||||
|
||||
1. 前面的步骤确保您新版本的 `reviews` 可以正常工作,并且能够对其进行部署。
|
||||
您将一个单副本的服务部署到生产中,因此实际生产流量将开始到达您的新服务。 在当前的设置下,
|
||||
75% 的流量将到达旧版本(三个旧版本的Pod),而 25% 的流量将到达新版本(单个Pod)。
|
||||
您将一个单副本的服务部署到生产中,因此实际生产流量将开始到达您的新服务。在当前的设置下,
|
||||
75% 的流量将到达旧版本(三个旧版本的 Pod),而 25% 的流量将到达新版本(单个 Pod)。
|
||||
|
||||
要部署 _reviews v2_,请重新部署带有 `app=reviews` 标签的新版本,以便它能被 `reviews` 服务寻址。
|
||||
要部署 **reviews v2**,请重新部署带有 `app=reviews` 标签的新版本,以便它能被
|
||||
`reviews` 服务寻址。
|
||||
|
||||
{{< text bash >}}
|
||||
$ kubectl label pods -l version=v2 app=reviews --overwrite
|
||||
|
@ -59,7 +62,7 @@ test: no
|
|||
{{< /text >}}
|
||||
|
||||
1. 现在,您访问应用程序页面,并观察评级上的黑色星标。您可以多访问几次该页面,
|
||||
发现有时返回的页面带有星级(大约25%的时间),有时不带星级(大约75%的时间)。
|
||||
发现有时返回的页面带有星级(大约 25% 的时间),有时不带星级(大约 75% 的时间)。
|
||||
|
||||
{{< image width="80%"
|
||||
link="bookinfo-reviews-v2.png"
|
||||
|
@ -112,18 +115,21 @@ test: no
|
|||
这要求能够使用请求参数(例如使用存储在 Cookie 中的用户名)将流量驱动到新版本。
|
||||
此外,对新版本的生产流量进行屏蔽,并检查新版本是否提供了错误的结果或者产生了错误。
|
||||
最后,获得对部署的更详细的控制。例如,您可以部署 1%,然后每小时增加 1%,只要服务没有被降级。
|
||||
Istio 直接帮助您执行这些任务来增强 Kubernetes 的价值。有关部署的更多详细信息和最佳实践,请参阅
|
||||
[部署模型](/zh/docs/ops/deployment/deployment-models/)。
|
||||
Istio 直接帮助您执行这些任务来增强 Kubernetes 的价值。有关部署的更多详细信息和最佳实践,
|
||||
请参阅[部署模型](/zh/docs/ops/deployment/deployment-models/)。
|
||||
|
||||
在这里,您有两个选择:
|
||||
|
||||
1. 使用 _service mesh_ 。在服务网格中,您将所有报告、路由、策略、安全逻辑放在 _Sidecar_ 代理中,并 *透明的* 注入到您的应用程序 Pod 中。业务逻辑保留在应用程序代码中,无需更改应用程序的代码。
|
||||
1. 使用 **service mesh**。在服务网格中,您将所有报告、路由、策略、安全逻辑放在
|
||||
**Sidecar** 代理中,并**透明的**注入到您的应用程序 Pod 中。
|
||||
业务逻辑保留在应用程序代码中,无需更改应用程序的代码。
|
||||
|
||||
1. 在应用程序代码中实现所需的功能。大多数功能已各种库中提供,例如
|
||||
Netflix 的 [Hystrix](https://github.com/Netflix/Hystrix) 在 Java 编程语言中。
|
||||
但是,您现在必须修改您的代码才能使用这些库。您的业务代码将膨胀,业务逻辑将与报告、路由、策略、网络逻辑混合在一起。
|
||||
由于您的微服务使用不同的编程语言,因此您必须学习、使用和更新多个库。
|
||||
|
||||
参阅 [Istio 服务网格](/zh/about/service-mesh/) 以了解 Istio 如何执行此处以及更多内容中提到的任务。接下来的模块中,您将探索 Istio 的各种功能。
|
||||
参阅 [Istio 服务网格](/zh/about/service-mesh/)以了解 Istio 如何执行此处以及更多内容中提到的任务。
|
||||
接下来的模块中,您将探索 Istio 的各种功能。
|
||||
|
||||
您已经准备好 [在 `productpage` 中启用 Istio](/zh/docs/examples/microservices-istio/add-istio/)。
|
||||
您已经准备好[在 `productpage` 中启用 Istio](/zh/docs/examples/microservices-istio/add-istio/)。
|
||||
|
|
|
@ -9,9 +9,14 @@ test: no
|
|||
|
||||
{{< boilerplate work-in-progress >}}
|
||||
|
||||
该模块显示了一个应用程序,它由四种以不同编程语言编写的微服务组成:`productpage`、`details`、`ratings` 和 `reviews`。我们将组成的应用程序称为 `Bookinfo`,您可以在 [Bookinfo 示例](/zh/docs/examples/bookinfo)页面中了解更多信息。
|
||||
该模块显示了一个应用程序,它由四种以不同编程语言编写的微服务组成:
|
||||
`productpage`、`details`、`ratings` 和 `reviews`。我们将组成的应用程序称为
|
||||
`Bookinfo`,您可以在 [Bookinfo 示例](/zh/docs/examples/bookinfo)页面中了解更多信息。
|
||||
|
||||
`reviews` 微服务具有三个版本:`v1`、`v2`、`v3`,而 [Bookinfo 示例](/zh/docs/examples/bookinfo)展示的是该应用的最终版本。在此模块中,应用程序仅使用 `reviews` 微服务的 `v1` 版本。接下来的模块通过多个版本的 `reviews` 微服务增强了应用程序。
|
||||
`reviews` 微服务具有三个版本:`v1`、`v2`、`v3`,而
|
||||
[Bookinfo 示例](/zh/docs/examples/bookinfo)展示的是该应用的最终版本。
|
||||
在此模块中,应用程序仅使用 `reviews` 微服务的 `v1` 版本。接下来的模块通过多个版本的
|
||||
`reviews` 微服务增强了应用程序。
|
||||
|
||||
## 部署应用程序及测试 Pod {#deploy-the-application-and-a-testing-pod}
|
||||
|
||||
|
@ -22,7 +27,7 @@ test: no
|
|||
{{< /text >}}
|
||||
|
||||
1. 浏览 [`bookinfo.yaml`]({{< github_blob >}}/samples/bookinfo/platform/kube/bookinfo.yaml)。
|
||||
这是该应用的 Kubernetes 部署规范。注意 services 和 deployments。
|
||||
这是该应用的 Kubernetes 部署规范。注意 Service 和 Deployment。
|
||||
|
||||
1. 部署应用到 Kubernetes 集群:
|
||||
|
||||
|
@ -53,7 +58,8 @@ test: no
|
|||
reviews-v1-77c65dc5c6-kjvxs 1/1 Running 0 9s
|
||||
{{< /text >}}
|
||||
|
||||
1. 四个服务达到 `Running` 状态后,就可以扩展 deployment。要使每个微服务的每个版本在三个 Pod 中运行,请执行以下命令:
|
||||
1. 四个服务达到 `Running` 状态后,就可以扩展 deployment。要使每个微服务的每个版本在三个
|
||||
Pod 中运行,请执行以下命令:
|
||||
|
||||
{{< text bash >}}
|
||||
$ kubectl scale deployments --all --replicas 3
|
||||
|
@ -63,7 +69,7 @@ test: no
|
|||
deployment.apps/reviews-v1 scaled
|
||||
{{< /text >}}
|
||||
|
||||
1. 检查 pods 的状态。可以看到每个微服务都有三个 pods:
|
||||
1. 检查 Pod 的状态,可以看到每个微服务都有三个 Pod:
|
||||
|
||||
{{< text bash >}}
|
||||
$ kubectl get pods
|
||||
|
@ -82,7 +88,8 @@ test: no
|
|||
reviews-v1-77c65dc5c6-r55tl 1/1 Running 0 49s
|
||||
{{< /text >}}
|
||||
|
||||
1. 在服务达到 `Running` 状态后,部署一个测试 Pod:[sleep]({{< github_tree >}}/samples/sleep)。此 Pod 用来向您的微服务发送请求:
|
||||
1. 在服务达到 `Running` 状态后,部署一个测试 Pod:[sleep]({{< github_tree >}}/samples/sleep)。
|
||||
此 Pod 用来向您的微服务发送请求:
|
||||
|
||||
{{< text bash >}}
|
||||
$ kubectl apply -f {{< github_file >}}/samples/sleep/sleep.yaml
|
||||
|
@ -95,13 +102,15 @@ test: no
|
|||
<title>Simple Bookstore App</title>
|
||||
{{< /text >}}
|
||||
|
||||
## 启用对应用的外部访问{#enable-external-access-to-the-application}
|
||||
## 启用对应用的外部访问 {#enable-external-access-to-the-application}
|
||||
|
||||
应用程序运行后,使集群外部的客户端可以访问它。成功配置以下步骤后,即可从笔记本电脑的浏览器访问该应用程序。
|
||||
应用程序运行后,使集群外部的客户端可以访问它。成功配置以下步骤后,
|
||||
即可从笔记本电脑的浏览器访问该应用程序。
|
||||
|
||||
{{< warning >}}
|
||||
|
||||
如果您的集群运行于 GKE,请将 `productpage` service 的类型修改为 `LoadBalancer`,如以下示例所示:
|
||||
如果您的集群运行于 GKE,请将 `productpage` service 的类型修改为
|
||||
`LoadBalancer`,如以下示例所示:
|
||||
|
||||
{{< text bash >}}
|
||||
$ kubectl patch svc productpage -p '{"spec": {"type": "LoadBalancer"}}'
|
||||
|
@ -110,7 +119,7 @@ service/productpage patched
|
|||
|
||||
{{< /warning >}}
|
||||
|
||||
### 配置 Kubernetes Ingress 资源并访问应用页面{#configure-the-Kubernetes-Ingress-resource-and-access-your-application-webpage}
|
||||
### 配置 Kubernetes Ingress 资源并访问应用页面 {#configure-the-Kubernetes-Ingress-resource-and-access-your-application-webpage}
|
||||
|
||||
1. 创建 Kubernetes Ingress 资源:
|
||||
|
||||
|
@ -158,7 +167,7 @@ service/productpage patched
|
|||
EOF
|
||||
{{< /text >}}
|
||||
|
||||
### 更新 `/etc/hosts` 配置文件{#update-your-etc-hosts-configuration-file}
|
||||
### 更新 `/etc/hosts` 配置文件 {#update-your-etc-hosts-configuration-file}
|
||||
|
||||
1. 获取名为 `bookinfo` 的 Kubernetes Ingress 的 IP 地址:
|
||||
|
||||
|
@ -166,13 +175,14 @@ service/productpage patched
|
|||
$ kubectl get ingress bookinfo
|
||||
{{< /text >}}
|
||||
|
||||
1. 将以下命令的输出内容追加到 `/etc/hosts` 文件。您应当具有[超级用户](https://en.wikipedia.org/wiki/Superuser)权限,并且可能需要使用 [`sudo`](https://en.wikipedia.org/wiki/Sudo) 来编辑 `/etc/hosts`。
|
||||
1. 将以下命令的输出内容追加到 `/etc/hosts` 文件。您应当具有[超级用户](https://en.wikipedia.org/wiki/Superuser)权限,
|
||||
并且可能需要使用 [`sudo`](https://en.wikipedia.org/wiki/Sudo) 来编辑 `/etc/hosts`。
|
||||
|
||||
{{< text bash >}}
|
||||
$ echo $(kubectl get ingress istio-system -n istio-system -o jsonpath='{..ip} {..host}') $(kubectl get ingress bookinfo -o jsonpath='{..host}')
|
||||
{{< /text >}}
|
||||
|
||||
### 访问应用{#access-your-application}
|
||||
### 访问应用 {#access-your-application}
|
||||
|
||||
1. 用以下命令访问应用主页:
|
||||
|
||||
|
|
Loading…
Reference in New Issue