配置 waypoint 代理

waypoint 代理是基于 Envoy 代理的可选部署,用于将 Layer 7(L7)处理添加到一组定义的工作负载中。

waypoint 代理的安装、升级和扩缩独立于应用;应用所有者不会感知到它们的存在。 与每个工作负载并行运行 Envoy 代理实例的 Sidecar 数据平面模式相比, 所需的代理数量可以大大减少。

一个或一组 waypoint 可以在具有相似安全边界的应用之间共享。 这可能是特定工作负载的所有实例,或者命名空间中的所有工作负载。

Sidecar 模式相比,在 Ambient 模式下, 策略由目标 waypoint 强制执行。在许多方面,waypoint 充当资源(命名空间、服务或 Pod)的网关。 Istio 强制所有进入资源的流量都经过 waypoint,然后 waypoint 强制执行该资源的所有策略。

您需要 waypoint 代理吗?

Ambient 的分层方法允许用户以更细致的递进方式采用 Istio, 从无网格平滑过渡到安全的 L4 覆盖,再到完整的 L7 处理。

Ambient 模式的大部分功能都是由 ztunnel 节点代理提供的。 ztunnel 的范围仅限于处理 Layer 4(L4)的流量,因此它可以作为共享组件安全地运行。

当您配置重定向到某个 waypoint 时,流量将由 ztunnel 转发到该 waypoint。 如果您的应用需要以下任一 L7 网格功能,您将需要使用 waypoint 代理:

  • 流量管理:HTTP 路由和负载均衡、熔断、限流、故障注入、重试、超时
  • 安全性:基于请求类型或 HTTP 头等 L7 原装特性的丰富授权策略
  • 可观察性:HTTP 指标、访问日志、链路追踪

部署 waypoint 代理

waypoint 代理是使用 Kubernetes Gateway 资源部署的。

请注意,Kubernetes Gateway API CRD 不会默认安装在大多数 Kubernetes 集群上, 因此请确保在使用 Gateway API 之前已安装好这些 CRD:

$ kubectl get crd gateways.gateway.networking.k8s.io &> /dev/null || \
  { kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.2.0/standard-install.yaml; }

您可以使用 istioctl waypoint 子命令来生成、应用或列出这些资源。

部署 waypoint 后,整个命名空间(或您选择的任何服务或 Pod)必须先进行注册才能使用。

您在为特定命名空间部署 waypoint 代理之前, 请先确认该命名空间带有 istio.io/dataplane-mode: ambient 标签:

$ kubectl get ns -L istio.io/dataplane-mode
NAME              STATUS   AGE   DATAPLANE-MODE
istio-system      Active   24h
default           Active   24h   ambient

istioctl 可以为 waypoint 代理生成 Kubernetes Gateway 资源。 例如,要为 default 命名空间生成名为 waypoint 的 waypoint 代理,该代理可以处理命名空间中这些服务的流量:

$ istioctl waypoint generate --for service -n default
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  labels:
    istio.io/waypoint-for: service
  name: waypoint
  namespace: default
spec:
  gatewayClassName: istio-waypoint
  listeners:
  - name: mesh
    port: 15008
    protocol: HBONE

请注意,Gateway 资源具有设置为 gatewayClassNameistio-waypoint 标签, 这表明它是 Istio 所提供的 waypoint。Gateway 资源标有 istio.io/waypoint-for: service, 表示该 waypoint 默认可以处理这些服务的流量。

要直接部署 waypoint 代理,请使用 apply 代替 generate

$ istioctl waypoint apply -n default
waypoint default/waypoint applied

或者,您可以部署生成的 Gateway 资源:

$ kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  labels:
    istio.io/waypoint-for: service
  name: waypoint
  namespace: default
spec:
  gatewayClassName: istio-waypoint
  listeners:
  - name: mesh
    port: 15008
    protocol: HBONE
EOF

当 Gateway 资源被应用后,istiod 会监控资源, 自动为用户部署和管理相应的 waypoint Deployment 和服务。

waypoint 流量类型

默认情况下,waypoint 仅处理发往其命名空间中服务的流量。 做出这种选择是因为单独指向 Pod 的流量很少, 并且通常被用于 Prometheus 抓取等内部目的, 而且通过 L7 处理会产生额外开销,这是预期之外的开销。

waypoint 也可以处理所有流量,仅处理直接发送到集群中工作负载(Pod 或 VM)的流量, 或者根本不处理任何流量。被重定向到 waypoint 的流量类型由 Gateway 对象上的 istio.io/waypoint-for 标签决定。

使用 istioctl waypoint apply--for 参数来更改可以重定向到 waypoint 的流量类型:

waypoint-for原始目标地类型
serviceKubernetes 服务
workloadPod IP 或 VM IP
all服务和工作负载流量
none无流量(用于测试)

waypoint 的选择基于流量最初发送到的目标类型, 即 serviceworkload。如果流量发送到没有 waypoint 的服务, waypoint 不会被转移:即使它最终到达的工作负载确实存在一个附加的 waypoint。

使用 waypoint 代理

当 waypoint 代理被部署后,除非您显式配置某些资源来使用它,否则它默认不会被任何资源使用。

要使命名空间、服务或 Pod 能够使用 waypoint, 请添加 istio.io/use-waypoint 标签,取值为 waypoint 名称。

如果您使用 istioctl 部署命名空间的 waypoint, 则可以使用 --enroll-namespace 参数自动标记一个命名空间:

$ istioctl waypoint apply -n default --enroll-namespace
waypoint default/waypoint applied
namespace default labeled with "istio.io/use-waypoint: waypoint"

或者,您可以使用 kubectlistio.io/use-waypoint: waypoint 标签添加到 default 命名空间:

$ kubectl label ns default istio.io/use-waypoint=waypoint
namespace/default labeled

当一个命名空间被注册为使用 waypoint 后,使用 Ambient 数据平面模式的任何 Pod 向该命名空间中运行的任何服务发出的所有请求都将通过 waypoint 进行路由,以进行 L7 处理和策略执行。

如果您喜欢更精细的操作粒度,而不是对整个命名空间使用 waypoint, 则可以仅注册特定服务或 Pod 来使用 waypoint。如果您只需要命名空间中的某些服务具有 L7 功能, 如果您只想将 WasmPlugin 之类的扩展应用于特定服务,或者如果您正在通过其 Pod IP 地址调用 Kubernetes 无头服务, 这可能很有用。

配置服务以使用特定 waypoint

使用示例 Bookinfo 应用中的服务, 我们可以为 reviews 服务部署一个名为 reviews-svc-waypoint 的 waypoint:

$ istioctl waypoint apply -n default --name reviews-svc-waypoint
waypoint default/reviews-svc-waypoint applied

reviews 服务打标签以使用 reviews-svc-waypoint waypoint:

$ kubectl label service reviews istio.io/use-waypoint=reviews-svc-waypoint
service/reviews labeled

从网格中的 Pod 到 reviews 服务的所有请求现在都将通过 reviews-svc-waypoint waypoint 进行路由。

配置 Pod 以使用特定 waypoint

reviews-v2 Pod 部署一个名为 reviews-v2-pod-waypoint 的 waypoint。

$ istioctl waypoint apply -n default --name reviews-v2-pod-waypoint --for workload
waypoint default/reviews-v2-pod-waypoint applied

reviews-v2 Pod 打标签以使用 reviews-v2-pod-waypoint waypoint:

$ kubectl label pod -l version=v2,app=reviews istio.io/use-waypoint=reviews-v2-pod-waypoint
pod/reviews-v2-5b667bcbf8-spnnh labeled

从 Ambient 网格中的 Pod 到 reviews-v2 Pod IP 的所有请求现在都将通过 reviews-v2-pod-waypoint waypoint 进行路由,以进行 L7 处理和策略执行。

跨命名空间使用 waypoint

开箱即用,waypoint 代理可供同一命名空间内的资源使用。 从 Istio 1.23 开始,可以在不同的命名空间中使用 waypoint。 在本节中,我们将研究启用跨命名空间使用所需的网关配置,以及如何配置资源以使用来自不同命名空间的 waypoint。

配置一个用于跨命名空间使用的 waypoint

为了能够跨命名空间使用 waypoint, 应将 Gateway 配置为允许来自其他命名空间的路由

以下 Gateway 将允许名为 cross-namespace-waypoint-consumer 的命名空间中的资源使用此 egress-gateway

kind: Gateway
metadata:
  name: egress-gateway
  namespace: common-infrastructure
spec:
  gatewayClassName: istio-waypoint
  listeners:
  - name: mesh
    port: 15008
    protocol: HBONE
    allowedRoutes:
      namespaces:
        from: Selector
        selector:
          matchLabels:
            kubernetes.io/metadata.name: cross-namespace-waypoint-consumer

配置资源以使用跨命名空间 waypoint 代理

默认情况下,Istio 控制平面将在与应用标签的资源相同的命名空间中查找使用 istio.io/use-waypoint 标签指定的 waypoint。可以通过添加新标签 istio.io/use-waypoint-namespace 来使用另一个命名空间中的 waypoint。 istio.io/use-waypoint-namespace 适用于所有支持 istio.io/use-waypoint 标签的资源。 这两个标签一起分别指定 waypoint 的名称和命名空间。例如,要配置名为 istio-siteServiceEntry 以使用名为 common-infrastructure 的命名空间中名为 egress-gateway 的 waypoint,可以使用以下命令:

$ kubectl label serviceentries.networking.istio.io istio-site istio.io/use-waypoint=egress-gateway
serviceentries.networking.istio.io/istio-site labeled
$ kubectl label serviceentries.networking.istio.io istio-site istio.io/use-waypoint-namespace=common-infrastructure
serviceentries.networking.istio.io/istio-site labeled

清理

您可以通过执行以下操作从命名空间中删除所有 waypoint:

$ istioctl waypoint delete --all -n default
$ kubectl label ns default istio.io/use-waypoint-

删除 Kubernetes Gateway API CRD:

$ kubectl delete -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.2.0/standard-install.yaml
这些信息有用吗?
您是否有更多建议和改进意见?

感谢您的反馈!