Ambient 模式下的第7层功能

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

AuthorizationPolicy 资源在 sidecar 和 ambient 模式下均可生效。在 ambient 模式中,授权策略可以针对 ZTunnel 执行,也可以附加到 waypoint 以实现 waypoint 执行。要将策略附加到 waypoint,请包含一个 targetRef,该引用指向 waypoint 本身或配置为使用该 waypoint 的 Service。

您可以将第4层或第7层策略附加到 waypoint 代理,以实现基于身份的执行。一旦 waypoint 成为流量路径的一部分,目标 ZTunnel 会通过 waypoint 的身份识别流量。

Istio 的 peer authentication 策略(用于配置 mTLS 模式)由 ZTunnel 支持。在 ambient 模式下,将模式设置为 DISABLE 的策略会被忽略,因为 ZTunnel 和 HBONE 始终强制执行 mTLS。详情请参见 Peer authentication(Istio 文档)。

前提条件

  • 由具有 cluster-admin 角色的集群管理员开启的有效 ACP CLI (kubectl) 会话。
  • Istio 已部署为 ambient 模式。
  • 已部署 Bookinfo 示例应用(用于以下示例)。
  • 已部署 waypoint 代理(用于以下示例)。

使用 waypoint 代理进行流量路由

部署 waypoint 代理后,您可以在 Bookinfo 的 reviews 服务的不同版本之间拆分流量,用于功能测试或 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 服务:

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

添加授权策略

使用第7层授权策略,显式允许 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 代理服务。
  2. 应用授权策略:

    kubectl apply -f authorization-policy.yaml

验证

  1. 创建 curl 客户端的命名空间:

    kubectl create namespace curl
  2. 部署 curl 客户端:

    kubectl apply -n curl -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/curl/curl.yaml
  3. curl 命名空间添加 istio-discovery=enabled 标签:

    kubectl label namespace curl istio-discovery=enabled
  4. curl 命名空间启用 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. 验证来自其他服务(例如 bookinfo 命名空间中的 ratings pod)的 GET 请求也被拒绝,返回 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

清理验证资源

# 删除授权策略
kubectl delete -n bookinfo authorizationpolicy productpage-waypoint
# 移除 curl 命名空间的 ambient 数据平面标签
kubectl label namespace curl istio.io/dataplane-mode-
# 删除 Curl 部署和命名空间
kubectl delete -n curl -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/curl/curl.yaml
kubectl delete namespace curl

其他资源