Waypoint 代理

部署 ZTunnel 代理后,可以引入 waypoint 代理以启用高级 Layer 7 处理能力。

Ambient 模式将 Istio 的功能解耦为两个不同的层:

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

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

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

目标 waypoint 通过充当网关来强制实施策略:所有发往命名空间、服务或 pod 等资源的入站流量,都会先经过 waypoint,然后才到达目标。

ZTunnel 节点代理负责 mTLS 加密、L4 流量处理和遥测等 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. istio-waypoint gateway class overlay 添加到 Istio 资源,以便 waypoint pod 能够被准入 Restricted bookinfo 命名空间:

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

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

  2. 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 文档)。
  3. 应用 waypoint 自定义资源(CR):

    kubectl apply -f waypoint.yaml
  4. 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 添加标签,仅配置特定服务或 pod 使用 waypoint。显式让 pod 加入时,还需将 istio.io/waypoint-for: workload 标签添加到对应的 gateway 资源。

启用跨命名空间 waypoint 使用

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

操作步骤

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

    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

其他资源