How AI is applied across API Evangelist and APIs.io. Read my AI disclosure →
API Evangelist API Evangelist
Discovery
Learnings
Guidance
Toolbox
Alignment
API Evangelist LLC

Blog: MoE 系列 [三] - 使用 Istio 动态更新 Go 扩展配置

calendar_today March 16, 2023 person domain mosn

上一篇 我们用 Go 扩展实现了 basic auth,体验了 Go 扩展从 Envoy 接受配置。 只所以这么设计,是想复用 Envoy 原有的 xDS 配置推送通道,这不,今天我们就来体验一番,云原生的配置变更。 前提准备 这次我们需要一套 k8s 环境,如果你手头没有,推荐使用 kind 安装一套。具体安装方式,这里就不展开了。 安装 Istio 我们直接安装最新版的 Istio: # 下载最新版的 istioctl $ export ISTIO_VERSION=1.18.0-alpha.0 $ curl -L https://istio.io/downloadIstio | sh -

将 istioctl 加入 PATH

$ cd istio-$ISTIO_VERSION/ $ export PATH=$PATH:$(pwd)/bin

安装,包括 istiod 和 ingressgateway

$ istioctl install 是的,由于 Go 扩展已经贡献给了上游官方,Istiod(pilot)和 ingressgateway 都已经默认开启了 Go 扩展,并不需要重新编译。 Istio 配置 Ingress 我们先用 Istio 完成标准的 Ingress 场景配置,具体可以看 istio 的官方文档 配置好了之后,简单测试一下: $ curl -s -I -HHost:httpbin.example.com “http://$INGRESS_HOST:$INGRESS_PORT/status/200” HTTP/1.1 200 OK server: istio-envoy date: Fri, 10 Mar 2023 15:49:37 GMT 基本的 Ingress 已经跑起来了。 挂载 Golang so 之前我们介绍过,Go 扩展是单独编译为 so 文件的,所以,我们需要把 so 文件,挂载到 ingressgateway 中。 这里我们把上次 basic auth 编译出来的 libgolang.so,通过本地文件挂载进来。简单点搞,直接 edit deployment 加了这些配置: # 申明一个 hostPath 的 volume volumes : - name : golang-so-basic-auth hostPath : path : /data/golang-so/example-basic-auth/libgolang.so type : File # 挂载进来 volumeMounts : - mountPath : /etc/golang/basic-auth.so name : golang-so-basic-auth readOnly : true 开启 Basic auth 认证 Istio 提供了 EnvoyFilter CRD,所以,用 Istio 来配置 Go 扩展也比较的方便,apply 这段配置,basic auth 就开启了。 apiVersion : networking.istio.io/v1alpha3 kind : EnvoyFilter metadata : name : golang-filter namespace : istio-system spec : configPatches : # The first patch adds the lua filter to the listener/http connection manager - applyTo : HTTP_FILTER match : context : GATEWAY listener : filterChain : filter : name : “envoy.filters.network.http_connection_manager” subFilter : name : “envoy.filters.http.router” patch : operation : INSERT_BEFORE value : # golang filter specification name : envoy.filters.http.golang typed_config : “@type”: “type.googleapis.com/envoy.extensions.filters.http.golang.v3alpha.Config” library_id : example library_path : /etc/golang/basic-auth.so plugin_name : basic-auth plugin_config : “@type”: “type.googleapis.com/xds.type.v3.TypedStruct” type_url : typexx value : username : foo password : bar 虽然有点长,但是,也很明显,配置的用户名密码还是: foo:bar 测试 我们测试一下: $ curl -s -I -HHost:httpbin.example.com “http:// $INGRESS_HOST : $INGRESS_PORT /status/200” HTTP/1.1 401 Unauthorized # valid foo:bar $ curl -s -I -HHost:httpbin.example.com “http:// $INGRESS_HOST : $INGRESS_PORT /status/200” -H ‘Authorization: basic Zm9vOmJhcg==’ HTTP/1.1 200 OK 符合预期。 接下来,我们改一下 EnvoyFilter 中的密码,重新 apply,再测试一下: # foo:bar not match the new password $ curl -s -I -HHost:httpbin.example.com “http:// $INGRESS_HOST : $INGRESS_PORT /status/200” -H ‘Authorization: basic Zm9vOmJhcg==’ HTTP/1.1 401 Unauthorized 此时的 Envoy 并不需要重启,新的配置就立即生效了,云原生的体验就是这么溜~ 总结 因为 Go 扩展可以利用 Envoy 原有的 xDS 来接受配置,所以,从 Istio 推送配置也变得很顺利。 不过呢,Istio 提供的 EnvoyFilter CRD 在使用上,其实并不是那么方便 & 自然,后面我们找机会试试 EnvoyGateway,看看 k8s Gateway API 的体验咋样。 至此,我们已经体验了整个 Envoy Go 的开发 & 使用流程,在云原生时代,人均 Golang 的背景下,相信可以很好的完成网关场景的各种定制需求。 下一篇,我们将介绍,如何在 Go 扩展中使用异步协程。这意味着,我们可以使用的是一个全功能的 Go 语言,而不是像 Go Wasm 那样,只能用阉割版的。 敬请期待 ~

open_in_new Read original post