在 ambient 模式下部署 Bookinfo 应用

您可以依靠 ZTunnel proxy 在不注入 sidecar 的情况下,以 ambient 模式部署 Bookinfo 示例应用。有关 Bookinfo 应用的背景信息,请参阅部署 Bookinfo 应用

部署 Bookinfo 应用

前提条件

  • 集群管理员已登录有效的 ACP CLI(kubectl)会话,并具有 cluster-admin 角色。
  • 您已在本地安装 istioctl,以便运行这些操作步骤。
  • 已安装 Alauda Service Mesh Operator 2.1.1 或更高版本,已创建 Istio 资源,并且 Operator 已部署 Istio。
  • 已创建 IstioCNI 资源,并且 Operator 已部署所需的 IstioCNI pod。
  • 已创建 ZTunnel 资源,并且 Operator 已部署所需的 ZTunnel pod。

操作步骤

  1. 创建 bookinfo namespace:

    kubectl create namespace bookinfo
    kubectl label namespace bookinfo pod-security.kubernetes.io/enforce=restricted --overwrite
  2. bookinfo namespace 添加 istio-discovery=enabled label:

    kubectl label namespace bookinfo istio-discovery=enabled
  3. 部署 Bookinfo 应用:

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

    应用 bookinfo-versions YAML 文件以创建 Bookinfo 服务的多个版本:

    kubectl apply -n bookinfo -f https://raw.githubusercontent.com/alauda-mesh/istio/refs/heads/istio-1.30/samples/bookinfo/platform/kube/bookinfo-versions.yaml
  4. 通过为整个 namespace 或单个 pod 添加 label,将 Bookinfo 应用加入 ambient mesh:

    • 要将 bookinfo namespace 中的所有工作负载纳入其中:

      kubectl label namespace bookinfo istio.io/dataplane-mode=ambient
    • 要仅纳入特定工作负载,请直接为各个 pod 应用 istio.io/dataplane-mode=ambient label。有关用于将工作负载添加到 mesh 或从 mesh 中排除的 label 的详细信息,请参阅其他资源部分。

      NOTE

      将工作负载加入 ambient mesh 不需要重启或重新部署应用 pod。与 sidecar 模式不同,每个 pod 中的容器数量保持不变。

验证

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

    kubectl get services -n bookinfo

    示例输出

    NAME             TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
    details          ClusterIP   10.4.119.2     <none>        9080/TCP   2m35s
    details-v1       ClusterIP   10.4.1.117     <none>        9080/TCP   2m30s
    productpage      ClusterIP   10.4.103.113   <none>        9080/TCP   2m35s
    productpage-v1   ClusterIP   10.4.18.45     <none>        9080/TCP   2m30s
    ratings          ClusterIP   10.4.59.87     <none>        9080/TCP   2m35s
    ratings-v1       ClusterIP   10.4.176.204   <none>        9080/TCP   2m30s
    reviews          ClusterIP   10.4.210.99    <none>        9080/TCP   2m35s
    reviews-v1       ClusterIP   10.4.46.223    <none>        9080/TCP   2m30s
    reviews-v2       ClusterIP   10.4.195.242   <none>        9080/TCP   2m30s
    reviews-v3       ClusterIP   10.4.2.53      <none>        9080/TCP   2m30s
  2. 要检查 bookinfo pod 是否可用,请执行以下命令:

    kubectl get pods -n bookinfo

    示例输出

    NAME                              READY   STATUS    RESTARTS   AGE
    details-v1-569946bc86-f5xks       1/1     Running   0          2m30s
    productpage-v1-6c76dd65f7-tk5mr   1/1     Running   0          2m29s
    ratings-v1-5fd569d7c8-5x778       1/1     Running   0          2m30s
    reviews-v1-7668bf774d-qvpjh       1/1     Running   0          2m30s
    reviews-v2-55dd985686-bxv5v       1/1     Running   0          2m29s
    reviews-v3-5d7d6bddd8-2wr5w       1/1     Running   0          2m29s

    由于 ambient 模式不会注入 proxy sidecar,Ready 列会显示 1/1。请确保每个 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>
  4. 确认 ZTunnel proxy 已在 pod network namespace 中成功建立监听 socket:

    istioctl -n ztunnel ztunnel-config workloads

    bookinfo namespace 添加到 Ambient mesh 后,您将看到 HBONE protocol。

    示例输出

    NAMESPACE    POD NAME                        ADDRESS    NODE           WAYPOINT PROTOCOL
    bookinfo     details-v1-569946bc86-f5xks     10.3.0.143 192.168.131.32 None     HBONE
    bookinfo     productpage-v1-6c76dd65f7-tk5mr 10.3.0.148 192.168.131.32 None     HBONE
    bookinfo     ratings-v1-5fd569d7c8-5x778     10.3.0.144 192.168.131.32 None     HBONE
    bookinfo     reviews-v1-7668bf774d-qvpjh     10.3.0.145 192.168.131.32 None     HBONE
    bookinfo     reviews-v2-55dd985686-bxv5v     10.3.0.146 192.168.131.32 None     HBONE
    bookinfo     reviews-v3-5d7d6bddd8-2wr5w     10.3.0.147 192.168.131.32 None     HBONE
    istio-cni    istio-cni-node-vfrbr            10.3.0.140 192.168.131.32 None     TCP
    istio-system istiod-57f9449cdd-56gl8         10.3.0.141 192.168.131.32 None     TCP
    ztunnel      ztunnel-lf7c9                   10.3.0.142 192.168.131.32 None     TCP

通过 Gateway 访问 Bookinfo 应用

Alauda Service Mesh v2 Operator 不会部署 gateway,因为 gateway 不被视为控制平面的一部分。在 ambient 模式下,Kubernetes Gateway API 是配置 ingress 流量的唯一受支持方式:通过创建 Gateway 资源来部署 gateway,并使用 HTTPRoute 资源定义路由规则。

WARNING

在 ambient 模式下,VirtualService 资源的兼容性有限,不应与 Gateway API 配置结合使用。在 ambient 模式下,请使用 Kubernetes Gateway API 资源作为流量路由的标准方式。

前提条件

  • 已按照前述操作步骤部署 bookinfo 应用并将其加入 ambient mesh。
  • 已安装 Gateway API CRD。
  • 您的 Kubernetes 集群支持外部负载均衡器(即,类型为 LoadBalancer 的 Service)。

操作步骤

  1. istio gateway class overlay 添加到 Istio 资源,以便 gateway pod 被准入 Restricted bookinfo namespace:

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

    有关详细信息,请参阅 Pod Security Admission

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

    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 配置文件,通过 Gateway API 为 bookinfo 应用配置 gateway。必须在应用的 namespace 中应用此文件。

  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. 使用以下命令获取 gateway 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 网页。

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

清理

完成对 Bookinfo 应用的探索后,请删除 bookinfo namespace,以移除应用及其所有关联的 gateway 资源:

# Remove the namespace from the ambient data plane
kubectl label namespace bookinfo istio.io/dataplane-mode-
# Remove the Bookinfo namespace
kubectl delete namespace bookinfo

其他资源