MoE 系列(三)|使用 Istio 动态更新 Go 扩展配置
上一篇我们用 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)和 Ingress Gateway 都已经默认开启了 Go 扩展,并不需要重新编译。
Istio 配置 Ingress
我们先用 Istio 完成标准的 Ingress 场景配置,具体可以看 Istio 的官方文档[1]。
配置好了之后,简单测试一下:
$ curl -s -I -HHost:httpbin.example.com "http://$INGRESS_HOST:$INGRESS_PORT/status/200"HTTP/1.1 200 OKserver: istio-envoydate: Fri, 10 Mar 2023 15:49:37 GMT
基本的 Ingress 已经跑起来了。
挂载 Golang so
之前我们介绍过,Go 扩展是单独编译为 so 文件的,所以,我们需要把 so 文件,挂载到 Ingress Gateway 中。
这里我们把上次 Basic Auth 编译出来的 libgolang.so,通过本地文件挂载进来。简单点搞,直接 edit deployment 加了这些配置:
# 申明一个 hostPath 的 volumevolumes:- 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/v1alpha3kind: EnvoyFiltermetadata: name: golang-filter namespace: istio-systemspec: 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 在使用上,其实并不是那么方便和自然,后面我们找机会试试 Envoy Gateway,看看 K8s Gateway API 的体验如何。
至此,我们已经体验了整个 Envoy Go 的开发&使用流程,在云原生时代,人均 Golang 的背景下,相信可以很好的完成网关场景的各种定制需求。
下一篇,我们将介绍,如何在 Go 扩展中使用异步协程。这意味着,我们可以使用的是一个全功能的 Go 语言,而不是像 Go Wasm 那样,只能用阉割版的。
敬请期待:MoE 系列(四)|Go 扩展的异步模式
[1]Istio 的官方文档:
https://istio.io/latest/docs/tasks/traffic-management/ingress/ingress-control/

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Netty服务端开发及性能优化 | 京东云技术团队
作者:京东物流 王奕龙 Netty是一个异步基于事件驱动的高性能网络通信框架,可以看做是对NIO和BIO的封装,并提供了简单易用的API、Handler和工具类等,用以快速开发高性能、高可靠性的网络服务端和客户端程序。 1. 创建服务端 服务端启动需要创建ServerBootstrap对象,并完成初始化线程模型,配置IO模型和添加业务处理逻辑(Handler) 。在添加业务处理逻辑时,调用的是childHandler()方法添加了一个ChannelInitializer,代码示例如下 // 负责服务端的启动 ServerBootstrap serverBootstrap = new ServerBootstrap(); // 以下两个对象可以看做是两个线程组 // boss线程组负责监听端口,接受新的连接 NioEventLoopGroup boss = new NioEventLoopGroup(); // worker线程组负责读取数据 NioEventLoopGroup worker = new NioEventLoopGroup(); // 配置线程组并指...
- 下一篇
Flutter 如何将代码显示到界面上
前言 如何优雅的将项目中的代码,亦或是你的demo代码展示到界面上?本文对使用简单、便于维护且通用的解决方案,进行相关的对比和探究 为了节省大家的时间,把最终解决方案的相关接入和用法写在前面 预览代码 快速开始 接入:pub,github dependencies: code_preview: ^0.1.5 用法:CodePreview,提供需要预览的className,可自动匹配该类对应的代码文件 本来想把写法简化成传入对象,但是因为一些原因无奈放弃,改成了className 具体可以参考下面Flutter Web中的问题模块的说明 import 'package:code_preview/code_preview.dart'; import 'package:flutter/material.dart'; class Test extends StatelessWidget { const Test({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return const C...
相关文章
文章评论
共有0条评论来说两句吧...