使用 Kubernetes 运行 Bookinfo

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

Bookinfo 示例 显示了应用程序的最终状态,其中 reviews 微服务有三个版本:v1v2v3。在此模块中,该应用程序仅使用 reviews 微服务的 v1 版本。后续模块通过部署 reviews 微服务的更新版本来增强该应用程序。

部署应用程序和测试 Pod

  1. 设置 MYHOST 环境变量以保存应用程序的 URL

    $ export MYHOST=$(kubectl config view -o jsonpath={.contexts..namespace}).bookinfo.com
    
  2. 略读 bookinfo.yaml。这是应用程序的 Kubernetes 部署规范。请注意服务和部署。

  3. 将应用程序部署到您的 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
    
  4. 检查 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
    
  5. 在四个 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
    
  6. 检查 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
    
  7. 服务达到运行状态后,部署一个测试 pod,curl,用于向您的微服务发送请求。

    $ kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.24/samples/curl/curl.yaml
    
  8. 要确认 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 入口资源并访问您的应用程序网页

  1. 创建一个 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 配置文件

  1. 获取名为bookinfo的 Kubernetes ingress 的 IP 地址。

    $ kubectl get ingress bookinfo
    
  2. 在您的/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}')
    

访问您的应用程序

  1. 从命令行访问应用程序的主页。

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

    $ echo http://$MYHOST/productpage
    

    您应该看到以下网页。

    Bookinfo Web Application
    Bookinfo Web 应用程序
  3. 观察微服务如何互相调用。例如,reviews使用http://ratings:9080/ratings URL 调用ratings微服务。查看reviews的代码

    private final static String ratings_service = "http://ratings:9080/ratings";
    
  4. 在另一个终端窗口中设置一个无限循环,向您的应用程序发送流量以模拟现实世界中持续的用户流量。

    $ 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>
    ...
    

您已准备好测试应用程序

这些信息是否有用?
您有什么改进建议吗?

感谢您的反馈!