使用 Kubernetes 运行 Bookinfo
该模块显示了一个应用程序,它由四种以不同编程语言编写的微服务组成:productpage
、details
、ratings
和 reviews
。我们将组成的应用程序称为 Bookinfo
,您可以在 Bookinfo 示例页面中了解更多信息。
reviews
微服务具有三个版本:v1
、v2
、v3
,而 Bookinfo 示例展示的是该应用的最终版本。在此模块中,应用程序仅使用 reviews
微服务的 v1
版本。接下来的模块通过多个版本的 reviews
微服务增强了应用程序。
部署应用程序及测试 pod
设置环境变量
MYHOST
的值为应用程序的 URL:$ export MYHOST=$(kubectl config view -o jsonpath={.contexts..namespace}).bookinfo.com
浏览
bookinfo.yaml
。 这是该应用的 Kubernetes 部署规范。注意 services 和 deployments。部署应用到 Kubernetes 集群:
$ kubectl apply -l version!=v2,version!=v3 -f https://raw.githubusercontent.com/istio/istio/release-1.14/samples/bookinfo/platform/kube/bookinfo.yaml service "details" created deployment "details-v1" created service "ratings" created deployment "ratings-v1" created service "reviews" created deployment "reviews-v1" created service "productpage" created deployment "productpage-v1" created
检查 pods 的状态:
$ 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
四个服务达到
Running
状态后,就可以扩展 deployment。要使每个微服务的每个版本在三个 pods 中运行,请执行以下命令:$ kubectl scale deployments --all --replicas 3 deployment "details-v1" scaled deployment "productpage-v1" scaled deployment "ratings-v1" scaled deployment "reviews-v1" scaled
检查 pods 的状态。可以看到每个微服务都有三个 pods:
$ 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
在服务达到
Running
状态后,部署测试 Pod,sleep,用来向您的微服务发送请求:$ kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.14/samples/sleep/sleep.yaml
从测试 pod 中用 curl 命令发送请求给 Bookinfo 应用,以确认该应用运行正常:
$ kubectl exec -it $(kubectl get pod -l app=sleep -o jsonpath='{.items[0].metadata.name}') -c sleep -- curl productpage:9080/productpage | grep -o "<title>.*</title>" <title>Simple Bookstore App</title>
启用对应用的外部访问
应用程序运行后,使集群外部的客户端可以访问它。成功配置以下步骤后,即可从笔记本电脑的浏览器访问该应用程序。
配置 Kubernetes Ingress 资源并访问应用页面
创建 Kubernetes Ingress 资源:
$ kubectl apply -f - <<EOF apiVersion: extensions/v1beta1 kind: Ingress metadata: name: bookinfo spec: rules: - host: $MYHOST http: paths: - path: /productpage backend: serviceName: productpage servicePort: 9080 - path: /login backend: serviceName: productpage servicePort: 9080 - path: /logout backend: serviceName: productpage servicePort: 9080 - path: /static backend: serviceName: productpage servicePort: 9080 EOF
更新 /etc/hosts
配置文件
获取名为
bookinfo
的 Kubernetes Ingress 的 IP 地址:$ kubectl get ingress bookinfo
将以下命令的输出内容追加到
/etc/hosts
文件。您应当具有超级用户权限,并且可能需要使用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
可以看到以下页面:
观察微服务是如何互相调用的。例如,
reviews
使用 URLhttp://ratings:9080/ratings
调用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> ...
您已经准备好测试应用了。