使用 Kubernetes 运行 Bookinfo

    该模块显示了一个应用程序,它由四种以不同编程语言编写的微服务组成:productpagedetailsratingsreviews。我们将组成的应用程序称为 Bookinfo,您可以在 Bookinfo 示例页面中了解更多信息。

    reviews 微服务具有三个版本:v1v2v3,而 展示的是该应用的最终版本。在此模块中,应用程序仅使用 reviews 微服务的 v1 版本。接下来的模块通过多个版本的 reviews 微服务增强了应用程序。

    1. 设置环境变量 MYHOST 的值为应用程序的 URL:

    2. 浏览 bookinfo.yaml。 这是该应用的 Kubernetes 部署规范。注意 services 和 deployments。

    3. 部署应用到 Kubernetes 集群:

      1. $ kubectl apply -l version!=v2,version!=v3 -f https://raw.githubusercontent.com/istio/istio/release-1.13/samples/bookinfo/platform/kube/bookinfo.yaml
      2. service "details" created
      3. deployment "details-v1" created
      4. service "ratings" created
      5. deployment "ratings-v1" created
      6. service "reviews" created
      7. deployment "reviews-v1" created
      8. service "productpage" created
      9. deployment "productpage-v1" created
    4. 检查 pods 的状态:

      1. $ kubectl get pods
      2. NAME READY STATUS RESTARTS AGE
      3. details-v1-6d86fd9949-q8rrf 1/1 Running 0 10s
      4. productpage-v1-c9965499-tjdjx 1/1 Running 0 8s
      5. ratings-v1-7bf577cb77-pq9kg 1/1 Running 0 9s
      6. reviews-v1-77c65dc5c6-kjvxs 1/1 Running 0 9s
    5. 四个服务达到 Running 状态后,就可以扩展 deployment。要使每个微服务的每个版本在三个 pods 中运行,请执行以下命令:

      1. $ kubectl scale deployments --all --replicas 3
      2. deployment "details-v1" scaled
      3. deployment "productpage-v1" scaled
      4. deployment "ratings-v1" scaled
      5. deployment "reviews-v2" scaled
      6. deployment "reviews-v3" scaled
    6. 在服务达到 Running 状态后,部署测试 Pod,,用来向您的微服务发送请求:

    7. 从测试 pod 中用 curl 命令发送请求给 Bookinfo 应用,以确认该应用运行正常:

      1. $ 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>"
      2. <title>Simple Bookstore App</title>

    启用对应用的外部访问

    应用程序运行后,使集群外部的客户端可以访问它。成功配置以下步骤后,即可从笔记本电脑的浏览器访问该应用程序。

    如果您的集群运行于 GKE,请将 productpage service 的类型修改为 LoadBalancer,如以下示例所示:

    1. $ kubectl patch svc productpage -p '{"spec": {"type": "LoadBalancer"}}'
    2. service/productpage patched
    1. 创建 Kubernetes Ingress 资源:

      1. $ kubectl apply -f - <<EOF
      2. apiVersion: extensions/v1beta1
      3. kind: Ingress
      4. metadata:
      5. name: bookinfo
      6. spec:
      7. rules:
      8. - host: $MYHOST
      9. http:
      10. paths:
      11. serviceName: productpage
      12. servicePort: 9080
      13. - path: /login
      14. backend:
      15. serviceName: productpage
      16. servicePort: 9080
      17. - path: /logout
      18. backend:
      19. serviceName: productpage
      20. servicePort: 9080
      21. - path: /static
      22. backend:
      23. serviceName: productpage
      24. servicePort: 9080
      25. EOF
    1. 获取名为 bookinfo 的 Kubernetes Ingress 的 IP 地址:

      1. $ kubectl get ingress bookinfo
    2. 将以下命令的输出内容追加到 /etc/hosts 文件。您应当具有权限,并且可能需要使用 sudo 来编辑 /etc/hosts

      1. $ curl -s $MYHOST/productpage | grep -o "<title>.*</title>"
      2. <title>Simple Bookstore App</title>
    1. 将以下命令的输出内容粘贴到浏览器的地址栏:

      1. $ echo http://$MYHOST/productpage

      可以看到以下页面:

      Bookinfo Web Application

    2. 观察微服务是如何互相调用的。例如,reviews 使用 URL http://ratings:9080/ratings 调用 ratings 微服务。 查看 reviews 的代码

      1. private final static String ratings_service = "http://ratings:9080/ratings";
    3. 在一个单独的终端窗口中设置无限循环,将流量发送到您的应用程序,以模拟现实世界中恒定的用户流量:

      1. $ while :; do curl -s $MYHOST/productpage | grep -o "<title>.*</title>"; sleep 1; done
      2. <title>Simple Bookstore App</title>
      3. <title>Simple Bookstore App</title>
      4. <title>Simple Bookstore App</title>
      5. <title>Simple Bookstore App</title>

    您已经准备好了。