配置中继代理

**中继代理**是基于 Envoy 的代理的可选部署,用于向一组定义的工作负载添加第 7 层 (L7) 处理。

航点代理与应用程序的安装、升级和扩展相互独立;应用程序所有者应该不知道它们的存在。与作为辅助进程的 数据平面 模式相比,该模式运行 Envoy 代理的每个工作负载实例,所需的代理数量可以大幅减少。

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

辅助进程 模式相反,在环境模式下,策略由**目标**航点执行。在许多方面,航点充当资源(命名空间、服务或 Pod)的网关。Istio 强制所有进入资源的流量都必须通过航点,然后航点执行该资源的所有策略。

您需要中继代理吗?

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

环境模式的大多数功能都由 ztunnel 节点代理提供。Ztunnel 的范围仅限于处理第 4 层 (L4) 的流量,以便它可以安全地作为共享组件运行。

当您将流量重定向到航点时,流量将由 ztunnel 转发到该航点。如果您的应用程序需要以下任何 L7 网格功能,则需要使用航点代理

  • 流量管理:HTTP 路由和负载均衡、断路器、速率限制、故障注入、重试、超时
  • 安全:基于 L7 原语(如请求类型或 HTTP 标头)的丰富授权策略
  • 可观测性:HTTP 指标、访问日志、跟踪

部署中继代理

航点代理使用 Kubernetes 网关资源进行部署。

请注意,Kubernetes 网关 API CRD 在大多数 Kubernetes 集群上默认情况下未安装,因此请确保在使用网关 API 之前已安装它们。

$ 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 子命令来生成、应用或列出这些资源。

部署航点后,必须将整个命名空间(或您选择的任何服务或 Pod)注册才能使用它。

在为特定命名空间部署航点代理之前,请确认命名空间是否已标记为 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 可以为航点代理生成 Kubernetes 网关资源。例如,要为 default 命名空间生成一个名为 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

请注意,网关资源已将 istio-waypoint 标签设置为 gatewayClassName,这表示它是 Istio 提供的航点。网关资源已标记为 istio.io/waypoint-for: service,表示航点可以处理服务的流量,这是默认设置。

要直接部署航点代理,请使用 apply 而不是 generate

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

或者,您可以部署生成的网关资源

$ 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

应用网关资源后,Istiod 将监视该资源,并自动为用户部署和管理相应的航点部署和服务。

中继点流量类型

默认情况下,航点仅处理其命名空间中服务的目标流量。做出此选择是因为仅针对 Pod 的流量很少见,并且通常用于内部目的(例如 Prometheus 刮取),并且可能不希望使用 L7 处理的额外开销。

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

使用 --for 参数与 istioctl waypoint apply 结合使用,可以更改可以重定向到航点的流量类型。

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

航点选择基于流量最初发送到的目标类型(serviceworkload)进行。如果流量发送到没有航点的服务,则不会经过航点:即使它最终到达的工作负载确实有附加的航点。

使用中继代理

部署航点代理后,在您明确配置这些资源以使用它之前,它不会被任何资源使用。

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

如果您使用 istioctl 部署命名空间航点,则可以使用 --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

在命名空间注册使用航点后,来自使用环境数据平面模式的任何 Pod 到该命名空间中运行的任何服务的任何请求都将通过航点路由以进行 L7 处理和策略执行。

如果您希望比使用整个命名空间的航点更细粒度,则可以仅注册特定服务或 Pod 以使用航点。如果您只需要命名空间中某些服务的 L7 功能,或者只希望将 WasmPlugin 等扩展应用于特定服务,或者如果您正在通过其 Pod IP 地址调用 Kubernetes 无头服务,这可能很有用。

配置服务以使用特定中继点

使用示例 bookinfo 应用程序 中的服务,我们可以为 reviews 服务部署一个名为 reviews-svc-waypoint 的航点。

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

标记 reviews 服务以使用 reviews-svc-waypoint 航点。

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

网格中 Pod 到 reviews 服务的任何请求现在都将通过 reviews-svc-waypoint 航点路由。

配置 Pod 以使用特定中继点

reviews-v2 Pod 部署一个名为 reviews-v2-pod-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 航点。

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

网格中 Pod 到 reviews-v2 Pod IP 的任何请求现在都将通过 reviews-v2-pod-waypoint 航点路由以进行 L7 处理和策略执行。

跨命名空间中继点使用

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

配置中继点以进行跨命名空间使用

为了启用航点的跨命名空间使用,应将 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

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

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

$ 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

清理

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

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

删除 Kubernetes 网关 API CRD。

$ kubectl delete -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.2.0/standard-install.yaml
这些信息对您有用吗?
您对改进有什么建议?

感谢您的反馈!