搭建gloo閘道器(基於envoy)的wasm實驗環境(阿里雲、本機)
背景
WebAssembly是一種可以將多種語言編譯成目標位元組碼,並在相應的wasm虛擬機器中執行的技術。
在service mesh中,通常使用envoy作為proxy sidecar。而envoy是基於c++編寫,擴充套件和定製稍有不便。
藉助WebAssembly,我們可以利用其他語言比如AssemblyScript(ts),Rust等來編寫envoy的擴充套件(類似與用lua擴充套件nginx),並在envoy中執行。
目前envoy官方倉庫僅有wasm分支對wasm進行了實驗性支援,所以本文基於gloo(官方支援wasm的一個api閘道器)進行搭建。
環境介紹
ECS:阿里雲香港,2c4g,ubuntu20.04
本機:ubuntu18
搭建步驟
- docker
- minikube
- gloo
docker
參考:https://docs.docker.com/engine/install/ubuntu/
# 解除安裝原有docker安裝
$ sudo apt-get remove docker docker-engine docker.io containerd runc
$ sudo apt-get update
# 安裝必要依賴
$ sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
# 下載key
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# 驗證key
$ sudo apt-key fingerprint 0EBFCD88
# 新增倉庫
$ sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
# 更新源、安裝
$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io
# 驗證安裝
$ sudo docker run hello-world
minikube
先安裝kubectl
參考:https://kubernetes.io/docs/tasks/tools/install-kubectl/
由於google連不上,本機國內安裝參考:
https://zhuanlan.zhihu.com/p/38118017
https://www.cnblogs.com/dudu/p/12155869.html
$ sudo apt-get update && sudo apt-get install -y apt-transport-https gnupg2 curl
$ curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
$ echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list
$ sudo apt-get update
$ sudo apt-get install -y kubectl
再安裝minikube
參考:https://minikube.sigs.k8s.io/docs/start/#install-minikube
本機國內安裝參考:https://developer.aliyun.com/article/221687
# 下載安裝
$ curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
$ sudo install minikube-linux-amd64 /usr/local/bin/minikube
# 啟動(預設使用docker驅動)
$ minikube start
# 如果連線docker報錯(/var/run/docker.sock: connect: permission denied),可能是使用者許可權的問題:
$ sudo usermod -aG docker $USER
$ newgrp docker
$ sudo service docker restart
# 驗證
$ kubectl get po -A
gloo
gloo是一個基於envoy的api gateway,介紹及文件:https://docs.solo.io/gloo/latest/
# 安裝glooctl工具
$ curl -sL https://run.solo.io/gloo/install | sh
$ export PATH=$HOME/.gloo/bin:$PATH
$ glooctl version
# 安裝gloo的upstream示例程式petstore
$ kubectl apply -f https://raw.githubusercontent.com/solo-io/gloo/master/example/petstore/petstore.yaml
# 安裝gloo的wasm版本
$ glooctl install gateway --values <(echo '{"crds":{"create":true},"global":{"wasm":{"enabled":true}}}')
# 新增virtual service路由
$ cat <<EOF | kubectl apply -f-
apiVersion: gateway.solo.io/v1
kind: VirtualService
metadata:
name: default
namespace: gloo-system
spec:
virtualHost:
domains:
- '*'
routes:
- matchers:
- prefix: /
routeAction:
single:
upstream:
name: default-petstore-8080
namespace: gloo-system
EOF
# 驗證路由
$ curl -v $(glooctl proxy url)/api/pets
# 正常情況下輸出
* Trying 192.168.49.2:30277...
* TCP_NODELAY set
* Connected to 192.168.49.2 (192.168.49.2) port 30277 (#0)
> GET /api/pets HTTP/1.1
> Host: 192.168.49.2:30277
> User-Agent: curl/7.68.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< content-type: application/xml
< date: Fri, 16 Oct 2020 03:49:56 GMT
< content-length: 86
< x-envoy-upstream-service-time: 1
< server: envoy
<
[{"id":1,"name":"Dog","status":"available"},{"id":2,"name":"Cat","status":"pending"}]
編譯wasm示例:https://docs.solo.io/web-assembly-hub/latest/tutorial_code/getting_started/
# 安裝wasme工具
$ curl -sL https://run.solo.io/wasme/install | sh
$ export PATH=$HOME/.wasme/bin:$PATH
$ wasme --version
# 初始化wasm工程
$ wasme init ./new-filter
# 選擇語言
? What language do you wish to use for the filter:
cpp
▸ assemblyscript
? With which platforms do you wish to use the filter?:
▸ gloo:1.3.x, istio:1.5.x
# 編譯
$ wasme build assemblyscript -t webassemblyhub.io/$YOUR_USERNAME/add-header:v0.1 .
# 檢視本地編譯結果
$ wasme list
# 到webassemblyhub.io建立一個賬號
# 推送編譯結果到倉庫
$ wasme login -u $YOUR_USERNAME -p $YOUR_PASSWORD
$ wasme push webassemblyhub.io/$YOUR_USERNAME/add-header:v0.1
# 檢視推送結果
$ wasme list --search $YOUR_USERNAME
驗證結果,header中已包含外掛寫入的hello world
# 將wasm filter注入到gloo閘道器中
$ wasme deploy gloo webassemblyhub.io/$YOUR_USERNAME/add-header:v0.1 --id=add-header
# 再次訪問
$ curl -v $(glooctl proxy url)/api/pets
* Trying 192.168.49.2:30277...
* TCP_NODELAY set
* Connected to 192.168.49.2 (192.168.49.2) port 30277 (#0)
> GET /api/pets HTTP/1.1
> Host: 192.168.49.2:30277
> User-Agent: curl/7.68.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< content-type: application/xml
< date: Fri, 16 Oct 2020 03:49:56 GMT
< content-length: 86
< x-envoy-upstream-service-time: 1
< hello: world!
< server: envoy
<
[{"id":1,"name":"Dog","status":"available"},{"id":2,"name":"Cat","status":"pending"}]
相關參考:
編寫wasm外掛:https://docs.solo.io/web-assembly-hub/latest/tutorial_code/build_tutorials
部署wasm外掛:https://docs.solo.io/web-assembly-hub/latest/tutorial_code/deploy_tutorials
搭建istio環境:https://istio.io/latest/docs/setup/getting-started/#download
相關文章
- Envoy實現.NET架構的閘道器(二)基於控制平面的動態配置架構
- golang-wasm 環境搭建GolangASM
- CMake入門1/5:基於阿里雲ECS搭建體驗環境阿里
- Envoy實現.NET架構的閘道器(三)代理GRPC架構RPC
- RHEL9.4搭建虛擬機器實驗環境虛擬機
- Envoy實現.NET架構的閘道器(五)整合Redis實現限流架構Redis
- 阿里雲體驗實驗室 教你《快速搭建Docker環境》阿里Docker
- 阿里雲體驗實驗室教程《快速搭建LAMP環境》阿里LAMP
- 搭建基於netfilter/iptables的防火牆實驗環境(轉)Filter防火牆
- 基於邊緣計算閘道器的校園環境和能耗監測系統
- 閘道器 Spring-Cloud-Gateway 原始碼解析 —— 除錯環境搭建SpringCloudGateway原始碼除錯
- 阿里雲體驗實驗室 教你如何《快速搭建LNMP環境》阿里LNMP
- 阿里雲體驗實驗室 教你如何《搭建Hadoop環境》阿里Hadoop
- 體驗有禮:基於ECS快速搭建Docker環境Docker
- 基於Prometheus閘道器的監控完整實現參考Prometheus
- 阿里雲體驗實驗室 教程《搭建Java Web開發環境》阿里JavaWeb開發環境
- 基於docker 搭建redis環境—redis單機版DockerRedis
- 基於Docker搭建LNMP環境DockerLNMP
- 搭建Ansible實驗環境
- 基於雲原生閘道器的可觀測性最佳實踐
- 本機web開發環境的搭建--nginx篇Web開發環境Nginx
- OCM實驗-測試環境的搭建
- 面向未來的閘道器: Kubernetes Gateway API 和 Envoy GatewayGatewayAPI
- andriod環境搭建(Mac機器)Mac
- 基於Linux和IPSec的VPN閘道器Linux
- 基於ECS快速搭建Docker環境Docker
- 阿里雲體驗實驗室 教你《搭建Node.js程式設計環境》阿里Node.js程式設計
- 搭建基於 Mac 的 Flutter 開發環境MacFlutter開發環境
- 搭建基於以太坊的私有鏈環境
- 使用基於 WebRTC 的 JavaScript API 在瀏覽器環境裡呼叫本機攝像頭WebJavaScriptAPI瀏覽器
- Envoy實現.NET架構的閘道器(一)靜態配置與檔案動態配置架構
- scikit-learn 和pandas 基於windows單機機器學習環境的搭建Windows機器學習
- 基於ubuntu如何搭建TensorFlow環境Ubuntu
- 基於Webpack搭建React開發環境WebReact開發環境
- K8s 閘道器選型初判:Nginx 還是 Envoy?K8SNginx
- eBay 基於 Apache Kyuubi 構建統一 Serverless Spark 閘道器的實踐ApacheServerSpark
- 基於IDEA的JavaWeb開發環境搭建IdeaJavaWeb開發環境
- PC基於Linux的叢集環境搭建?Linux