Knative实战部署Serverless服务
目前最火的ChatGpt,据说微软在2019年向OpenAI投资了约10亿美元的现金和云代金券,让团队购买微软云进行训练。在CloudNative的时代背景下,Serverless这种云原生开发模型,让开发者不需要关注服务器底层的部署,只需要编写功能函数。下面我们介绍如何使用Knative部署一个属于自己的Serverless服务集群。Knative服务安装
Knative本质上是在K8s上的一个容器管理服务。在K8s集群中能轻松运行无服务器容器,Knative负责网络的自动扩缩容,而且可以通过knativefunc插件支持构建多种编程语言容器。目前支持的编程语言或框架如下,当然用户能自己扩展函数模板。
Language
Format
Go
CloudEvents
Go
HTTP
Node。js
CloudEvents
Node。js
HTTP
Python
CloudEvents
Python
HTTP
Quarkus
CloudEvents
Quarkus
HTTP
Rust
CloudEvents
Rust
HTTP
Springboot
CloudEvents
Springboot
HTTP
TypeScript
CloudEvents
TypeScript
HTTP
根据官网的介绍,使用Knative需要先安装一些软件,而且至少需要3核内存3GB的机器。安装Kind,Kind可以很方便的一键式创建一个k8s集群。curlLo。kindhttps:kind。sigs。k8s。iodlv0。17。0kindlinuxamd64chmodx。kindsudomv。kindusrlocalbinkind安装kubectl,顾名思义这个工具是k8s客户端管理工具。curlLOhttps:dl。k8s。io(curlLshttps:dl。k8s。ioreleasestable。txt)binlinuxamd64kubectl。sha256chmodxkubectlsudomv。kubectlusrlocalbinkind安装knativeclient插件,knative命令式客户端;wgethttps:github。comknativeclientreleasesdownloadknativev1。9。0knlinuxamd64mvknlinuxamd64knchmodx。knsudomv。knusrlocalbin安装knativequickstart插件,一键创建k8s集群并部署knative服务的工具,注意我写文档时候最新版version1。9。0是有问题的因此只能先下载v1。8。1
wgethttps:github。comknativesandboxknpluginquickstartreleasesdownloadknativev1。8。1knquickstartlinuxamd64mvknquickstartlinuxamd64knquickstartchmodx。knquickstartsudomv。knquickstartusrlocalbin
安装完这些我们已经可以部署一个knative的集群了,启动后通过kindgetclusters能看到对应集knative群说明服务正常。knquickstartkindkindgetclusters
下面我们来安装构建serverless函数的插件knfunc,用户新建函数,构建函数镜像和镜像部署到对应的仓库,knative服务可以从镜像仓库拉取对应的镜像启动服务。wgetgethttps:github。comknativefuncreleasesdownloadknativev1。9。0funclinuxamd64mvfunclinuxamd64knfuncsudomv。knfuncusrlocalbinknfuncversion
创建Serverless函数
至此我们安装软件的准备工作已经完成,下面我们开始创建函数。例如我们在cloudfuns文件夹下创建一个go的函数mkdircloudfunscdcloudfunsknfunccreatelgohellogo
go函数主要内容见链接https:github。comknativefuncblobmaintemplatesgohttphandle。go
构建Serveless镜像建过程中需要依赖Google镜像https:gcr。iopaketobuildpacksbuilder:base因为众所周知的网络隔离,我们无法使用Google的镜像,网络上说的改本地镜像名的方法也不靠谱。最终我折腾了好久解决了这个问题。。。。。。Registryforfunctionimages:填docker仓库地址(用于镜像部署),如果没有仓库可以暂时随便填个字符串,不影响以下流程。cloudfunscdhellogoknfuncbuild
本地校验函数,可以看到服务运行在8080端口knfuncrun
另一个终端执行curlhttp:127。0。0。1:8080?hello1能收到返回值如下,符合刚刚我们创建的函数的返回值,说明serverless函数运行成功。GET?hello1HTTP1。1127。0。0。1:8080UserAgent:curl7。68。0Accept:
镜像部署,部署成功后能在镜像仓库中看到对应的镜像。knfuncdeploy
使用Knative服务
上一步我们将镜像部署到仓库的同时,也部署在了本地knative集群中,访问地址是http:hellogo。default。127。0。0。1。sslip。ioknservicelistcurlhttp:hellogo。default。127。0。0。1。sslip。io?hello1
knservicehelp可以查看完成的命令使用说明:
部署knativeservice
这次我们使用远程镜像gcr。ioknativesampleshelloworldgo进行部署。knservicecreatehello1imagegcr。ioknativesampleshelloworldgoport8080envTARGETWorld
自动扩缩容knservicelistkubectlgetpodlserving。knative。devservicehello1w另一个终端执行curlhttp:hello1。default。127。0。0。1。sslip。io
流量治理
每次更新服务都会产生一个服务快照,可以通过流量配置指定新旧版本之间的流量。latest表示最新版,knserviceupdatehello1envTARGETKnativecurlhttp:hello1。default。127。0。0。1。sslip。ioknrevisionslist
可以看到流量现在100都在函数hello100002,接下来我们设置两个函数各占50流量。knserviceupdatehello1traffichello10000150trafficlatest50knrevisionslist