使用 WebAssembly 插件扩展中继点

Istio 提供了 使用 WebAssembly (Wasm) 扩展其功能 的能力。Wasm 可扩展性的主要优势之一是扩展可以在运行时动态加载。本文档概述了如何在 Istio 中使用 Wasm 功能扩展 Ambient 模式。在 Ambient 模式下,必须将 Wasm 配置应用于每个命名空间中部署的中继点代理。

开始之前

  1. 按照 Ambient 模式入门指南 中的说明设置 Istio。

  2. 部署 Bookinfo 示例应用程序

  3. 将默认命名空间添加到环境网格.

  4. 部署curl示例应用程序作为发送请求的测试源。

    压缩
    $ kubectl apply -f @samples/curl/curl.yaml@
    

在网关处

借助 Kubernetes Gateway API,Istio 提供了一个集中入口点来管理进入服务网格的流量。我们将配置网关级别的 WasmPlugin,确保通过网关的所有流量都受扩展身份验证规则的约束。

为网关配置 WebAssembly 插件

在此示例中,您将向网格添加一个 HTTP 基本身份验证模块。您将配置 Istio 从远程镜像注册表中提取基本身份验证模块并加载它。它将配置为在对/productpage的调用上运行。这些步骤类似于分发 WebAssembly 模块中的步骤,不同之处在于使用targetRefs字段而不是标签选择器。

要使用远程 Wasm 模块配置 WebAssembly 过滤器,请创建一个WasmPlugin资源,目标为bookinfo-gateway

$ kubectl get gateway
NAME               CLASS            ADDRESS                                            PROGRAMMED   AGE
bookinfo-gateway   istio            bookinfo-gateway-istio.default.svc.cluster.local   True         42m
$ kubectl apply -f - <<EOF
apiVersion: extensions.istio.io/v1alpha1
kind: WasmPlugin
metadata:
  name: basic-auth-at-gateway
spec:
  targetRefs:
    - kind: Gateway
      group: gateway.networking.k8s.io
      name: bookinfo-gateway # gateway name retrieved from previous step
  url: oci://ghcr.io/istio-ecosystem/wasm-extensions/basic_auth:1.12.0
  phase: AUTHN
  pluginConfig:
    basic_auth_rules:
      - prefix: "/productpage"
        request_methods:
          - "GET"
          - "POST"
        credentials:
          - "ok:test"
          - "YWRtaW4zOmFkbWluMw=="
EOF

一个 HTTP 过滤器将作为身份验证过滤器注入网关。Istio 代理将解释 WasmPlugin 配置,将远程 Wasm 模块从 OCI 镜像注册表下载到本地文件,并通过引用该文件将 HTTP 过滤器注入网关。

通过网关验证流量

  1. 测试未经身份验证的/productpage

    $ kubectl exec deploy/curl -- curl -s -w "%{http_code}" -o /dev/null "http://bookinfo-gateway-istio.default.svc.cluster.local/productpage"
    401
    
  2. 使用 WasmPlugin 资源中配置的凭据测试/productpage

    $ kubectl exec deploy/curl -- curl -s -o /dev/null -H "Authorization: Basic YWRtaW4zOmFkbWluMw==" -w "%{http_code}" "http://bookinfo-gateway-istio.default.svc.cluster.local/productpage"
    200
    

在中继点处,适用于命名空间中的所有服务

Waypoint 代理在 Istio 的环境模式中发挥着至关重要的作用,促进服务网格内安全高效的通信。下面,我们将探讨如何将 Wasm 配置应用于 waypoint,动态增强代理功能。

部署中继点代理

按照waypoint 部署说明在 bookinfo 命名空间中部署 waypoint 代理。

$ istioctl waypoint apply --enroll-namespace --wait

验证流量是否到达服务

$ kubectl exec deploy/curl -- curl -s -w "%{http_code}" -o /dev/null http://productpage:9080/productpage
200

为中继点配置 WebAssembly 插件

要使用远程 Wasm 模块配置 WebAssembly 过滤器,请创建一个WasmPlugin资源,目标为waypoint网关

$ kubectl get gateway
NAME               CLASS            ADDRESS                                            PROGRAMMED   AGE
bookinfo-gateway   istio            bookinfo-gateway-istio.default.svc.cluster.local   True         23h
waypoint           istio-waypoint   10.96.202.82                                       True         21h
$ kubectl apply -f - <<EOF
apiVersion: extensions.istio.io/v1alpha1
kind: WasmPlugin
metadata:
  name: basic-auth-at-waypoint
spec:
  targetRefs:
    - kind: Gateway
      group: gateway.networking.k8s.io
      name: waypoint # gateway name retrieved from previous step
  url: oci://ghcr.io/istio-ecosystem/wasm-extensions/basic_auth:1.12.0
  phase: AUTHN
  pluginConfig:
    basic_auth_rules:
      - prefix: "/productpage"
        request_methods:
          - "GET"
          - "POST"
        credentials:
          - "ok:test"
          - "YWRtaW4zOmFkbWluMw=="
EOF

查看已配置的插件

$ kubectl get wasmplugin
NAME                     AGE
basic-auth-at-gateway    28m
basic-auth-at-waypoint   14m

通过中继点代理验证流量

  1. 测试未经身份验证的内部/productpage

    $ kubectl exec deploy/curl -- curl -s -w "%{http_code}" -o /dev/null http://productpage:9080/productpage
    401
    
  2. 测试具有凭据的内部/productpage

    $ kubectl exec deploy/curl -- curl -s -w "%{http_code}" -o /dev/null -H "Authorization: Basic YWRtaW4zOmFkbWluMw==" http://productpage:9080/productpage
    200
    

在中继点处,针对特定服务

要为特定服务使用远程 Wasm 模块配置 WebAssembly 过滤器,请创建一个WasmPlugin资源,直接目标为特定服务。

创建一个WasmPlugin,目标为reviews服务,以便扩展程序仅应用于reviews服务。在此配置中,身份验证令牌和前缀专门针对 reviews 服务量身定制,确保只有指向它的请求才受此身份验证机制的约束。

$ kubectl apply -f - <<EOF
apiVersion: extensions.istio.io/v1alpha1
kind: WasmPlugin
metadata:
  name: basic-auth-for-service
spec:
  targetRefs:
    - kind: Service
      group: ""
      name: reviews
  url: oci://ghcr.io/istio-ecosystem/wasm-extensions/basic_auth:1.12.0
  phase: AUTHN
  pluginConfig:
    basic_auth_rules:
      - prefix: "/reviews"
        request_methods:
          - "GET"
          - "POST"
        credentials:
          - "ok:test"
          - "MXQtaW4zOmFkbWluMw=="
EOF

验证目标服务流量

  1. 使用在通用waypoint代理中配置的凭据测试内部/productpage

    $ kubectl exec deploy/curl -- curl -s -w "%{http_code}" -o /dev/null -H "Authorization: Basic YWRtaW4zOmFkbWluMw==" http://productpage:9080/productpage
    200
    
  2. 使用在特定reviews-svc-waypoint代理中配置的凭据测试内部/reviews

    $ kubectl exec deploy/curl -- curl -s -w "%{http_code}" -o /dev/null -H "Authorization: Basic MXQtaW4zOmFkbWluMw==" http://reviews:9080/reviews/1
    200
    
  3. 测试未经身份验证的内部/reviews

    $ kubectl exec deploy/curl -- curl -s -w "%{http_code}" -o /dev/null http://reviews:9080/reviews/1
    401
    

在未提供凭据的情况下执行提供的命令时,它会验证访问内部/productpage会导致 401 未授权响应,从而证明了在没有正确身份验证凭据的情况下无法访问资源的预期行为。

清理

  1. 删除 WasmPlugin 配置

    $ kubectl delete wasmplugin basic-auth-at-gateway basic-auth-at-waypoint basic-auth-for-service
    
  2. 按照环境模式卸载指南删除 Istio 和示例测试应用程序。

这些信息是否有用?
您是否有任何改进建议?

感谢您的反馈!