Ambient 模式下的第 7 层功能

Ambient 模式通过 Gateway API HTTPRoute 资源和 Istio AuthorizationPolicy 资源提供稳定的 L7 功能。

AuthorizationPolicy 资源同时适用于 sidecar 和 ambient 模式。在 ambient 模式下,授权策略可指定由 ZTunnel 执行,也可附加到 waypoint 以由 waypoint 执行。要将策略附加到 waypoint,请包含一个 targetRef,用于引用 waypoint 本身或配置为使用该 waypoint 的 Service。

您可以将 L4 或 L7 策略附加到 waypoint proxy,以基于身份执行策略。当 waypoint 成为流量路径的一部分后,目标 ZTunnel 会根据 waypoint 的身份识别流量。

配置 mTLS 模式的 Istio peer authentication 策略由 ZTunnel 提供支持。在 ambient 模式下,将模式设置为 DISABLE 的策略会被忽略,因为 ZTunnel 和 HBONE 始终强制执行 mTLS。有关详细信息,请参阅对等身份验证(Istio 文档)。

先决条件

  • 由具有 cluster-admin 角色的集群管理员建立的活动 ACP CLI (kubectl) 会话。
  • Istio 已部署在 ambient 模式下。
  • 已部署 Bookinfo 示例应用(用于以下示例)。
  • 已部署 waypoint proxy(用于以下示例)。

使用 waypoint proxy 路由流量

部署 waypoint proxy 后,您可以在 Bookinfo reviews Service 的不同版本之间拆分流量,以进行功能测试或 A/B 测试。

操作步骤

  1. 创建流量路由配置。将以下内容保存为 traffic-route.yaml

    apiVersion: gateway.networking.k8s.io/v1
    kind: HTTPRoute
    metadata:
      name: reviews
      namespace: bookinfo
    spec:
      parentRefs:
        - group: ""
          kind: Service
          name: reviews
          port: 9080
      rules:
        - backendRefs:
            - name: reviews-v1
              port: 9080
              weight: 80
            - name: reviews-v2
              port: 9080
              weight: 20
  2. 应用流量路由配置:

    kubectl apply -f traffic-route.yaml

验证

ratings pod 内访问 productpage Service:

kubectl exec "$(kubectl get pod -l app=ratings -n bookinfo -o jsonpath='{.items[0].metadata.name}')" \
  -c ratings -n bookinfo \
  -- bash -lc '\
     for i in {0..19}; do \
       curl -sS productpage:9080/productpage | grep -om1 "reviews-v[12]"; \
     done'

大多数响应(80%)将包含 reviews-v1 输出,而较少一部分响应(20%)将包含 reviews-v2 输出。

示例输出
reviews-v1
reviews-v2
reviews-v1
reviews-v1
reviews-v1
reviews-v2
reviews-v1
reviews-v1
reviews-v1
reviews-v1
reviews-v1
reviews-v1
reviews-v1
reviews-v1
reviews-v1
reviews-v1
reviews-v1
reviews-v2
reviews-v1
reviews-v1

清理路由配置

kubectl delete -n bookinfo httproute reviews

添加授权策略

使用 L7 授权策略,明确允许 curl 服务向 productpage 服务发送 GET 请求,同时阻止所有其他操作。

操作步骤

  1. 创建授权策略。将以下内容保存为 authorization-policy.yaml

    apiVersion: security.istio.io/v1
    kind: AuthorizationPolicy
    metadata:
      name: productpage-waypoint
      namespace: bookinfo
    spec:
      targetRefs:
        - kind: Service
          group: ""
          name: productpage
      action: ALLOW
      rules:
        - from:
            - source:
                principals:
                  - cluster.local/ns/curl/sa/curl
          to:
            - operation:
                methods: ["GET"]
    1. targetRefs 字段指定 waypoint proxy 的授权策略所针对的服务。
  2. 应用授权策略:

    kubectl apply -f authorization-policy.yaml

验证

  1. 为 curl 客户端创建 namespace:

    kubectl create namespace curl
    kubectl label namespace curl pod-security.kubernetes.io/enforce=restricted --overwrite
  2. 部署 curl 客户端:

    kubectl apply -n curl -f https://raw.githubusercontent.com/alauda-mesh/istio/refs/heads/istio-1.30/samples/curl/curl.yaml
  3. istio-discovery=enabled 标签添加到 curl namespace:

    kubectl label namespace curl istio-discovery=enabled
  4. curl namespace 启用 ambient 模式:

    kubectl label namespace curl istio.io/dataplane-mode=ambient
  5. 验证向 productpage 服务发送 GET 请求能够成功,并收到 HTTP 200 响应:

    kubectl -n curl exec deploy/curl -- sh -c '\
      curl -s -o /dev/null -w "HTTP %{http_code}\n" \
        -X GET \
        http://productpage.bookinfo.svc.cluster.local:9080/productpage'

    预期输出

    HTTP 200
  6. 验证向同一服务发送 POST 请求会被拒绝,并收到 HTTP 403 响应:

    kubectl -n curl exec deploy/curl -- sh -c '\
      curl -s -o /dev/null -w "HTTP %{http_code}\n" \
        -X POST \
        http://productpage.bookinfo.svc.cluster.local:9080/productpage'

    预期输出

    HTTP 403
  7. 验证来自其他服务的 GET 请求(例如来自 bookinfo namespace 中的 ratings pod)也会被拒绝,并收到 RBAC: access denied

    kubectl exec "$(kubectl get pod -l app=ratings -n bookinfo \
      -o jsonpath='{.items[0].metadata.name}')" \
      -c ratings -n bookinfo \
      -- curl -X GET -sS productpage:9080/productpage

    预期输出

    RBAC: access denied

清理验证资源

# Remove the authorization policy
kubectl delete -n bookinfo authorizationpolicy productpage-waypoint --ignore-not-found
# Remove the namespace from the ambient data plane
kubectl label namespace curl istio.io/dataplane-mode-
# Remove the Curl deployment and namespace
kubectl delete -n curl -f https://raw.githubusercontent.com/alauda-mesh/istio/refs/heads/istio-1.30/samples/curl/curl.yaml --ignore-not-found
kubectl delete namespace curl --ignore-not-found

其他资源