部署 Bookinfo 应用

Bookinfo 应用概述

要安装 bookinfo 示例应用,需要完成两个主要步骤:首先部署应用本身,然后设置网关,使其可从集群外部访问。

bookinfo 应用可用于探索 service mesh 的功能。借助它,您可以轻松验证 Web 浏览器请求是否通过网格正确路由到应用。

bookinfo 应用展示有关一本书的信息,类似于在线书店目录中的单个条目。它会显示包含书籍描述、详细信息(例如 ISBN 和页数)以及客户评论的页面。

通过网格公开后,bookinfo 应用的微服务行为由网格配置控制。评论数据来自以下三个服务之一:reviews-v1reviews-v2reviews-v3。如果部署 bookinfo 时未定义 reviews 虚拟服务,网格将默认采用 round-robin 策略向这些服务路由请求。

通过创建 reviews 虚拟服务,您可以定义自定义路由规则。例如,可以将网格配置为在用户登录时将请求定向到 reviews-v2 服务,从而显示黑色星标的评论。相反,对于未登录的用户,网格可以将请求路由到 reviews-v3,显示红色星标的评论。

更多详细信息请参阅上游 Istio 文档中的 Bookinfo Application

部署 Bookinfo 应用

前提条件

  • 已安装 Alauda Service Mesh v2 Operator。
  • 已部署 Istio CNI。
  • 已部署 Istio 控制平面。

操作步骤

  1. 使用以下命令创建名为 bookinfo 的新命名空间:

    kubectl create namespace bookinfo
    kubectl label namespace bookinfo pod-security.kubernetes.io/enforce=restricted --overwrite
  2. bookinfo 命名空间启用 sidecar 注入。如果您的设置使用 InPlace 升级策略,请运行以下命令:

    kubectl label namespace bookinfo istio-injection=enabled
    NOTE

    如果使用 RevisionBased 升级策略,请执行以下命令:

    1. 运行以下命令查找您的 <revision-name>

      kubectl get istiorevisions.sailoperator.io

      示例输出:

      NAME      NAMESPACE      PROFILE   READY   STATUS    IN USE   VERSION   AGE
      default   istio-system             True    Healthy   True     v1.30.4   47h
    2. 使用 revision 名称标记命名空间,以启用 sidecar 注入:

      kubectl label namespace bookinfo istio.io/rev=default
  3. 可选:如果已配置 discoverySelectors,请使用以下命令将 Istio discovery selector 应用到 bookinfo 命名空间:

    discovery selector 标签示例istio-discovery=enabled

    kubectl label namespace bookinfo istio-discovery=enabled
  4. 使用以下命令应用其 YAML 文件,部署 bookinfo 应用:

    kubectl -n bookinfo apply -f https://raw.githubusercontent.com/alauda-mesh/istio/refs/heads/istio-1.30/samples/bookinfo/platform/kube/bookinfo.yaml

验证

  1. 运行以下命令,确认 bookinfo 服务可用:

    kubectl get services -n bookinfo

    示例输出

    NAME          TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
    details       ClusterIP   10.4.153.200   <none>        9080/TCP   4m44s
    productpage   ClusterIP   10.4.132.101   <none>        9080/TCP   4m43s
    ratings       ClusterIP   10.4.76.104    <none>        9080/TCP   4m44s
    reviews       ClusterIP   10.4.48.38     <none>        9080/TCP   4m44s
  2. 执行以下命令,检查 bookinfo pod 是否可用:

    kubectl get pods -n bookinfo

    示例输出

    NAME                              READY   STATUS    RESTARTS   AGE
    details-v1-c66556f6d-bbqjx        2/2     Running   0          5m56s
    productpage-v1-5f568ff46d-r886k   2/2     Running   0          5m56s
    ratings-v1-74bcfcb96d-7bm8s       2/2     Running   0          5m56s
    reviews-v1-549bfb5f44-xwh4z       2/2     Running   0          5m56s
    reviews-v2-6486bc9868-snch4       2/2     Running   0          5m56s
    reviews-v3-6c66dc6cdd-87jgd       2/2     Running   0          5m56s

    Ready 列显示 2/2 时,表示 proxy sidecar 注入成功。请确保每个 pod 的 Status 列显示 Running

  3. 通过向其 product page 发送请求,确认 bookinfo 应用正在运行。执行以下命令:

    kubectl exec "$(kubectl get pod -l app=ratings -n bookinfo -o jsonpath='{.items[0].metadata.name}')" -c ratings -n bookinfo -- curl -sS productpage:9080/productpage | grep -o "<title>.*</title>"

    示例输出

    <title>Simple Bookstore App</title>

通过网关访问 Bookinfo 应用

Alauda Service Mesh v2 Operator 不会部署网关,因为网关不被视为控制平面的一部分。出于安全考虑,最佳实践是将 Ingress 和 Egress 网关部署在与控制平面不同的命名空间中。

部署网关有两种方法:使用 Gateway API网关注入技术

使用 Istio 网关注入访问 Bookinfo 应用

网关注入技术使用与 Istio sidecar 注入相同的机制。它会根据与 Service 资源关联的 Deployment 资源创建网关。随后可以将此 Service 暴露到 Alauda Container Platform 集群外部。

前提条件

  • 已安装 Alauda Service Mesh v2 Operator。
  • 已部署 Istio 控制平面。

操作步骤

  1. 执行以下命令,创建 istio-ingressgateway deployment 和 service:

    kubectl -n bookinfo apply -f https://raw.githubusercontent.com/alauda-mesh/sail-operator/refs/heads/release-2.2/chart/samples/ingress-gateway.yaml
  2. 运行以下命令,将 bookinfo 应用配置为使用新创建的网关:

    kubectl -n bookinfo apply -f https://raw.githubusercontent.com/alauda-mesh/istio/refs/heads/istio-1.30/samples/bookinfo/networking/bookinfo-gateway.yaml
    NOTE

    此示例使用网关配置示例文件,为 bookinfo 应用设置网关注入。该文件必须应用在安装应用的同一命名空间中。

  3. 可选:修改 YAML 文件,根据 ingress 流量自动扩展 pod。

    配置示例

    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      labels:
        istio: ingressgateway
        release: istio
      name: ingressgatewayhpa
      namespace: bookinfo
    spec:
      minReplicas: 2
      maxReplicas: 5
      metrics:
        - resource:
            name: cpu
            target:
              averageUtilization: 80
              type: Utilization
          type: Resource
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: istio-ingressgateway
    1. 在此示例中,最大 Replica 数设置为 5,最小 Replica 数设置为 2。CPU 利用率达到 80% 时会创建新的 Replica。
  4. 可选:定义节点上应运行的最少 pod 数量。

    配置示例

    apiVersion: policy/v1
    kind: PodDisruptionBudget
    metadata:
      labels:
        istio: ingressgateway
        release: istio
      name: ingressgatewaypdb
      namespace: bookinfo
    spec:
      minAvailable: 1
      selector:
        matchLabels:
          istio: ingressgateway
    1. 此示例配置确保 pod 在其他节点上重启时至少有一个 Replica 正在运行。

验证

您将通过刚刚配置的网关连接到 Bookinfo productpage 服务。要访问网关,需要使用 kubectl port-forward 命令:

kubectl -n bookinfo port-forward svc/istio-ingressgateway 9080:80
  • 如果在工作站本地运行该命令,请在浏览器中打开 http://localhost:9080/productpage
  • 如果在远程 IPv4 主机上运行该命令并使用了 --address "0.0.0.0",请将 localhost 替换为远程主机的 IP 或主机名(例如 http://<REMOTE_HOST_IP>:9080/productpage)。
  • 如果在远程 IPv6 主机上运行该命令并使用了 --address "::",请将 localhost 替换为远程主机的 IP 或主机名(例如 http://[<REMOTE_HOST_IP>]:9080/productpage)。

多次刷新页面时,您应该会看到 productpage 中显示不同版本的评论,以 round-robin 方式呈现(红色星标、黑色星标、无星标),因为我们尚未使用 Istio 控制版本路由。

使用 Gateway API 访问 Bookinfo 应用

借助 Kubernetes Gateway API,可以通过创建 Gateway 资源来部署网关。

前提条件

  • 已安装 Alauda Service Mesh v2 Operator。
  • 已部署 Istio 控制平面。
  • 您的 Kubernetes 集群支持外部负载均衡器(即类型为 LoadBalancer 的 Service)。

操作步骤

  1. istio 网关类 overlay 添加到 Istio 资源,使网关 pod 能够被接纳到 Restricted bookinfo 命名空间中:

    kubectl patch istio default --type=merge -p '{"spec":{"values":{"gatewayClasses":{"istio":{"deployment":{"spec":{"template":{"spec":{"securityContext":{"seccompProfile":{"type":"RuntimeDefault"}}}}}}}}}}}'

    有关更多信息,请参阅 Pod Security Admission

  2. 执行以下命令,使用 GatewayHTTPRoute 资源创建并配置网关:

    kubectl -n bookinfo apply -f https://raw.githubusercontent.com/alauda-mesh/istio/refs/heads/istio-1.30/samples/bookinfo/gateway-api/bookinfo-gateway.yaml 
    NOTE

    此示例使用网关配置示例文件,通过 Gateway API 为 bookinfo 应用配置网关。该文件必须应用在应用所在的命名空间中。

  3. 运行以下命令,确保 Gateway API service 已就绪并具有地址:

    kubectl wait --for=condition=programmed gtw bookinfo-gateway -n bookinfo
  4. 使用以下命令获取主机:

    export INGRESS_HOST=$(kubectl get gtw bookinfo-gateway -n bookinfo -o jsonpath='{.status.addresses[0].value}')
    echo "INGRESS_HOST=$INGRESS_HOST"
  5. 使用以下命令获取端口:

    export INGRESS_PORT=$(kubectl get gtw bookinfo-gateway -n bookinfo -o jsonpath='{.spec.listeners[?(@.name=="http")].port}')
    echo "INGRESS_PORT=$INGRESS_PORT"
  6. 使用以下命令获取网关 URL:

    INFO

    如果 $INGRESS_HOST 是 IPv6 地址,则构建 URL 时请将其括在方括号中。例如:

    export GATEWAY_URL=[$INGRESS_HOST]:$INGRESS_PORT
    export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT
  7. 运行以下命令获取 product page 的完整 URL:

    echo "http://${GATEWAY_URL}/productpage"

验证

  • 使用 curl 命令确认 productpage 可访问:

    curl -sS -g "http://${GATEWAY_URL}/productpage" | grep -o "<title>.*</title>"

    示例输出

    <title>Simple Bookstore App</title>
  • 在 Web 浏览器中确认 productpage 可访问。

    在浏览器中打开 http://${GATEWAY_URL}/productpage,查看 Bookinfo Web 页面。

    多次刷新页面时,您应该会看到 productpage 中显示不同版本的评论,以 round-robin 方式呈现(红色星标、黑色星标、无星标),因为我们尚未使用 Istio 控制版本路由。

移除 Bookinfo 应用

完成对 Bookinfo 应用的探索后,请删除 bookinfo 命名空间,以移除该应用及其所有关联的网关资源:

kubectl delete namespace bookinfo