添加新的评论版本
在本模块中,您将部署reviews
服务的最新版本_v2_
,该版本将返回评论者提供的评分数量和星级颜色。在实际场景中,在部署之前,您将进行静态分析测试、单元测试、集成测试、端到端测试以及预发布环境中的测试。
部署
reviews
微服务的最新版本,但不要使用app=reviews
标签。没有该标签,新版本将不会被选中来提供reviews
服务。因此,它不会被生产代码调用。运行以下命令来部署reviews
微服务版本2,同时将标签app=reviews
替换为app=reviews_test
$ curl -s https://raw.githubusercontent.com/istio/istio/release-1.24/samples/bookinfo/platform/kube/bookinfo.yaml | sed 's/app: reviews/app: reviews_test/' | kubectl apply -l app=reviews_test,version=v2 -f - deployment.apps/reviews-v2 created
访问您的应用程序以确保已部署的微服务没有对其造成干扰。
使用之前部署的测试容器,从集群内部测试微服务的最新版本。请注意,您的新版本在测试期间会访问
ratings
微服务的生产 Pod。还要注意,您必须使用 Pod IP 来访问您的微服务的新版本,因为它没有被选中用于reviews
服务。获取 Pod 的 IP
$ REVIEWS_V2_POD_IP=$(kubectl get pod -l app=reviews_test,version=v2 -o jsonpath='{.items[0].status.podIP}') $ echo $REVIEWS_V2_POD_IP
向 Pod 发送请求并查看它是否返回正确的结果
$ kubectl exec $(kubectl get pod -l app=curl -o jsonpath='{.items[0].metadata.name}') -- curl -sS "$REVIEWS_V2_POD_IP:9080/reviews/7" {"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"}}]}
通过连续发送 10 次请求来执行基本负载测试
$ kubectl exec $(kubectl get pod -l app=curl -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" 200 200 ...
前面的步骤确保您的
reviews
的新版本能够正常工作,您可以部署它。您将向生产环境部署单个服务的副本,以便实际生产流量开始到达您的新服务版本。在当前设置下,75% 的流量将到达旧版本(旧版本的三个 Pod),25% 的流量将到达新版本(一个 Pod)。要部署reviews v2,请重新部署带有
app=reviews
标签的新版本,这样它将可以被reviews
服务寻址。$ kubectl label pods -l version=v2 app=reviews --overwrite pod "reviews-v2-79c8c8c7c5-4p4mn" labeled
现在,您访问应用程序网页,并观察到评分出现黑星。您可以多次访问页面,并观察到有时页面会显示星级(大约 25% 的时间),有时则不会显示星级(大约 75% 的时间)。
Bookinfo 网络应用程序,评分为黑星 如果您在实际场景中遇到新版本的问题,您可以快速撤销部署新版本,这样只有旧版本将被使用
$ kubectl delete deployment reviews-v2 $ kubectl delete pod -l app=reviews,version=v2 deployment.apps "reviews-v2" deleted pod "reviews-v2-79c8c8c7c5-4p4mn" deleted
请等待一些时间,让配置更改传播到整个系统。然后,多次访问应用程序的网页,并观察到现在不再出现黑星。
要恢复新版本
$ kubectl apply -l app=reviews,version=v2 -f https://raw.githubusercontent.com/istio/istio/release-1.24/samples/bookinfo/platform/kube/bookinfo.yaml deployment.apps/reviews-v2 created
多次访问应用程序的网页,并观察到现在黑星大约会显示 25% 的时间。
接下来,增加新版本的副本数量。您可以逐步进行,仔细检查错误数量是否没有增加
$ kubectl scale deployment reviews-v2 --replicas=3 deployment.apps/reviews-v2 scaled
现在,多次访问应用程序的网页,并观察到黑星大约会显示一半的时间。
现在,您可以停用旧版本
$ kubectl delete deployment reviews-v1 deployment.apps "reviews-v1" deleted
访问应用程序的网页将只返回带有黑星的评论。
在前面的步骤中,您执行了reviews
的更新。首先,您部署了新版本,但没有向其发送模拟生产流量。您使用测试流量在生产环境中对其进行了测试。您检查了新版本是否提供了正确的结果。您发布了新版本,并逐渐向其增加生产流量。最后,您停用了旧版本。
从这里开始,您可以使用以下示例任务来改进您的部署策略。首先,在生产环境中端到端测试新版本。这需要能够使用请求参数驱动流量到您的新版本,例如使用存储在 Cookie 中的用户名。此外,对生产流量进行阴影到您的新版本,并检查您的新版本是否提供了错误的结果或产生了错误。最后,获得对发布的更详细的控制。例如,您可以以 1% 的比例部署,然后每小时增加 1%,只要服务没有出现性能下降。Istio 通过帮助您以直观的方式执行这些任务,来增强 Kubernetes 的价值。有关部署的更详细的信息和最佳实践,请参见部署模型。
从这里开始,您有两个选择
使用服务网格。在服务网格中,您将所有报告、路由、策略、安全逻辑放到边车代理中,这些代理透明地注入到您的应用程序 Pod 中。业务逻辑保留在应用程序的代码中,不需要对应用程序代码进行任何更改。
在应用程序代码中实现所需的功能。大多数功能已经在各种库中可用,例如在 Java 编程语言的 Netflix Hystrix 库中。但是,现在您必须更改代码以使用这些库。您必须付出额外的努力,您的代码会变得臃肿,业务逻辑会与报告、路由、策略、网络逻辑混合在一起。由于您的微服务使用不同的编程语言,您必须学习、使用、更新多个库。
参见Istio 服务网格,了解 Istio 如何执行此处提到的任务以及更多内容。在接下来的模块中,您将探索各种 Istio 功能。
您已准备好在productpage
上启用 Istio。