使用 Kubernetes 运行 Bookinfo
此模块向您展示一个应用程序,该应用程序由四个用不同编程语言编写的微服务组成:productpage
、details
、ratings
和 reviews
。我们将组合应用程序称为 Bookinfo
,您可以在 Bookinfo 示例 页面上了解有关它的更多信息。
Bookinfo 示例 显示了应用程序的最终状态,其中 reviews
微服务有三个版本:v1
、v2
、v3
。在此模块中,该应用程序仅使用 reviews
微服务的 v1
版本。后续模块通过部署 reviews
微服务的更新版本来增强该应用程序。
部署应用程序和测试 Pod
设置
MYHOST
环境变量以保存应用程序的 URL$ export MYHOST=$(kubectl config view -o jsonpath={.contexts..namespace}).bookinfo.com
略读
bookinfo.yaml
。这是应用程序的 Kubernetes 部署规范。请注意服务和部署。将应用程序部署到您的 Kubernetes 集群
$ kubectl apply -l version!=v2,version!=v3 -f https://raw.githubusercontent.com/istio/istio/release-1.24/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 service/productpage created serviceaccount/bookinfo-productpage created deployment.apps/productpage-v1 created
检查 Pod 的状态
$ kubectl get pods NAME READY STATUS RESTARTS AGE details-v1-6d86fd9949-q8rrf 1/1 Running 0 10s productpage-v1-c9965499-tjdjx 1/1 Running 0 8s ratings-v1-7bf577cb77-pq9kg 1/1 Running 0 9s reviews-v1-77c65dc5c6-kjvxs 1/1 Running 0 9s
在四个 Pod 达到
Running
状态后,您可以扩展部署。要让每个版本的每个微服务都在三个 Pod 中运行,请执行以下命令$ kubectl scale deployments --all --replicas 3 deployment.apps/details-v1 scaled deployment.apps/productpage-v1 scaled deployment.apps/ratings-v1 scaled deployment.apps/reviews-v1 scaled
检查 Pod 状态。请注意,每个微服务都有三个 Pod
$ kubectl get pods NAME READY STATUS RESTARTS AGE details-v1-6d86fd9949-fr59p 1/1 Running 0 50s details-v1-6d86fd9949-mksv7 1/1 Running 0 50s details-v1-6d86fd9949-q8rrf 1/1 Running 0 1m productpage-v1-c9965499-hwhcn 1/1 Running 0 50s productpage-v1-c9965499-nccwq 1/1 Running 0 50s productpage-v1-c9965499-tjdjx 1/1 Running 0 1m ratings-v1-7bf577cb77-cbdsg 1/1 Running 0 50s ratings-v1-7bf577cb77-cz6jm 1/1 Running 0 50s ratings-v1-7bf577cb77-pq9kg 1/1 Running 0 1m reviews-v1-77c65dc5c6-5wt8g 1/1 Running 0 49s reviews-v1-77c65dc5c6-kjvxs 1/1 Running 0 1m reviews-v1-77c65dc5c6-r55tl 1/1 Running 0 49s
服务达到
运行
状态后,部署一个测试 pod,curl,用于向您的微服务发送请求。$ kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.24/samples/curl/curl.yaml
要确认 Bookinfo 应用程序正在运行,请从您的测试 pod 使用 curl 命令向它发送请求。
$ kubectl exec $(kubectl get pod -l app=curl -o jsonpath='{.items[0].metadata.name}') -c curl -- curl -sS productpage:9080/productpage | grep -o "<title>.*</title>" <title>Simple Bookstore App</title>
启用对应用程序的外部访问
应用程序运行后,启用集群外部的客户端访问它。成功配置以下步骤后,您可以从笔记本电脑的浏览器访问应用程序。
配置 Kubernetes 入口资源并访问您的应用程序网页
创建一个 Kubernetes Ingress 资源。
$ kubectl apply -f - <<EOF apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: bookinfo annotations: kubernetes.io/ingress.class: istio spec: rules: - host: $MYHOST http: paths: - path: /productpage pathType: Prefix backend: service: name: productpage port: number: 9080 - path: /login pathType: Prefix backend: service: name: productpage port: number: 9080 - path: /logout pathType: Prefix backend: service: name: productpage port: number: 9080 - path: /static pathType: Prefix backend: service: name: productpage port: number: 9080 EOF
更新您的 /etc/hosts
配置文件
获取名为
bookinfo
的 Kubernetes ingress 的 IP 地址。$ kubectl get ingress bookinfo
在您的
/etc/hosts
文件中,将之前的 IP 地址添加到以下命令提供的主机条目中。您需要拥有超级用户权限,并且可能需要使用sudo
编辑/etc/hosts
。$ echo $(kubectl get ingress istio-system -n istio-system -o jsonpath='{..ip} {..host}') $(kubectl get ingress bookinfo -o jsonpath='{..host}')
访问您的应用程序
从命令行访问应用程序的主页。
$ curl -s $MYHOST/productpage | grep -o "<title>.*</title>" <title>Simple Bookstore App</title>
将以下命令的输出粘贴到浏览器的地址栏中。
$ echo http://$MYHOST/productpage
您应该看到以下网页。
Bookinfo Web 应用程序 观察微服务如何互相调用。例如,
reviews
使用http://ratings:9080/ratings
URL 调用ratings
微服务。查看reviews
的代码。private final static String ratings_service = "http://ratings:9080/ratings";
在另一个终端窗口中设置一个无限循环,向您的应用程序发送流量以模拟现实世界中持续的用户流量。
$ while :; do curl -s $MYHOST/productpage | grep -o "<title>.*</title>"; sleep 1; done <title>Simple Bookstore App</title> <title>Simple Bookstore App</title> <title>Simple Bookstore App</title> <title>Simple Bookstore App</title> ...
您已准备好测试应用程序。