使用 WebAssembly 插件扩展中继点
Istio 提供了 使用 WebAssembly (Wasm) 扩展其功能 的能力。Wasm 可扩展性的主要优势之一是扩展可以在运行时动态加载。本文档概述了如何在 Istio 中使用 Wasm 功能扩展 Ambient 模式。在 Ambient 模式下,必须将 Wasm 配置应用于每个命名空间中部署的中继点代理。
开始之前
按照 Ambient 模式入门指南 中的说明设置 Istio。
部署 Bookinfo 示例应用程序。
部署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 过滤器注入网关。
通过网关验证流量
测试未经身份验证的
/productpage
$ kubectl exec deploy/curl -- curl -s -w "%{http_code}" -o /dev/null "http://bookinfo-gateway-istio.default.svc.cluster.local/productpage" 401
使用 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
通过中继点代理验证流量
测试未经身份验证的内部
/productpage
$ kubectl exec deploy/curl -- curl -s -w "%{http_code}" -o /dev/null http://productpage:9080/productpage 401
测试具有凭据的内部
/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
验证目标服务流量
使用在通用
waypoint
代理中配置的凭据测试内部/productpage
$ kubectl exec deploy/curl -- curl -s -w "%{http_code}" -o /dev/null -H "Authorization: Basic YWRtaW4zOmFkbWluMw==" http://productpage:9080/productpage 200
使用在特定
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
测试未经身份验证的内部
/reviews
$ kubectl exec deploy/curl -- curl -s -w "%{http_code}" -o /dev/null http://reviews:9080/reviews/1 401
在未提供凭据的情况下执行提供的命令时,它会验证访问内部/productpage
会导致 401 未授权响应,从而证明了在没有正确身份验证凭据的情况下无法访问资源的预期行为。
清理
删除 WasmPlugin 配置
$ kubectl delete wasmplugin basic-auth-at-gateway basic-auth-at-waypoint basic-auth-for-service
按照环境模式卸载指南删除 Istio 和示例测试应用程序。