Waypoint proxies

一旦部署了 ZTunnel 代理,就可以引入 waypoint 代理以启用高级的第7层处理能力。

Ambient 模式将 Istio 的功能解耦为两个独立层次:

  • 由 ZTunnel 代理管理的安全 L4 覆盖层
  • 由可选的 waypoint 代理管理的L7 层

waypoint 代理是基于 Envoy 的代理,负责为运行在 ambient 模式下的工作负载执行 L7 处理。它作为特定资源(如命名空间、服务或 Pod)的网关,可以独立于其所服务的应用进行安装、升级和扩展。配置依赖于 Kubernetes Gateway API

与每个工作负载都运行自己的 Envoy 代理的 sidecar 模型不同,waypoint 代理通过为共享相同安全边界的多个工作负载(例如同一命名空间内的所有工作负载)提供服务,从而减少资源消耗。

目标 waypoint 通过充当网关来执行策略:所有发往某个资源(如命名空间、服务或 Pod)的入站流量都必须先经过 waypoint,之后才到达目标。

ZTunnel 节点代理负责 L4 功能,包括 mTLS 加密、L4 流量处理和遥测。ZTunnel 与 waypoint 代理通过 HBONE(基于 HTTP 的覆盖网络)协议通信,该协议通过 HTTP/2 CONNECT 隧道流量,并在端口 15008 上使用 mTLS。

如果您的工作负载需要以下任何 L7 功能,建议部署 waypoint 代理:

  • 流量管理 — 高级 HTTP 路由、负载均衡、断路器、速率限制、故障注入、重试和超时
  • 安全 — 基于请求类型或 HTTP 头等 L7 属性的授权策略
  • 可观测性 — 应用流量的 HTTP 指标、访问日志和追踪

部署 waypoint 代理

您可以在 Bookinfo 应用的命名空间中部署 waypoint 代理,将流量路由通过 Istio ambient 数据平面,并执行 L7 策略。

前提条件

  • 已安装 Alauda Service Mesh Operator 2.1.1 或更高版本。
  • 由具有 cluster-admin 角色的集群管理员开启的有效 ACP CLI (kubectl) 会话。
  • 本地已安装 istioctl,以便运行以下操作指令。
  • Istio 已部署为 ambient 模式。
  • 已部署 Bookinfo 示例应用(用于以下示例)。
  • 目标命名空间已应用标签 istio.io/dataplane-mode=ambient

操作步骤

  1. bookinfo 命名空间中创建 waypoint 代理。将以下内容保存为 waypoint.yaml

    apiVersion: gateway.networking.k8s.io/v1
    kind: Gateway
    metadata:
      labels:
        istio.io/waypoint-for: service
      name: waypoint
      namespace: bookinfo
    spec:
      gatewayClassName: istio-waypoint
      listeners:
        - name: mesh
          port: 15008
          protocol: HBONE
    1. istio.io/waypoint-for: service 标签表示该 waypoint 处理服务的流量。标签值决定处理的流量类型。详情请参见 Waypoint traffic types(Istio 文档)。
  2. 应用 waypoint 自定义资源(CR):

    kubectl apply -f waypoint.yaml
  3. bookinfo 命名空间注册为使用该 waypoint:

    kubectl label namespace bookinfo istio.io/use-waypoint=waypoint

    注册命名空间后,ambient 数据平面中任何 Pod 发往 bookinfo 服务的请求都会通过 waypoint 进行 L7 处理和策略执行。

验证

确认 waypoint 代理已关联到 bookinfo 命名空间中的所有服务:

istioctl -n ztunnel ztunnel-config services

示例输出

NAMESPACE    SERVICE NAME   SERVICE VIP  WAYPOINT ENDPOINTS
bookinfo     details        10.4.21.11   waypoint 1/1
bookinfo     details-v1     10.4.84.241  waypoint 1/1
bookinfo     productpage    10.4.192.245 waypoint 1/1
bookinfo     productpage-v1 10.4.35.101  waypoint 1/1
bookinfo     ratings        10.4.203.217 waypoint 1/1
bookinfo     ratings-v1     10.4.156.208 waypoint 1/1
bookinfo     reviews        10.4.188.144 waypoint 3/3
bookinfo     reviews-v1     10.4.247.94  waypoint 1/1
bookinfo     reviews-v2     10.4.147.169 waypoint 1/1
bookinfo     reviews-v3     10.4.203.165 waypoint 1/1
bookinfo     waypoint       10.4.15.65   None     1/1
istio-system istiod         10.4.110.96  None     1/1
NOTE

您也可以通过为特定服务或 Pod 添加标签,仅配置它们使用 waypoint。当显式注册 Pod 时,还需在对应的 gateway 资源上添加 istio.io/waypoint-for: workload 标签。

启用跨命名空间 waypoint 使用

跨命名空间 waypoint 允许一个命名空间中的资源通过部署在另一个命名空间的 waypoint 路由流量。

操作步骤

  1. common-infrastructure 命名空间添加标签 istio-discovery=enabled

    kubectl label namespace common-infrastructure istio-discovery=enabled
  2. 创建一个 Gateway 资源,允许 bookinfo 命名空间中的工作负载使用 common-infrastructure 命名空间中的 waypoint。将以下内容保存为 waypoint-common.yaml

    apiVersion: gateway.networking.k8s.io/v1
    kind: Gateway
    metadata:
      name: waypoint-common
      namespace: common-infrastructure
    spec:
      gatewayClassName: istio-waypoint
      listeners:
        - name: mesh
          port: 15008
          protocol: HBONE
          allowedRoutes:
            namespaces:
              from: Selector
              selector:
                matchLabels:
                  kubernetes.io/metadata.name: bookinfo
  3. 应用跨命名空间 waypoint:

    kubectl apply -f waypoint-common.yaml
  4. 添加使用跨命名空间 waypoint 所需的标签:

    • 指定 waypoint 所在的命名空间:

      kubectl label namespace bookinfo istio.io/use-waypoint-namespace=common-infrastructure
    • 指定要使用的 waypoint:

      kubectl label namespace bookinfo istio.io/use-waypoint=waypoint-common

其他资源